diff --git a/.dockerignore b/.dockerignore index ffd7c45ec38f19a047a0c727f5bf2460a0911052..834924b9f79d8075aca055984a1203b00d788280 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,5 @@ doc -target +**target* .idea/ Dockerfile .dockerignore diff --git a/.gitattributes b/.gitattributes index 9a0309f9e5ba5ecc5de180cffece11f609a65384..9bd26362b0e878091caf184509be782b6b6b6c9c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -Cargo.lock linguist-generated=true -diff +Cargo.lock linguist-generated=true diff --git a/.gitignore b/.gitignore index d9ba8ac2b411f21befe040b38e08732c5ead9d28..28885a4830d9b9c6d35ca9885b283d52799b8e6d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ nohup.out rls*.log *.orig *.rej +**/wip/*.stderr diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3068547966f4e0b5aef675ff16e603e918c03b40..abab05f74e4e7de31d20e065d6cb3fb913015cc7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,14 +10,16 @@ stages: - test - build - publish - - deploy + - kubernetes + - flaming-fir -image: parity/rust-substrate-build:stretch +image: parity/rust-builder:latest variables: GIT_STRATEGY: fetch + CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}" + SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache" CI_SERVER_NAME: "GitLab CI" - CARGO_HOME: "/ci-cache/substrate/cargo/${CI_JOB_NAME}" DOCKER_OS: "debian:stretch" ARCH: "x86_64" @@ -51,6 +53,18 @@ check-runtime: script: - ./scripts/gitlab/check_runtime.sh + +check-line-width: + stage: test + image: parity/tools:latest + <<: *kubernetes-build + only: + - /^[0-9]+$/ + script: + - ./scripts/gitlab/check_line_width.sh + allow_failure: false + + test-linux-stable: &test stage: test variables: @@ -77,6 +91,33 @@ test-linux-stable: &test - time cargo test --all --release --verbose --locked - sccache -s +check-web-wasm: + stage: test + allow_failure: true + only: + - master + - /^[0-9]+$/ + script: + # WASM support is in progress. As more and more crates support WASM, we + # should add entries here. See https://github.com/paritytech/substrate/issues/2416 + - time cargo web build -p sr-io + - time cargo web build -p sr-primitives + - time cargo web build -p sr-std + - time cargo web build -p substrate-consensus-common + - time cargo web build -p substrate-keyring + - time cargo web build -p substrate-keystore + - time cargo web build -p substrate-executor + - time cargo web build -p substrate-network-libp2p + - time cargo web build -p substrate-panic-handler + - time cargo web build -p substrate-peerset + - time cargo web build -p substrate-primitives + - time cargo web build -p substrate-serializer + - time cargo web build -p substrate-state-db + - time cargo web build -p substrate-state-machine + - time cargo web build -p substrate-trie + tags: + - linux-docker + .build-only: &build-only only: - master @@ -127,8 +168,10 @@ build-rust-doc-release: &build <<: *build-only tags: - linux-docker - script: + before_script: - sccache -s + - ./scripts/build.sh + script: - rm -f ./crate-docs/index.html # use it as an indicator if the job succeeds - time cargo +nightly doc --release --verbose - cp -R ./target/doc ./crate-docs @@ -167,7 +210,11 @@ publish-docker-release: - echo "Substrate version = ${VERSION}" - test -z "${VERSION}" && exit 1 - cd ./artifacts - - docker build --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:latest . + - docker build + --build-arg VCS_REF="${CI_COMMIT_SHORT_SHA}" + --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + --tag $CONTAINER_IMAGE:$VERSION + --tag $CONTAINER_IMAGE:latest . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest after_script: @@ -197,6 +244,7 @@ publish-s3-release: publish-s3-doc: stage: publish + image: parity/awscli:latest allow_failure: true dependencies: - build-rust-doc-release @@ -219,10 +267,10 @@ publish-s3-doc: --human-readable --summarize .deploy-template: &deploy - stage: deploy + stage: kubernetes when: manual retry: 1 - image: parity/kubectl-helm:$HELM_VERSION + image: parity/kubetools:latest <<: *build-only tags: # this is the runner that is used to deploy it @@ -286,3 +334,29 @@ deploy-ue1-tag: environment: name: parity-prod-ue1 +.validator-deploy: &validator-deploy + stage: flaming-fir + dependencies: + - build-linux-release + image: parity/azure-ansible:v1 + allow_failure: true + when: manual + tags: + - linux-docker + +validator1: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator1 +validator2: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator2 +validator3: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator3 +validator4: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator4 diff --git a/Cargo.lock b/Cargo.lock index 6a5da685893f5ab65849b4620bb9dc314dab6087..5347186c37d847e813982aeb475dbaff7b7c065c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,7 +5,7 @@ name = "MacTypes-sys" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -15,7 +15,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -41,10 +41,10 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -55,8 +55,8 @@ dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -65,7 +65,7 @@ name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -105,8 +105,8 @@ name = "asn1_der_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -119,9 +119,9 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -131,15 +131,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -148,7 +148,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -189,22 +189,23 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.43.2" +version = "0.47.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cexpr 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "which 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -248,10 +249,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -267,7 +268,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -278,6 +279,19 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bstr" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bumpalo" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byte-tools" version = "0.2.0" @@ -300,13 +314,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bytes" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "c_linked_list" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cast" version = "0.2.2" @@ -322,10 +341,10 @@ dependencies = [ [[package]] name = "cexpr" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -333,6 +352,16 @@ name = "cfg-if" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chain-spec-builder" +version = "2.0.0" +dependencies = [ + "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-cli 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", +] + [[package]] name = "chrono" version = "0.4.6" @@ -349,7 +378,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -403,7 +432,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -411,36 +440,38 @@ name = "core-foundation-sys" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion-plot" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -459,7 +490,7 @@ dependencies = [ "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -469,7 +500,7 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -490,6 +521,15 @@ dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-deque" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-epoch" version = "0.3.1" @@ -517,6 +557,14 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-queue" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-utils" version = "0.2.2" @@ -564,10 +612,12 @@ dependencies = [ [[package]] name = "csv" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -576,12 +626,21 @@ name = "csv-core" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ctor" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ctr" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -590,11 +649,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.1" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -608,14 +667,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.0.3" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -623,6 +682,17 @@ name = "data-encoding" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "derive_more" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "difference" version = "2.0.0" @@ -664,7 +734,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -672,7 +742,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -685,13 +755,13 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -700,21 +770,29 @@ name = "environmental" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "erased-serde" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "error-chain" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "exit-future" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -722,7 +800,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -731,9 +809,9 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -747,31 +825,31 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "finality-grandpa" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -797,9 +875,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fork-tree" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -808,9 +886,9 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -843,7 +921,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -868,38 +946,63 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "get_if_addrs" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "get_if_addrs-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "glob" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "globset" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "h2" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -909,7 +1012,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -934,7 +1037,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -952,21 +1055,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hex-literal" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hex-literal-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hmac" version = "0.4.2" @@ -998,10 +1118,10 @@ dependencies = [ [[package]] name = "http" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1029,7 +1149,7 @@ dependencies = [ "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1039,26 +1159,27 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.23" +version = "0.12.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1078,7 +1199,7 @@ name = "impl-codec" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1110,7 +1231,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1119,7 +1240,7 @@ name = "itertools" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1128,60 +1249,54 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "jsonrpc-core" -version = "11.0.0" +name = "js-sys" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "jsonrpc-core-client" -version = "11.0.0" +name = "jsonrpc-core" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-derive" -version = "11.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-http-server" -version = "11.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.12.23 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" -version = "11.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1189,31 +1304,32 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" -version = "11.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "globset 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-ws-server" -version = "11.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1223,11 +1339,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "keccak-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1268,9 +1384,9 @@ dependencies = [ "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1291,7 +1407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.48" +version = "0.2.51" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1300,356 +1416,374 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-identify" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-noise" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "snow 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-uds" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-websocket" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "websocket 0.22.2 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "websocket 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-yamux" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "librocksdb-sys" -version = "5.14.3" +version = "5.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bindgen 0.43.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1711,11 +1845,6 @@ dependencies = [ "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "make-cmd" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "matches" version = "0.1.8" @@ -1723,11 +1852,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memchr" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1752,13 +1880,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1780,7 +1907,7 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1805,7 +1932,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1825,12 +1952,12 @@ name = "multistream-select" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1848,15 +1975,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", + "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1865,204 +1992,186 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "nix" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-cli" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "node-executor 1.0.0", - "node-primitives 1.0.0", - "node-runtime 1.0.0", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-basic-authorship 1.0.0", - "substrate-cli 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura 1.0.0", - "substrate-finality-grandpa 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keystore 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-service-test 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "node-executor 2.0.0", + "node-primitives 2.0.0", + "node-runtime 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-basic-authorship 2.0.0", + "substrate-cli 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura 2.0.0", + "substrate-finality-grandpa 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keystore 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-service-test 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "node-primitives 1.0.0", - "node-runtime 1.0.0", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-contract 1.0.0", - "srml-grandpa 1.0.0", - "srml-indices 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "srml-treasury 1.0.0", - "substrate-executor 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "node-primitives 2.0.0", + "node-runtime 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-contract 2.0.0", + "srml-grandpa 2.0.0", + "srml-indices 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "srml-treasury 2.0.0", + "substrate-executor 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", -] - -[[package]] -name = "node-rpc-client" -version = "1.0.0" -dependencies = [ - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.23 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 1.0.0", - "substrate-rpc 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", ] [[package]] name = "node-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 1.0.0", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-primitives 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-contract 1.0.0", - "srml-council 1.0.0", - "srml-democracy 1.0.0", - "srml-executive 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-grandpa 1.0.0", - "srml-indices 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "srml-treasury 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-contract 2.0.0", + "srml-council 2.0.0", + "srml-democracy 2.0.0", + "srml-executive 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-grandpa 2.0.0", + "srml-indices 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "srml-treasury 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-template" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "node-template-runtime 1.0.0", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-template-runtime 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "substrate-basic-authorship 1.0.0", - "substrate-cli 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "substrate-basic-authorship 2.0.0", + "substrate-cli 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "node-template-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-executive 1.0.0", - "srml-indices 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-executive 2.0.0", + "srml-indices 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2077,10 +2186,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "nom" -version = "4.2.0" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2099,12 +2208,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num_cpus" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "numtoa" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ole32-sys" version = "0.2.0" @@ -2129,15 +2243,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.16" +version = "0.10.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2147,15 +2261,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.40" +version = "0.9.43" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "output_vt100" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "owning_ref" version = "0.3.3" @@ -2179,7 +2302,7 @@ source = "git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7 [[package]] name = "parity-codec" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2193,46 +2316,36 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parity-crypto" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2245,13 +2358,30 @@ dependencies = [ ] [[package]] -name = "parking_lot" -version = "0.5.5" +name = "parity-ws" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", -] + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "parking_lot" @@ -2276,10 +2406,10 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2287,11 +2417,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2299,31 +2429,31 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2360,12 +2490,23 @@ dependencies = [ "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "pretty_assertions" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ctor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "primitive-types" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2389,12 +2530,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2404,15 +2545,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro2" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2420,7 +2553,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.3.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2445,18 +2578,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quote" -version = "0.5.2" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quote" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2464,7 +2589,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2474,10 +2599,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2487,9 +2612,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2498,16 +2623,16 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2553,31 +2678,31 @@ name = "rand_jitter" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_os" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_pcg" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2603,7 +2728,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2614,8 +2739,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2628,7 +2753,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2636,7 +2761,7 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2646,19 +2771,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.1.0" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2669,7 +2794,7 @@ name = "remove_dir_all" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2680,7 +2805,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2691,10 +2816,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2702,25 +2827,23 @@ name = "rocksdb" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "librocksdb-sys 5.14.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "librocksdb-sys 5.17.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "rust-crypto" -version = "0.2.36" +name = "rpassword" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2728,11 +2851,6 @@ name = "rustc-hex" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "rustc_version" version = "0.2.3" @@ -2746,9 +2864,9 @@ name = "rw-stream-sink" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2779,28 +2897,28 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "schnorrkel" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2808,15 +2926,6 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "secp256k1" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "security-framework" version = "0.2.2" @@ -2824,7 +2933,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2835,7 +2944,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2851,24 +2960,32 @@ name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "send_wrapper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "serde_derive" version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.38" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2876,6 +2993,17 @@ dependencies = [ "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sha1" version = "0.6.0" @@ -2898,7 +3026,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2909,7 +3037,7 @@ name = "sha3" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2934,6 +3062,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "slog" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "slog-async" @@ -2951,8 +3082,9 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2967,16 +3099,23 @@ dependencies = [ ] [[package]] -name = "smallvec" -version = "0.6.8" +name = "slog_derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "smallvec" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "snow" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2986,10 +3125,16 @@ dependencies = [ "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sourcefile" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "spin" version = "0.5.0" @@ -2997,483 +3142,488 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-client 1.0.0", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-client 2.0.0", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-assets" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", +] + +[[package]] +name = "srml-babe" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-contract" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-sandbox 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-sandbox 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-primitives 2.0.0", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-council" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-democracy 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-democracy 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-democracy" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-example" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-indices 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-indices 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-finality-tracker" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-grandpa" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-finality-grandpa-primitives 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-session" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-support-procedural 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "substrate-inherents 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-test" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "srml-support 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "srml-support 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-treasury" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -3493,14 +3643,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "stdweb" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3508,31 +3659,31 @@ name = "stdweb-derive" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "stdweb-internal-macros" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "stdweb-internal-runtime" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3555,22 +3706,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3584,651 +3735,695 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "subkey" -version = "1.0.0" +version = "2.0.0" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-primitives 2.0.0", + "node-runtime 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "substrate-primitives 1.0.0", - "tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "substrate-primitives 2.0.0", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "node-cli 1.0.0", + "node-cli 2.0.0", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-basic-authorship" -version = "1.0.0" +version = "2.0.0" dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-pool 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-pool 2.0.0", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#080da45923885cfec2379cef3dee4e7f43e6c260" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-cli" -version = "1.0.0" +version = "2.0.0" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-client 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network 0.1.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "sysinfo 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-client 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "sysinfo 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "substrate-trie 1.0.0", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-client-db" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-db 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-client 1.0.0", - "substrate-trie 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-db 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-client 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-aura-slots 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-consensus-slots 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] -name = "substrate-consensus-aura-slots" -version = "1.0.0" +name = "substrate-consensus-authorities" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] -name = "substrate-consensus-authorities" -version = "1.0.0" +name = "substrate-consensus-babe" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "srml-babe 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-consensus-slots 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-consensus-babe-primitives" +version = "2.0.0" +dependencies = [ + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-slots 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-rhd" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rhododendron 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-consensus-slots" +version = "2.0.0" +dependencies = [ + "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-finality-grandpa" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "finality-grandpa 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fork-tree 1.0.0", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "finality-grandpa 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fork-tree 2.0.0", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "srml-finality-tracker 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-finality-grandpa-primitives 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "srml-finality-tracker 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-finality-grandpa-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-keystore" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-primitives 2.0.0", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-network" -version = "0.1.0" +version = "2.0.0" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "fork-tree 1.0.0", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fork-tree 2.0.0", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-keyring 1.0.0", - "substrate-network-libp2p 1.0.0", - "substrate-peerset 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-keyring 2.0.0", + "substrate-network-libp2p 2.0.0", + "substrate-peerset 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-network-libp2p" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-peerset 1.0.0", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-peerset 2.0.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-offchain" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-inherents 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-peerset" -version = "1.0.0" +version = "2.0.0" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "substrate-serializer 1.0.0", - "tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "substrate-serializer 2.0.0", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-rpc" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core-client 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-client 1.0.0", - "substrate-test-runtime 1.0.0", - "substrate-transaction-pool 1.0.0", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-version 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-client 2.0.0", + "substrate-test-runtime 2.0.0", + "substrate-transaction-pool 2.0.0", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-rpc-servers" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "jsonrpc-http-server 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-ws-server 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-http-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-ws-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-rpc 1.0.0", + "sr-primitives 2.0.0", + "substrate-rpc 2.0.0", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-service" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-executor 2.0.0", + "node-primitives 2.0.0", + "node-runtime 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-client-db 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keystore 1.0.0", - "substrate-network 0.1.0", - "substrate-offchain 0.1.0", - "substrate-primitives 1.0.0", - "substrate-rpc-servers 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-pool 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-client-db 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-finality-grandpa 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keystore 2.0.0", + "substrate-network 2.0.0", + "substrate-offchain 2.0.0", + "substrate-primitives 2.0.0", + "substrate-rpc-servers 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-pool 2.0.0", "target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-service-test" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-network 0.1.0", - "substrate-primitives 1.0.0", - "substrate-service 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-network 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-state-db" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4238,102 +4433,100 @@ dependencies = [ [[package]] name = "substrate-test-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-client-db 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-test-runtime 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-client-db 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-test-runtime 2.0.0", ] [[package]] name = "substrate-test-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-executive 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "substrate-trie 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-executive 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-transaction-graph" -version = "1.0.0" +version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-runtime 1.0.0", + "sr-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-runtime 2.0.0", ] [[package]] name = "substrate-transaction-pool" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "substrate-client 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-test-client 1.0.0", - "substrate-transaction-graph 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-transaction-graph 2.0.0", ] [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "trie-bench 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4343,16 +4536,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.26" +version = "0.15.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4361,21 +4554,21 @@ name = "synstructure" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sysinfo" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4399,15 +4592,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4420,11 +4613,12 @@ dependencies = [ [[package]] name = "termion" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4449,14 +4643,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tiny-bip39" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4482,7 +4676,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4492,29 +4686,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.15" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-fs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4524,18 +4719,18 @@ name = "tokio-codec" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-current-thread" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4546,12 +4741,12 @@ dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4560,27 +4755,27 @@ dependencies = [ [[package]] name = "tokio-fs" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-io" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-reactor" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4588,18 +4783,20 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.1" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4608,29 +4805,28 @@ name = "tokio-tcp" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4641,7 +4837,7 @@ dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4651,7 +4847,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4659,13 +4863,13 @@ name = "tokio-udp" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4673,16 +4877,16 @@ name = "tokio-uds" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4693,6 +4897,14 @@ dependencies = [ "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "toml" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "traitobject" version = "0.1.0" @@ -4700,17 +4912,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trie-bench" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4735,12 +4947,12 @@ dependencies = [ [[package]] name = "trie-standardmap" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4748,6 +4960,19 @@ name = "try-lock" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "trybuild" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "twofish" version = "0.2.0" @@ -4760,7 +4985,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4802,7 +5027,7 @@ dependencies = [ [[package]] name = "unicase" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4821,7 +5046,7 @@ name = "unicode-normalization" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4839,20 +5064,12 @@ name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "unsigned-varint" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4913,7 +5130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4933,7 +5150,7 @@ version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4947,42 +5164,158 @@ dependencies = [ "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "wasm-bindgen-webidl" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasmi-validation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "web-sys" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "websocket" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "weedle" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "which" -version = "1.0.5" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4992,7 +5325,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5014,7 +5347,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5027,7 +5360,7 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5037,35 +5370,18 @@ version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -5077,11 +5393,11 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5097,10 +5413,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5108,7 +5424,7 @@ dependencies = [ "quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5116,12 +5432,30 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] "checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" @@ -5132,31 +5466,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5" +"checksum backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f106c02a3604afcdc0df5d36cc47b44b55917dbaf3d808f71c163a0ddba64637" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" -"checksum bindgen 0.43.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d52d263eacd15d26cbcf215d254b410bd58212aaa2d3c453a04b2d3b3adcf41" +"checksum bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df683a55b54b41d5ea8ebfaebb5aa7e6b84e3f3006a78f010dadc9ca88469260" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" +"checksum bstr 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6c8203ca06c502958719dae5f653a79e0cc6ba808ed02beffbf27d09610f2143" +"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" -"checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa" +"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +"checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" "checksum cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "389803e36973d242e7fecb092b2de44a3d35ac62524b3b9339e51d577d668e02" -"checksum cexpr 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "644d693ecfa91955ed32dcc7eda4914e1be97a641fb6f0645a37348e20b230da" +"checksum cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7fa24eb00d5ffab90eaeaf1092ac85c04c64aaf358ea6f84505b8116d24c6af" "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ef0c1bcf2e99c649104bd7a7012d8f8802684400e03db0ec0af48583c6fa0e4" @@ -5167,45 +5504,50 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" "checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" -"checksum criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "1c6e5ee5b9652d4f851418c448af105642e1f99e9a2741a8ff45c0d2c911b1e0" -"checksum criterion-plot 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4107e4a5abb94267e0149922b8ff49dc70a87cc202820fdbfc0d3e1edbdc4b16" +"checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" +"checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" +"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" "checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" +"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -"checksum csv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd1c44c58078cfbeaf11fbb3eac9ae5534c23004ed770cc4bfb48e658ae4f04" +"checksum csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9044e25afb0924b5a5fc5511689b0918629e85d68ea591e5e87fbf1e85ea1b3b" "checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65" -"checksum ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "044f882973b245404e90c90e7e42e8ee8d7a64edfd7adf83d684fb97e8e2c1b6" -"checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" +"checksum ctor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3b4c17619643c1252b5f690084b82639dd7fac141c57c8e77a00e0148132092c" +"checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" +"checksum ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5531b7f0698d9220b4729f8811931dbe0e91a05be2f7b3245fdc50dd856bae26" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dae47cc3529cdab597dbc8b606e565707209b506e55848f3c15679214a56c956" +"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" +"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" "checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" -"checksum env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afb070faf94c85d17d50ca44f6ad076bce18ae92f0037d350947240a36e9d42e" +"checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" +"checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" -"checksum exit-future 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "87559b08e99a81a92bbb867d237543e43495857749f688e0773390a20d56c61c" +"checksum exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d8013f441e38e31c670e7f34ec8f1d5d3a2bd9d303c1ff83976ca886005e8f48" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" -"checksum finality-grandpa 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c9da35679ad45649e32e6344a08a36e71ba5f5305ba02d18c34d262c49ce0072" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum finality-grandpa 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5cdd9ef7c48777665dacc9657c272778121d4d09848100bcc2bd9c773c6cf837" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" @@ -5218,26 +5560,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" +"checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" +"checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" -"checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" -"checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" +"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +"checksum globset 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef4feaabe24a0a658fd9cf4a9acf6ed284f045c77df0f49020ba3245cfb7b454" +"checksum h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "85ab6286db06040ddefb71641b50017c06874614001a134b423783e2db2920bd" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae0e5c30fb65e661a0e39860e37100dfbe4d39aff865e9357a6a4ed0b5bbf303" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c3da68162fdd2147e66682e78e729bd77f93b4c99656db058c5782d8c6b6225a" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" +"checksum hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06095d08c7c05760f11a071b3e1d4c5b723761c01bd8d7201c30a9536668a612" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" -"checksum http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "df0caae6b71d266b91b4a83111a61d2b94ed2e2bea024c532b933dcff867e58c" -"checksum hyper 0.12.23 (registry+https://github.com/rust-lang/crates.io-index)" = "860faf61a9957c9cb0e23e69f1c8290e92f6eb660fcdd1f2d6777043a2ae1a46" +"checksum hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4f2777434f26af6e4ce4fdcdccd3bed9d861d11e87bcbe72c0f51ddaca8ff848" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" @@ -5247,15 +5594,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum jsonrpc-core 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97b83fdc5e0218128d0d270f2f2e7a5ea716f3240c8518a58bc89e6716ba8581" -"checksum jsonrpc-core-client 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c889ca27072f038496a62f38356e8f827acf194d7276030120265362b2974eab" -"checksum jsonrpc-derive 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c0f9e66003001239cdf9f930ee764d8fc67a1b58c10f7221d8c354f83816816" -"checksum jsonrpc-http-server 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541257be6c8f75a41812575150dfa1120d3ee3a852601f2ca8ac9bcb73575c4e" -"checksum jsonrpc-pubsub 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c233c4570183a45f7bde14cd7d23446d6c236de6df9442e53a60951adae9fd34" -"checksum jsonrpc-server-utils 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3372b3248a53abcca8f61924f188052bb0c4cd80b482b2b4eaf9f8667efb9f4" -"checksum jsonrpc-ws-server 11.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e72d8f524c7afd11d9c71614d1f814ee1c46377869933ce42d559d6973922f79" +"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc15eef5f8b6bef5ac5f7440a957ff95d036e2f98706947741bfc93d1976db4c" +"checksum jsonrpc-derive 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c2dae61ca8a3b047fb11309b00661bc56837085bd07e46f907b9c562c0b03e68" +"checksum jsonrpc-http-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11d2a00824306155b8ef57fe957f31b8cd8ad24262f15cf911d84dcf9a3f206d" +"checksum jsonrpc-pubsub 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37fce55133ee264d0ab42bd862efcd45ae1d062cda599f4cc12ccc4be3195f2a" +"checksum jsonrpc-server-utils 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9527f01ef25f251d64082cbefc0c6d6f367349afe6848ef908a674e06b2bdd3" +"checksum jsonrpc-ws-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3889012aa638a2f18eb1a879f46fc8b34e7e1423cbff3247cd1531de0d51084b" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" -"checksum keccak-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a02fb74dc1b613522069b5f2023c014756ce121c6c6fb39364c139b0efc39a2d" +"checksum keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "af672553b2abac1c86c29fd62c79880638b6abc91d96db4aa42a5baab2bc1ca9" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" @@ -5263,27 +5610,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047" +"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" -"checksum libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5b9cd37b1ca54fa2fd0bbf0486adf2f55f8994f2be9410b65265050b24709b2" -"checksum libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf9c56e6f04cb649fdeb806e963d2da223e3ed17748d9e924fdb836c09f76307" -"checksum libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "debea88a3d5de9fdaf7082bd6d238f2c4c6a0420f14bdf9e1c1083b3e7c69286" -"checksum libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350d0018af3668d954f61ce7311e7d64ab7c40f19a8eb895e4750efe24c3455f" -"checksum libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfbcf36cc58ad5d0252d8ebe9c1a87190693fe2cdbe40fb01d8046779f9a75ad" -"checksum libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82e98435973e958d7dea3f5074d7fca53d0dfce2e1ac6924119a21c2991fe443" -"checksum libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92bb0153418eaf0ea549008d1e22748a956c9c36af9374fbe7189d44607c14be" -"checksum libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc915d0cde68a05d26a0dcb125eddce7dd2a425e97c5172ac300c1ee8716f55a" -"checksum libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "355bb370dd12809792dc020638b280e7aaf8625318018abd311c51affd0a612d" -"checksum libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e86291401f4a83f9fa81c03f8a7ccf0b03ce6aaa40cba058a7ec1026a65a6fe4" -"checksum libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3277f1f7eaadf5cdde6a76fb4afbf24e0eda6e2b04f288f526c6fa2e4293a6e" -"checksum libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4842a7ab54c12459b58b9e59cbeb03e3e1fd393fef48079472856f934352772" -"checksum libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32ba52ee76aaa94af533526ce5a22fbfcc69a560174fccee82f4cdb557411d33" -"checksum libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00f416e1e3d0214bd7df2be2b6be8ef61771d44292b973c9e02bfbbd7f62fe46" -"checksum libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af47af9997d69fc70aa13e6e7cd0d766614ebe74005e69e763221a64d9a0a5ef" -"checksum libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa72d81501aad6998d3b1b964f68f438ef99c3aaf54d921e144e0477fa87568" -"checksum libp2p-websocket 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "647bd8862afe6e912eb34b7614f731c0ff89e8777b57d9f2f5f0fd593ecc8d9a" -"checksum libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbb8d08cb536a964727e77b868a026c6d92993f08e387d49163565575a478d9" -"checksum librocksdb-sys 5.14.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b9024327233e7fac7982440f73301c00046d438c5b1011e8f4e394226ce19007" +"checksum libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141ab3f96adc87c8cb847b1cf790e0fbce0b03e3dabfdd3b72fe23d36fc005de" +"checksum libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1514593f2aced40b257565cf2edc63b4cc2f06241a2f3e5a4fe275e0c4d55e85" +"checksum libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f6f5543deedf4d89931a74d3897b63be19a62d5cb675efaa4c669a4aa0ab12" +"checksum libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9db88ba58601f4528ef5e5e5414e142b19d5813bdaa685e683ef5a44ed23606b" +"checksum libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "260689f26ab2161a1fde9617c53699f78e4ab25fd77c4b07a25b97fca74c5c6d" +"checksum libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1281e58168ed62cf2e9bfe127908a0ec277cf48cbb3dec5b1a68b58ea6332171" +"checksum libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd8ab542edc493fa7a9f9b7f93dc4ee0b384e1f9e2a3397ce0056ffe30a0ea21" +"checksum libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f009594f78d952c57f452be237650025acd4ef17c5cc8eda4c6466ba196e5688" +"checksum libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ccfb9869daccfb9d3938eda8821146e85105a8c874f14393cdb57543afeceb38" +"checksum libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d3dce2ec4fcb3a2cc748c02d61f7e76486df9c7b09e8ccb4d9f81befce207de" +"checksum libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3b3bb3328d206ad3061e863f179a211fc978d7bce05f90440ed6b8a6a9d17ced" +"checksum libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b23a8ece138f448572c5ff781d62323a954f1f681c303e6553368026764b0ae" +"checksum libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "55918f058f118d72d83f9a976f12e02e54c8616ddfc795c779c4801a5042a44f" +"checksum libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9bff57806e0f71832cc02b5dea1010e5f1a9d16393fd104a4b64e4aaae40d885" +"checksum libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3629f9a667d9f5acb5876df59cf3b547250e340131c47587f9ace7c517f21327" +"checksum libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d65c15f89c0607d4a334664d759e54e847e1856a73ea78e7bb6a75e6f4039010" +"checksum libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dff6c81d0f46261a6327219349753aefd3a92021a1e6102185fa112cfcddca97" +"checksum libp2p-websocket 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "04451aa166aa2040293f44c1c27144b65500e4a2ebbb723dfe732f39436eccbd" +"checksum libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5369165359bea84e7ebe73f37b6240f31f8d924ce6710be3d8e1fa678985c9b8" +"checksum librocksdb-sys 5.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7dfb546562f9b450237bb8df7a31961849ee9fb1186d9e356db1d7a6b7609ff2" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" @@ -5291,13 +5639,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -"checksum make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8ca8afbe8af1785e09636acb5a41e08a765f5f0340568716c18a8700ba3c0d3" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" +"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum merlin 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9e97b439f6d38cbe2a4a4aa93f6770c5305f62761b78b1851406c09c87ee2a" +"checksum merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83c2dda19c01176e8e7148f7bdb88bbdf215a8db0641f89fc40e4b81736aeda5" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" @@ -5307,54 +5654,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" "checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" +"checksum nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46f0f3210768d796e8fa79ec70ee6af172dacbe7147f5e69be5240a47778302b" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" -"checksum nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b30adc557058ce00c9d0d7cb3c6e0b5bc6f36e2e2eabe74b0ba726d194abd588" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238" +"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ec7bd7ca4cce6dbdc77e7c1230682740d307d1218a87fb0349a571272be749f9" +"checksum openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5a0d6b781aac4ac1bd6cafe2a2f0ad8c16ae8e1dd5184822a16c50139f8838d9" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)" = "1bb974e77de925ef426b6bc82fce15fd45bdcbeb5728bffcfc7cdeeb7ce1c2d6" +"checksum openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)" = "33c86834957dd5b915623e94f2f4ab2c70dd8f6b70679824155d5ae21dbd495d" +"checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2edd80cdaf3b9c7b7f524299586bb4eae43cc5eb20c7b41aa0cd741200000e38" +"checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b9db194dfbcfe3b398d63d765437a5c7232d59906e203055f0e993f6458ff1" -"checksum parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61ae6944d4435d41f4d0f12108c5cbb9207cbb14bc8f2b4984c6e930dc9c8e41" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" +"checksum parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fec5048fba72a2e01baeb0d08089db79aead4b57e2443df172fb1840075a233" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" +"checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" "checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" "checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9bed9ebc40cf53e3a76d7486c54d05002eae6485b2711ab9104476fb2eb8bc" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "77997c53ae6edd6d187fec07ec41b207063b5ee6f33680e9fa86d405cdd313d4" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d82d117bc7565ce6be0150159251c9b1eeec7b129f5a2aa86e10acb5970de1cb" +"checksum proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)" = "ba92c84f814b3f9a44c5cfca7d2ad77fa10710867d2bbb1b3d175ab5f47daa12" +"checksum protobuf 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3959be8d6250192f80ef056c0a4aaaeaff8a25e904e6e7a0f5285cb1a061835f" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" -"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" @@ -5365,43 +5713,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" "checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" -"checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" -"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d813022b2e00774a48eaf43caaa3c20b45f040ba8cbf398e2e8911a06668dbe6" -"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum rhododendron 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9381ed76c1ec4e8994f1f7d2c6d7e33eed3ff7176e16fece09c2e993fc4a5a" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" -"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34fa7bcae7fca3c8471e8417088bbc3ad9af8066b0ecf4f3c0d98a0d772716e" +"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" -"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" -"checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" +"checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfaccd3a23619349e0878d9a241f34b1982343cdf67367058cd7d078d326b63e" "checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05" "checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" "checksum serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "aa5f7c20820475babd2c077c3ab5f8c77a31c15e16ea38687b4c02d3e48680f4" "checksum serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc82bec244f168b23d1963b45c8bf5726e9a15a9d146a067f9081aeed2de79" -"checksum serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "27dce848e7467aa0e2fcaf0a413641499c0b745452aaca1194d24dedde9e13c9" +"checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" @@ -5412,78 +5760,82 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" -"checksum smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15" -"checksum snow 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7251f8920e9043106cfe466c04ed3eb257b8315a7699259c4fd0af6dffb6aef6" +"checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" +"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" +"checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "461e7f2e33670b1c33f1ea22bb2f86de6136fabd0c4d27d167ed425c231143ca" +"checksum stdweb 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c1d5ac2f828b2877a6be60a51b8e3ebb57b56862b10be1a72676ca8900b69d" "checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "432465093692af7379dcd196ce4be398c906958d91b412fff9102a66238d6f26" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" +"checksum stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e68f7d08b76979a43e93fe043b66d2626e35d41d68b0b85519202c6dd8ac59fa" +"checksum stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d52317523542cc0af5b7e31017ad0f7d1e78da50455e38d5657cd17754f617da" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "670ad348dc73012fcf78c71f06f9d942232cdd4c859d4b6975e27836c3efc0c3" -"checksum structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ef98172b1a00b0bec738508d3726540edcbd186d50dfd326f2b1febbb3559f04" +"checksum structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3d0760c312538987d363c36c42339b55f5ee176ea8808bbe4543d484a291c8d1" +"checksum structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "528aeb7351d042e6ffbc2a6fb76a86f9b622fdf7c25932798e7a82cb03bc94c6" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)" = "846620ec526c1599c070eff393bfeeeb88a93afa2513fc3b49f1fea84cf7b0ed" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum sysinfo 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4da1ccc493b46042d6f5352910a7f18ed8fe81307dd7db3f2e2d8a7db6f6284" +"checksum sysinfo 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a0cb7899e248ed0baa6ef6f8406352523c2f99bc7c4b1800f4cd6d5dde99eb" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "37daa55a7240c4931c84559f03b3cad7d19535840d1c4a0cc4e9b2fb0dcf70ff" +"checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1415431cb2398d84da64173f8473c792808314427d4a6f2f3ea85ae67239fe3" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7655088894274afb52b807bd3c87072daa1fedd155068b8705cabfd628956115" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "e0500b88064f08bebddd0c0bed39e19f5c567a5f30975bee52b0c0d3e2eeb38c" +"checksum tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "cec6c34409089be085de9403ba2010b80e36938c9ca992c4f67f407bb13db0b1" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "331c8acc267855ec06eb0c94618dcbbfea45bed2d20b77252940095273fb58f6" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" -"checksum tokio-fs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0e9cbbc8a3698b7ab652340f46633364f9eaa928ddaaee79d8b8f356dd79a09d" -"checksum tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f" -"checksum tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f" -"checksum tokio-sync 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3742b64166c1ee9121f1921aea5a726098458926a6b732d906ef23b1f3ef6f4f" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" +"checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" +"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" +"checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c3fd86cb15547d02daa2b21aadaf4e37dee3368df38a526178a5afa3c034d2fb" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" "checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" "checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum toml 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87c5890a989fa47ecdc7bcb4c63a77a82c18f306714104b1decfd722db17b39e" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-bench 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eafa32a8662c06f5bf135984bc1a12821fd38770b5c2f2f9e8750327fcbe3955" +"checksum trie-bench 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba20f7d9865497ea46511860b43e05a44f4ac9a76ee089d34cd80a839a690264" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" -"checksum trie-standardmap 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006314f54f2ea7944a878e66fd93ad7978095bc355f30a2f26ec40f664d86c86" +"checksum trie-standardmap 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4e24277af05f38f3aaf03ac78e3a154be83f13db9c8ef0cb95bb1aa764a477b" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" +"checksum trybuild 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0b0df728de48978b759da185ed7ef76676ef0c878ae4800c9e90024c998dc75b" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" +"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" +"checksum unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41d17211f887da8e4a70a45b9536f26fc5de166b81e2d5d80de4a17fd22553bd" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" @@ -5497,21 +5849,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a6265b25719e82598d104b3717375e37661d41753e2c84cde3f51050c7ed7e3c" "checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" -"checksum websocket 0.22.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d2c67346c042adbd4f5b2a49700e340befc5b772094fec8d36df6b825523d933" -"checksum which 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e84a603e7e0b1ce1aa1ee2b109c7be00155ce52df5081590d1ffb93f4f515cb2" +"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" +"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" +"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" +"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" +"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" +"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" +"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" +"checksum websocket 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7cc2d74d89f9df981ab41ae624e33cf302fdf456b93455c6a31911a99c9f0bb8" +"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" -"checksum ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcacc3ba9c1ee43e3fd0846a25489ff22f8906e90775d51b6edbae4b95d71f4" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" -"checksum yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "302defd1bed8a9a6d43b82f0e5a50510dfdfbbd02c270c93ff9d6f3f5e2dea89" +"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e68403b858b6af538b11614e62dfe9ab2facba9f13a0cafb974855cfb495ec95" +"checksum zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3f07490820219949839d0027b965ffdd659d75be9220c00798762e36c6cd281" diff --git a/Cargo.toml b/Cargo.toml index 17bd0337e86e0e93034682dccd0ceb5160a51c18..5710d08aff8789fdedd8210477251b9eaefeb7fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,12 @@ path = "node/src/main.rs" [package] name = "substrate" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" [dependencies] -error-chain = "0.12" cli = { package = "node-cli", path = "node/cli" } futures = "0.1" ctrlc = { version = "3.0", features = ["termination"] } @@ -25,7 +24,9 @@ members = [ "core/client/db", "core/consensus/common", "core/consensus/aura", + "core/consensus/babe", "core/consensus/rhd", + "core/consensus/slots", "core/executor", "core/finality-grandpa", "core/finality-grandpa/primitives", @@ -84,12 +85,12 @@ members = [ "node/rpc-client", "node-template", "subkey", + "test-utils/chain-spec-builder", ] exclude = [ "node/runtime/wasm", "core/executor/wasm", "core/test-runtime/wasm", - "test-utils/chain-spec-builder" ] [badges] diff --git a/Dockerfile b/Dockerfile index 5c78740d5ea847f055021e3afbd332fda2647796..df39db5abb5d17991d49bba67850dd9e8310817e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,38 +1,55 @@ -FROM alpine:edge AS builder +# Note: We don't use Alpine and its packaged Rust/Cargo because they're too often out of date, +# preventing them from being used to build Substrate/Polkadot. + +FROM phusion/baseimage:0.10.2 as builder LABEL maintainer="chevdor@gmail.com" LABEL description="This is the build stage for Substrate. Here we create the binary." -RUN apk add build-base \ - cmake \ - linux-headers \ - openssl-dev \ - clang-dev \ - cargo - ARG PROFILE=release WORKDIR /substrate COPY . /substrate -RUN cargo build --$PROFILE +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" && \ + rustup toolchain install nightly && \ + rustup target add wasm32-unknown-unknown --toolchain nightly && \ + cargo install --git https://github.com/alexcrichton/wasm-gc && \ + rustup default nightly && \ + ./scripts/build.sh && \ + rustup default stable && \ + cargo build --$PROFILE # ===== SECOND STAGE ====== -FROM alpine:edge +FROM phusion/baseimage:0.10.2 LABEL maintainer="chevdor@gmail.com" LABEL description="This is the 2nd stage: a very small image where we copy the Substrate binary." ARG PROFILE=release + +RUN mv /usr/share/ca* /tmp && \ + rm -rf /usr/share/* && \ + mv /tmp/ca-certificates /usr/share/ && \ + mkdir -p /root/.local/share/Polkadot && \ + ln -s /root/.local/share/Polkadot /data && \ + useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate + COPY --from=builder /substrate/target/$PROFILE/substrate /usr/local/bin -RUN apk add --no-cache ca-certificates \ - libstdc++ \ - openssl +# checks +RUN ldd /usr/local/bin/substrate && \ + /usr/local/bin/substrate --version +# Shrinking RUN rm -rf /usr/lib/python* && \ - mkdir -p /root/.local/share/Substrate && \ - ln -s /root/.local/share/Substrate /data + rm -rf /usr/bin /usr/sbin /usr/share/man +USER substrate EXPOSE 30333 9933 9944 VOLUME ["/data"] -ENTRYPOINT ["/usr/local/bin/substrate"] +CMD ["/usr/local/bin/substrate"] diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000000000000000000000000000000000..9b368f3f04d4c60d5f7bdfcf83eaa323340ab181 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ +Thank you for your Pull Request! + +Before you submitting, please check that: + +- [ ] You added a brief description of the PR, e.g.: + - What does it do? + - What important points reviewers should know? + - Is there something left for follow-up PRs? +- [ ] You labeled the PR with appropriate labels if you have permissions to do so. +- [ ] You mentioned a related issue if this PR related to it, e.g. `Fixes #228` or `Related #1337`. +- [ ] You asked any particular reviewers to review. If you aren't sure, start with GH suggestions. +- [ ] Your PR adheres [the style guide](https://github.com/paritytech/polkadot/wiki/Style-Guide) + - In particular, mind the maximal line length. + - There is no commented code checked in unless necessary. + - Any panickers have a proof or removed. +- [ ] You bumped the runtime version if there are breaking changes in the **runtime**. +- [ ] You updated any rustdocs which may have changed + +After you've read this notice feel free to remove it. +Thank you! + +✄ ----------------------------------------------------------------------------- diff --git a/README.adoc b/README.adoc index 71c512b820427fd78209ddd2bb54803528132051..f1ffc20d91542be3e4a86dc178fae1d6b2c7cac4 100644 --- a/README.adoc +++ b/README.adoc @@ -12,7 +12,7 @@ Substrate is a next-generation framework for blockchain innovation. At its heart, Substrate is a combination of three technologies: https://webassembly.org/[WebAssembly], https://libp2p.io/[Libp2p] and GRANDPA Consensus. About GRANDPA, see this https://hackmd.io/Jd0byWX0RiqFiXUVC78Bdw?view#GRANDPA[definition], https://medium.com/polkadot-network/grandpa-block-finality-in-polkadot-an-introduction-part-1-d08a24a021b5[introduction] and https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf[formal specification]. It is both a library for building new blockchains and a "skeleton key" of a blockchain client, able to synchronize to any Substrate-based chain. -Substrate chains have three distinct features that make them "next-generation": a dynamic, self-defining state-transition function; light-client functionality from day one; and a progressive consensus algorithm with fast block production and adaptive, definite finality. The STF, encoded in WebAssembly, is known as the "runtime". This defines the `execute_block` function, and can specify everything from the staking algorithm, transaction semantics, logging mechanisms and procedures for replacing any aspect of itself or of the blockchain's state ("governance"). Because the runtime is entirely dynamic all of these can be switched out or upgraded at any time. A Substrate chain is very much a "living organizm". +Substrate chains have three distinct features that make them "next-generation": a dynamic, self-defining state-transition function; light-client functionality from day one; and a progressive consensus algorithm with fast block production and adaptive, definite finality. The STF, encoded in WebAssembly, is known as the "runtime". This defines the `execute_block` function, and can specify everything from the staking algorithm, transaction semantics, logging mechanisms and procedures for replacing any aspect of itself or of the blockchain's state ("governance"). Because the runtime is entirely dynamic all of these can be switched out or upgraded at any time. A Substrate chain is very much a "living organism". See also https://www.parity.io/what-is-substrate/. @@ -30,7 +30,7 @@ Substrate is designed to be used in one of three ways: === The Basics of Substrate -Substrate is a blockchain platform with a completely generic state transition function. That said, it does come with both standards and conventions (particularly regarding the Runtime Module Library) regarding underlying datastructures. Roughly speaking, these core datatypes correspond to +trait+s in terms of the actual non-negotiable standard and generic +struct+s in terms of the convention. +Substrate is a blockchain platform with a completely generic state transition function. That said, it does come with both standards and conventions (particularly regarding the Runtime Module Library) regarding underlying data structures. Roughly speaking, these core datatypes correspond to +trait+s in terms of the actual non-negotiable standard and generic +struct+s in terms of the convention. ``` Header := Parent + ExtrinsicsRoot + StorageRoot + Digest @@ -39,7 +39,7 @@ Block := Header + Extrinsics + Justifications === Extrinsics -Extrinsics in Substrate are pieces of information from "the outside world" that are contained in the blocks of the chain. You might think "ahh, that means *transactions*": in fact, no. Extrinsics fall into two broad categories of which only one is *transactions*. The other is known as *inherents*. The difference between these two is that transactions are signed and gossipped on the network and can be deemed useful *per se*. This fits the mold of what you would call transactions in Bitcoin or Ethereum. +Extrinsics in Substrate are pieces of information from "the outside world" that are contained in the blocks of the chain. You might think "ahh, that means *transactions*": in fact, no. Extrinsics fall into two broad categories of which only one is *transactions*. The other is known as *inherents*. The difference between these two is that transactions are signed and gossiped on the network and can be deemed useful *per se*. This fits the mold of what you would call transactions in Bitcoin or Ethereum. Inherents, meanwhile, are not passed on the network and are not signed. They represent data which describes the environment but which cannot call upon anything to prove it such as a signature. Rather they are assumed to be "true" simply because a sufficiently large number of validators have agreed on them being reasonable. @@ -111,7 +111,7 @@ Inherent extrinsic knowledge is again somewhat generic, and the actual construct == Trying out Substrate Node -Substate Node is Substrate's pre-baked blockchain client. You can run a development node locally or configure a new chain and launch your own global testnet. +Substrate Node is Substrate's pre-baked blockchain client. You can run a development node locally or configure a new chain and launch your own global testnet. === On Mac and Ubuntu @@ -173,11 +173,13 @@ You can distribute `mychain.json` so that everyone can synchronize and (dependin If you'd actually like to hack on Substrate, you can just grab the source code and build it. Ensure you have Rust and the support software installed: +==== Linux and Mac + +For Unix-based operating systems, you should run the following commands: + [source, shell] ---- curl https://sh.rustup.rs -sSf | sh -# on Windows download and run rustup-init.exe -# from https://rustup.rs instead rustup update nightly rustup target add wasm32-unknown-unknown --toolchain nightly @@ -195,27 +197,60 @@ sudo apt install cmake pkg-config libssl-dev git clang libclang-dev [source, shell] brew install cmake pkg-config openssl git llvm - - Windows (PowerShell): -+ -[source, shell] ----- -# Install LLVM -# Download and install the Pre Build Windows binaries -# of LLVM from http://releases.llvm.org/download.html - -# Install OpenSSL (through vcpkg) -mkdir \Tools -cd \Tools -git clone https://github.com/Microsoft/vcpkg.git -cd vcpkg -.\bootstrap-vcpkg.bat -.\vcpkg.exe install openssl:x64-windows-static - -$env:OPENSSL_DIR = 'C:\Tools\vcpkg\installed\x64-windows-static' -$env:OPENSSL_STATIC = 'Yes' -[System.Environment]::SetEnvironmentVariable('OPENSSL_DIR', $env:OPENSSL_DIR, [System.EnvironmentVariableTarget]::User) -[System.Environment]::SetEnvironmentVariable('OPENSSL_STATIC', $env:OPENSSL_STATIC, [System.EnvironmentVariableTarget]::User) ----- +To finish installation of Substrate, jump down to <>. + +==== Windows + +If you are trying to set up Substrate on Windows, you should do the following: + +1. First, you will need to download and install "Build Tools for Visual Studio:" + + * You can get it at this link: https://aka.ms/buildtools + * Run the installation file: `vs_buildtools.exe` + * Please ensure the Windows 10 SDK component is included when installing the Visual C++ Build Tools. + * image:https://i.imgur.com/zayVLmu.png[image] + * Restart your computer. + +2. Next, you need to install Rust: + + * Detailed instructions are provided by the https://doc.rust-lang.org/book/ch01-01-installation.html#installing-rustup-on-windows[Rust Book]. + * Download from: https://www.rust-lang.org/tools/install + * Run the installation file: `rustup-init.exe` + > Note that it should not prompt you to install vs_buildtools since you did it in step 1. + * Choose "Default Installation." + * To get started, you need Cargo's bin directory (%USERPROFILE%\.cargo\bin) in your PATH environment variable. Future applications will automatically have the correct environment, but you may need to restart your current shell. + +3. Then, you will need to run some commands in CMD to set up your Wasm Build Environment: + + rustup update nightly + rustup update stable + rustup target add wasm32-unknown-unknown --toolchain nightly + +4. Next, you install wasm-gc, which is used to slim down Wasm files: + + cargo install --git https://github.com/alexcrichton/wasm-gc --force + +5. Then, you need to install LLVM: https://releases.llvm.org/download.html + +6. Next, you need to install OpenSSL, which we will do with `vcpkg`: + + mkdir \Tools + cd \Tools + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + .\bootstrap-vcpkg.bat + .\vcpkg.exe install openssl:x64-windows-static + +7. After, you need to add OpenSSL to your System Variables: + + $env:OPENSSL_DIR = 'C:\Tools\vcpkg\installed\x64-windows-static' + $env:OPENSSL_STATIC = 'Yes' + [System.Environment]::SetEnvironmentVariable('OPENSSL_DIR', $env:OPENSSL_DIR, [System.EnvironmentVariableTarget]::User) + [System.Environment]::SetEnvironmentVariable('OPENSSL_STATIC', $env:OPENSSL_STATIC, [System.EnvironmentVariableTarget]::User) + +8. Finally, you need to install `cmake`: https://cmake.org/download/ + +==== Shared Steps Then, grab the Substrate source code: @@ -229,8 +264,8 @@ Then build the code: [source, shell] ---- -./scripts/build.sh # Builds the WebAssembly binaries -cargo build # Builds all native code +./scripts/build.sh # Builds the WebAssembly binaries +cargo build # Builds all native code ---- You can run all the tests if you like: @@ -249,7 +284,7 @@ Detailed logs may be shown by running the node with the following environment va If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain specification that have been endowed with a testnet DOTs. We'll give each node a name and expose them so they are listed on link:https://telemetry.polkadot.io/#/Local%20Testnet[Telemetry] . You'll need two terminals windows open. -We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The Bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from the `--node-key` value that we specify below: +We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The Bootnode ID of her node is `QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR`, which is generated from the `--node-key` value that we specify below: [source, shell] cargo run --release \-- \ @@ -265,7 +300,7 @@ In the second terminal, we'll run the following to start Bob's substrate node on [source, shell] cargo run --release \-- \ --base-path /tmp/bob \ - --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \ + --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \ --chain=local \ --bob \ --port 30334 \ @@ -274,9 +309,11 @@ cargo run --release \-- \ Additional Substate CLI usage options are available and may be shown by running `cargo run \-- --help`. -=== Joining the Emberic Elm Testnet +[[flaming-fir]] +=== Joining the Flaming Fir Testnet -Emberic Elm is the new testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, or Dried-Danta testnets. Ensure you have the dependencies listed above before compiling. +Flaming Fir is the new testnet for Substrate master (2.0). Please note that master is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Emberic-Elm testnets. Ensure you have the dependencies listed above before compiling. +The master branch might have breaking changes as development progresses, therefore you should make sure you have a reasonably updated client when trying to sync Flaming Fir. [source, shell] ---- @@ -304,8 +341,21 @@ For example, you can choose a custom node name: [source, shell] cargo run --release \-- --name my_custom_name -If you are successful, you will see your node syncing at https://telemetry.polkadot.io/#/Emberic%20Elm +If you are successful, you will see your node syncing at https://telemetry.polkadot.io/#/Flaming%20Fir + +=== Joining the Emberic Elm Testnet + +Emberic Elm is the testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Flaming-Fir testnets. +In order to join the Emberic Elm testnet you should build from the `v1.0` branch. Ensure you have the dependencies listed above before compiling. + +[source, shell] +---- +git clone https://github.com/paritytech/substrate.git +cd substrate +git checkout -b v1.0 origin/v1.0 +---- +You can then follow the same steps for building and running as described above in <>. == Documentation diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index fdd1be81777260304dd156e9f5df31cb2178c6b0..63408b4329a2f7b60cf7985bbac26d5d3378f437 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-basic-authorship" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index e9b6c909ad41f556488bd8ad6cb6ca7452896450..9f0db708daf184137ae54275065f36aa028a26ef 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -232,7 +232,7 @@ impl Proposer where Ok(()) => { debug!("[{:?}] Pushed to the block.", pending.hash); } - Err(error::Error(error::ErrorKind::ApplyExtrinsicFailed(ApplyError::FullBlock), _)) => { + Err(error::Error::ApplyExtrinsicFailed(ApplyError::FullBlock)) => { if is_first { debug!("[{:?}] Invalid transaction: FullBlock on empty block", pending.hash); unqueue_invalid.push(pending.hash.clone()); @@ -291,20 +291,17 @@ impl Proposer where mod tests { use super::*; - use codec::Encode; use std::cell::RefCell; use consensus_common::{Environment, Proposer}; use test_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; fn extrinsic(nonce: u64) -> Extrinsic { - let tx = Transfer { + Transfer { amount: Default::default(), nonce, from: AccountKeyring::Alice.into(), to: Default::default(), - }; - let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); - Extrinsic::Transfer(tx, signature) + }.into_signed_tx() } #[test] diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index 1309e788de77c3639f0676575901a2f449b3d252..54cde50d1a0c80bc601680c34dcb20fc26d3f99e 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "substrate-cli" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" [dependencies] clap = "~2.32" +derive_more = "0.14.0" env_logger = "0.6" -error-chain = "0.12" log = "0.4" atty = "0.2" regex = "1" @@ -33,6 +33,7 @@ substrate-telemetry = { path = "../../core/telemetry" } keyring = { package = "substrate-keyring", path = "../keyring" } names = "0.11.0" structopt = "0.2" +rpassword = "3.0" [dev-dependencies] tempdir = "0.3" diff --git a/core/cli/src/error.rs b/core/cli/src/error.rs index e368cc6d9670a59adaf2975de4f69421948fbb14..b052a29710d7fce5f737b3f64b377f7b015d3bbc 100644 --- a/core/cli/src/error.rs +++ b/core/cli/src/error.rs @@ -16,28 +16,38 @@ //! Initialization errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use client; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - Service(::service::Error) #[doc="Substrate service error"]; - } - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } - errors { - /// Input error. - Input(m: String) { - description("Invalid input"), - display("{}", m), + +/// Result type alias for the CLI. +pub type Result = std::result::Result; + +/// Error type for the CLI. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Io error + Io(std::io::Error), + /// Cli error + Cli(clap::Error), + /// Service error + Service(service::Error), + /// Client error + Client(client::error::Error), + /// Input error + Input(String), + /// Invalid listen multiaddress + #[display(fmt="Invalid listen multiaddress")] + InvalidListenMultiaddress +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Cli(ref err) => Some(err), + Error::Service(ref err) => Some(err), + Error::Client(ref err) => Some(err), + Error::Input(_) => None, + Error::InvalidListenMultiaddress => None, } } } diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index 260615b2c1cb626429c14e95cc51baceda08d4b1..5c60229fab1bfd6cd19a477d700f3a2580983da3 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -29,12 +29,19 @@ use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, warn}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, As}; +use runtime_primitives::traits::{Header, SaturatedConversion}; /// Spawn informant on the event loop +#[deprecated(note = "Please use informant::build instead, and then create the task manually")] pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExecutor) where C: Components, { + handle.spawn(exit.until(build(service)).map(|_| ())); +} + +/// Creates an informant in the form of a `Future` that must be polled regularly. +pub fn build(service: &Service) -> impl Future +where C: Components { let network = service.network(); let client = service.client(); let txpool = service.transaction_pool(); @@ -47,7 +54,7 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe let display_notifications = network.status().for_each(move |sync_status| { if let Ok(info) = client.info() { - let best_number: u64 = info.chain.best_number.as_(); + let best_number = info.chain.best_number.saturated_into::(); let best_hash = info.chain.best_hash; let num_peers = sync_status.num_peers; let speed = move || speed(best_number, last_number, last_update); @@ -59,7 +66,7 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe }; last_number = Some(best_number); let txpool_status = txpool.status(); - let finalized_number: u64 = info.chain.finalized_number.as_(); + let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); let bandwidth_download = network.average_download_per_sec(); let bandwidth_upload = network.average_upload_per_sec(); info!( @@ -76,13 +83,19 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe TransferRateFormat(bandwidth_upload), ); + let backend = (*client).backend(); + let used_state_cache_size = match backend.used_state_cache_size(){ + Some(size) => size, + None => 0, + }; + // get cpu usage and memory usage of this process let (cpu_usage, memory) = if sys.refresh_process(self_pid) { let proc = sys.get_process(self_pid).expect("Above refresh_process succeeds, this should be Some(), qed"); (proc.cpu_usage(), proc.memory()) } else { (0.0, 0) }; - let network_state = serde_json::to_string(&network.network_state()).unwrap_or_default(); + let network_state = network.network_state(); telemetry!( SUBSTRATE_INFO; @@ -99,6 +112,7 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe "finalized_hash" => ?info.chain.finalized_hash, "bandwidth_download" => bandwidth_download, "bandwidth_upload" => bandwidth_upload, + "used_state_cache_size" => used_state_cache_size, ); } else { warn!("Error getting best block information"); @@ -149,17 +163,17 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe Ok(()) }); - let informant_work = display_notifications.join3(display_block_import, display_txpool_import); - handle.spawn(exit.until(informant_work).map(|_| ())); + display_notifications.join3(display_block_import, display_txpool_import) + .map(|((), (), ())| ()) } fn speed(best_number: u64, last_number: Option, last_update: time::Instant) -> String { let since_last_millis = last_update.elapsed().as_secs() * 1000; let since_last_subsec_millis = last_update.elapsed().subsec_millis() as u64; - let speed = match last_number { - Some(num) => (best_number.saturating_sub(num) * 10_000 / (since_last_millis + since_last_subsec_millis)) as f64, - None => 0.0 - }; + let speed = last_number + .and_then(|num| + (best_number.saturating_sub(num) * 10_000).checked_div(since_last_millis + since_last_subsec_millis)) + .map_or(0.0, |s| s as f64); if speed < 1.0 { "".into() diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 3ed7347b50a0a5558601f4e3244b7586fa40040b..e629788e801d38d9baf487635128da6d2526f5bf 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -26,7 +26,6 @@ pub mod error; pub mod informant; use client::ExecutionStrategies; -use runtime_primitives::traits::As; use service::{ ServiceFactory, FactoryFullConfiguration, RuntimeGenesis, FactoryGenesis, PruningMode, ChainSpec, @@ -39,7 +38,7 @@ use network::{ use primitives::H256; use std::{ - io::{Write, Read, stdin, stdout}, iter, fs::{self, File}, net::{Ipv4Addr, SocketAddr}, + io::{Write, Read, stdin, stdout, ErrorKind}, iter, fs::{self, File}, net::{Ipv4Addr, SocketAddr}, path::{Path, PathBuf}, str::FromStr, }; @@ -56,7 +55,6 @@ use params::{ pub use params::{NoCustom, CoreParams}; pub use traits::{GetLogFilter, AugmentClap}; use app_dirs::{AppInfo, AppDataType}; -use error_chain::bail; use log::info; use lazy_static::lazy_static; @@ -146,10 +144,6 @@ fn base_path(cli: &SharedParams, version: &VersionInfo) -> PathBuf { ) } -fn input_err>(msg: T) -> error::Error { - error::ErrorKind::Input(msg.into()).into() -} - /// Check whether a node name is considered as valid fn is_node_name_valid(_name: &str) -> Result<(), &str> { let name = _name.to_string(); @@ -201,7 +195,7 @@ where CC: StructOpt + Clone + GetLogFilter, RP: StructOpt + Clone + AugmentClap, E: IntoExit, - RS: FnOnce(E, RP, FactoryFullConfiguration) -> Result<(), String>, + RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, I: IntoIterator, T: Into + Clone, { @@ -279,7 +273,7 @@ where /// Create an error caused by an invalid node key argument. fn invalid_node_key(e: impl std::fmt::Display) -> error::Error { - input_err(format!("Invalid node key: {}", e)) + error::Error::Input(format!("Invalid node key: {}", e)) } /// Parse a Secp256k1 secret key from a hex string into a `network::Secret`. @@ -322,6 +316,7 @@ fn fill_network_configuration( chain_spec_id: &str, config: &mut NetworkConfiguration, client_id: String, + is_dev: bool, ) -> error::Result<()> { config.boot_nodes.extend(cli.bootnodes.into_iter()); config.config_path = Some( @@ -334,7 +329,7 @@ fn fill_network_configuration( } for addr in cli.listen_addr.iter() { - let addr = addr.parse().map_err(|_| "Invalid listen multiaddress")?; + let addr = addr.parse().ok().ok_or(error::Error::InvalidListenMultiaddress)?; config.listen_addresses.push(addr); } @@ -359,11 +354,16 @@ fn fill_network_configuration( config.in_peers = cli.in_peers; config.out_peers = cli.out_peers; - config.enable_mdns = !cli.no_mdns; + config.enable_mdns = !is_dev && !cli.no_mdns; Ok(()) } +fn input_keystore_password() -> Result { + rpassword::read_password_from_tty(Some("Keystore password: ")) + .map_err(|e| format!("{:?}", e)) +} + fn create_run_node_config( cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo ) -> error::Result> @@ -373,6 +373,9 @@ where { let spec = load_spec(&cli.shared_params, spec_factory)?; let mut config = service::Configuration::default_with_spec(spec.clone()); + if cli.interactive_password { + config.password = input_keystore_password()? + } config.impl_name = impl_name; config.impl_commit = version.commit; @@ -384,14 +387,14 @@ where }; match is_node_name_valid(&config.name) { Ok(_) => (), - Err(msg) => bail!( - input_err( + Err(msg) => Err( + error::Error::Input( format!("Invalid node name '{}'. Reason: {}. If unsure, use none.", config.name, msg ) ) - ) + )? } let base_path = base_path(&cli.shared_params, version); @@ -404,11 +407,12 @@ where config.database_path = db_path(&base_path, config.chain_spec.id()).to_string_lossy().into(); config.database_cache_size = cli.database_cache_size; + config.state_cache_size = cli.state_cache_size; config.pruning = match cli.pruning { Some(ref s) if s == "archive" => PruningMode::ArchiveAll, None => PruningMode::default(), Some(s) => PruningMode::keep_blocks( - s.parse().map_err(|_| input_err("Invalid pruning mode specified"))? + s.parse().map_err(|_| error::Error::Input("Invalid pruning mode specified".to_string()))? ), }; @@ -440,6 +444,8 @@ where config.roles = role; config.disable_grandpa = cli.no_grandpa; + let is_dev = cli.shared_params.dev; + let client_id = config.client_id(); fill_network_configuration( cli.network_config, @@ -447,6 +453,7 @@ where spec.id(), &mut config.network, client_id, + is_dev, )?; fill_transaction_pool_configuration::( @@ -475,11 +482,20 @@ where config.rpc_ws = Some( parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)? ); - config.rpc_cors = cli.rpc_cors.unwrap_or_else(|| Some(vec![ - "http://localhost:*".into(), - "https://localhost:*".into(), - "https://polkadot.js.org".into() - ])); + config.rpc_ws_max_connections = cli.ws_max_connections; + config.rpc_cors = cli.rpc_cors.unwrap_or_else(|| if is_dev { + log::warn!("Running in --dev mode, RPC CORS has been disabled."); + None + } else { + Some(vec![ + "http://localhost:*".into(), + "http://127.0.0.1:*".into(), + "https://localhost:*".into(), + "https://127.0.0.1:*".into(), + "https://polkadot.js.org".into(), + "https://substrate-ui.parity.io".into(), + ]) + }); // Override telemetry if cli.no_telemetry { @@ -488,7 +504,8 @@ where config.telemetry_endpoints = Some(TelemetryEndpoints::new(cli.telemetry_endpoints)); } - config.force_authoring = cli.force_authoring; + // Imply forced authoring on --dev + config.force_authoring = cli.shared_params.dev || cli.force_authoring; Ok(config) } @@ -506,11 +523,11 @@ where F: ServiceFactory, E: IntoExit, S: FnOnce(&str) -> Result>>, String>, - RS: FnOnce(E, RP, FactoryFullConfiguration) -> Result<(), String>, + RS: FnOnce(E, RunCmd, RP, FactoryFullConfiguration) -> Result<(), String>, { - let config = create_run_node_config::(cli.left, spec_factory, impl_name, version)?; + let config = create_run_node_config::(cli.left.clone(), spec_factory, impl_name, version)?; - run_service(exit, cli.right, config).map_err(Into::into) + run_service(exit, cli.left, cli.right, config).map_err(Into::into) } // @@ -605,7 +622,7 @@ where }; service::chain_ops::export_blocks::( - config, exit.into_exit(), file, As::sa(from), to.map(As::sa), json + config, exit.into_exit(), file, from.into(), to.map(Into::into), json ).map_err(Into::into) } @@ -641,7 +658,7 @@ where { let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; let blocks = cli.num; - Ok(service::chain_ops::revert_chain::(config, As::sa(blocks))?) + Ok(service::chain_ops::revert_chain::(config, blocks.into())?) } fn purge_chain( @@ -673,10 +690,17 @@ where } } - fs::remove_dir_all(&db_path)?; - println!("{:?} removed.", &db_path); - - Ok(()) + match fs::remove_dir_all(&db_path) { + Result::Ok(_) => { + println!("{:?} removed.", &db_path); + Ok(()) + }, + Result::Err(ref err) if err.kind() == ErrorKind::NotFound => { + println!("{:?} did not exist.", &db_path); + Ok(()) + }, + Result::Err(err) => Result::Err(err.into()) + } } fn parse_address( @@ -728,10 +752,10 @@ fn init_logger(pattern: &str) { builder.filter(None, log::LevelFilter::Info); if let Ok(lvl) = std::env::var("RUST_LOG") { - builder.parse(&lvl); + builder.parse_filters(&lvl); } - builder.parse(pattern); + builder.parse_filters(pattern); let isatty = atty::is(atty::Stream::Stderr); let enable_color = isatty; @@ -807,7 +831,7 @@ mod tests { NodeKeyType::variants().into_iter().try_for_each(|t| { let node_key_type = NodeKeyType::from_str(t).unwrap(); let sk = match node_key_type { - NodeKeyType::Secp256k1 => secp256k1::SecretKey::generate().as_ref().to_vec(), + NodeKeyType::Secp256k1 => secp256k1::SecretKey::generate().to_bytes().to_vec(), NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec() }; let params = NodeKeyParams { @@ -818,11 +842,11 @@ mod tests { node_key_config(params, &net_config_dir).and_then(|c| match c { NodeKeyConfig::Secp256k1(network::Secret::Input(ref ski)) if node_key_type == NodeKeyType::Secp256k1 && - &sk[..] == ski.as_ref() => Ok(()), + &sk[..] == ski.to_bytes() => Ok(()), NodeKeyConfig::Ed25519(network::Secret::Input(ref ski)) if node_key_type == NodeKeyType::Ed25519 && &sk[..] == ski.as_ref() => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -848,7 +872,7 @@ mod tests { if node_key_type == NodeKeyType::Secp256k1 && f == &file => Ok(()), NodeKeyConfig::Ed25519(network::Secret::File(ref f)) if node_key_type == NodeKeyType::Ed25519 && f == &file => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -882,7 +906,7 @@ mod tests { if typ == NodeKeyType::Secp256k1 => Ok(()), NodeKeyConfig::Ed25519(network::Secret::New) if typ == NodeKeyType::Ed25519 => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -899,7 +923,7 @@ mod tests { NodeKeyConfig::Ed25519(network::Secret::File(ref f)) if typ == NodeKeyType::Ed25519 && f == &dir.join(NODE_KEY_ED25519_FILE) => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 934fb1588912c3c3ea5703b07ea53eae1e9155aa..e7d466a863a4fa7f6e8dd70c5e5ffd083ae97c88 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -20,7 +20,7 @@ use std::path::PathBuf; use structopt::{StructOpt, clap::{arg_enum, _clap_count_exprs, App, AppSettings, SubCommand, Arg}}; use client; -/// Auxialary macro to implement `GetLogFilter` for all types that have the `shared_params` field. +/// Auxiliary macro to implement `GetLogFilter` for all types that have the `shared_params` field. macro_rules! impl_get_log_filter { ( $type:ident ) => { impl $crate::GetLogFilter for $type { @@ -119,7 +119,7 @@ pub struct NetworkConfigurationParams { pub in_peers: u32, /// By default, the network will use mDNS to discover other nodes on the local network. This - /// disables it. + /// disables it. Automatically implied when using --dev. #[structopt(long = "no-mdns")] pub no_mdns: bool, @@ -189,7 +189,7 @@ pub struct NodeKeyParams { raw( possible_values = "&NodeKeyType::variants()", case_insensitive = "true", - default_value = r#""Secp256k1""# + default_value = r#""Ed25519""# ) )] pub node_key_type: NodeKeyType, @@ -313,6 +313,10 @@ pub struct RunCmd { #[structopt(long = "db-cache", value_name = "MiB")] pub database_cache_size: Option, + /// Specify the state cache size + #[structopt(long = "state-cache-size", value_name = "Bytes", default_value = "67108864")] + pub state_cache_size: usize, + /// Listen to all RPC interfaces (default is local) #[structopt(long = "rpc-external")] pub rpc_external: bool, @@ -329,10 +333,15 @@ pub struct RunCmd { #[structopt(long = "ws-port", value_name = "PORT")] pub ws_port: Option, + /// Maximum number of WS RPC server connections. + #[structopt(long = "ws-max-connections", value_name = "COUNT")] + pub ws_max_connections: Option, + /// Specify browser Origins allowed to access the HTTP & WS RPC servers. /// It's a comma-separated list of origins (protocol://domain or special `null` value). /// Value of `all` will disable origin validation. - /// Default is to allow localhost and https://polkadot.js.org origin. + /// Default is to allow localhost, https://polkadot.js.org and https://substrate-ui.parity.io origins. + /// When running in --dev mode the default is to allow all origins. #[structopt(long = "rpc-cors", value_name = "ORIGINS", parse(try_from_str = "parse_cors"))] pub rpc_cors: Option>>, @@ -390,6 +399,10 @@ pub struct RunCmd { /// Enable authoring even when offline. #[structopt(long = "force-authoring")] pub force_authoring: bool, + + /// Interactive password for validator key. + #[structopt(short = "i")] + pub interactive_password: bool, } /// Stores all required Cli values for a keyring test account. @@ -524,11 +537,11 @@ pub struct ExportBlocksCmd { /// Specify starting block number. 1 by default. #[structopt(long = "from", value_name = "BLOCK")] - pub from: Option, + pub from: Option, /// Specify last block number. Best block by default. #[structopt(long = "to", value_name = "BLOCK")] - pub to: Option, + pub to: Option, /// Use JSON output rather than binary. #[structopt(long = "json")] @@ -559,12 +572,12 @@ pub struct ImportBlocksCmd { impl_get_log_filter!(ImportBlocksCmd); -/// The `revert` command used revert the chain to a previos state. +/// The `revert` command used revert the chain to a previous state. #[derive(Debug, StructOpt, Clone)] pub struct RevertCmd { /// Number of blocks to revert. #[structopt(default_value = "256")] - pub num: u64, + pub num: u32, #[allow(missing_docs)] #[structopt(flatten)] diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index d36468c4d75e8e3b55af886ba2b31b4b5cb49d2f..e295894b83fe420d977a3a7149c233898e5d46af 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -1,17 +1,16 @@ [package] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = { version = "0.12", optional = true } +derive_more = { version = "0.14.0", optional = true } fnv = { version = "1.0", optional = true } log = { version = "0.4", optional = true } parking_lot = { version = "0.7.1", optional = true } hex = { package = "hex-literal", version = "0.1", optional = true } futures = { version = "0.1.17", optional = true } -heapsize = { version = "0.4", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } executor = { package = "substrate-executor", path = "../executor", optional = true } state-machine = { package = "substrate-state-machine", path = "../state-machine", optional = true } @@ -44,12 +43,11 @@ std = [ "hash-db/std", "consensus", "parking_lot", - "error-chain", + "derive_more", "fnv", "log", "hex", "futures", - "heapsize", "executor", "state-machine", "keyring", diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 355ed78b9b7a66629182331b60797e7f8b8a3430..3fea4fd8122a23adaea6271bfbd0fa1c71d50119 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-client-db" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/client/db/src/cache/list_cache.rs b/core/client/db/src/cache/list_cache.rs index 1e641534f969c0d63eefe387e98c9ded8bb3c81a..4f343e93fdc93f5dbadf066879b4393be623f076 100644 --- a/core/client/db/src/cache/list_cache.rs +++ b/core/client/db/src/cache/list_cache.rs @@ -43,10 +43,12 @@ use std::collections::BTreeSet; use log::warn; -use client::error::{ErrorKind as ClientErrorKind, Result as ClientResult}; -use runtime_primitives::traits::{Block as BlockT, NumberFor, As, Zero}; +use client::error::{Error as ClientError, Result as ClientResult}; +use runtime_primitives::traits::{ + Block as BlockT, NumberFor, Zero, Bounded, CheckedSub +}; -use crate::cache::{CacheItemT, ComplexBlockId}; +use crate::cache::{CacheItemT, ComplexBlockId, EntryType}; use crate::cache::list_entry::{Entry, StorageEntry}; use crate::cache::list_storage::{Storage, StorageTransaction, Metadata}; @@ -135,7 +137,7 @@ impl> ListCache // BUT since we're not guaranteeing to provide correct values for forks // behind the finalized block, check if the block is finalized first - if !chain::is_finalized_block(&self.storage, at, As::sa(::std::u64::MAX))? { + if !chain::is_finalized_block(&self.storage, at, Bounded::max_value())? { return Ok(None); } @@ -174,10 +176,10 @@ impl> ListCache parent: ComplexBlockId, block: ComplexBlockId, value: Option, - is_final: bool, + entry_type: EntryType, ) -> ClientResult>> { // this guarantee is currently provided by LightStorage && we're relying on it here - debug_assert!(!is_final || self.best_finalized_block.hash == parent.hash); + debug_assert!(entry_type != EntryType::Final || self.best_finalized_block.hash == parent.hash); // we do not store any values behind finalized if block.number != Zero::zero() && self.best_finalized_block.number >= block.number { @@ -185,6 +187,7 @@ impl> ListCache } // if the block is not final, it is possibly appended to/forking from existing unfinalized fork + let is_final = entry_type == EntryType::Final || entry_type == EntryType::Genesis; if !is_final { let mut fork_and_action = None; @@ -348,9 +351,9 @@ impl> ListCache ) { let mut do_pruning = || -> ClientResult<()> { // calculate last ancient block number - let ancient_block = match block.number.as_().checked_sub(self.prune_depth.as_()) { - Some(number) => match self.storage.read_id(As::sa(number))? { - Some(hash) => ComplexBlockId::new(hash, As::sa(number)), + let ancient_block = match block.number.checked_sub(&self.prune_depth) { + Some(number) => match self.storage.read_id(number)? { + Some(hash) => ComplexBlockId::new(hash, number), None => return Ok(()), }, None => return Ok(()), @@ -436,7 +439,7 @@ impl Fork { } } - /// Try to append NEW block to the fork. This method willonly 'work' (return true) when block + /// Try to append NEW block to the fork. This method will only 'work' (return true) when block /// is actually appended to the fork AND the best known block of the fork is known (i.e. some /// block has been already appended to this fork after last restart). pub fn try_append(&self, parent: &ComplexBlockId) -> bool { @@ -537,10 +540,10 @@ mod chain { ) -> ClientResult { let (begin, end) = if block1 > block2 { (block2, block1) } else { (block1, block2) }; let mut current = storage.read_header(&end.hash)? - .ok_or_else(|| ClientErrorKind::UnknownBlock(format!("{}", end.hash)))?; + .ok_or_else(|| ClientError::UnknownBlock(format!("{}", end.hash)))?; while *current.number() > begin.number { current = storage.read_header(current.parent_hash())? - .ok_or_else(|| ClientErrorKind::UnknownBlock(format!("{}", current.parent_hash())))?; + .ok_or_else(|| ClientError::UnknownBlock(format!("{}", current.parent_hash())))?; } Ok(begin.hash == current.hash()) @@ -831,12 +834,27 @@ pub mod tests { #[test] fn list_on_block_insert_works() { + let nfin = EntryType::NonFinal; + let fin = EntryType::Final; + // when trying to insert block < finalized number assert!(ListCache::new(DummyStorage::new(), 1024, test_id(100)) - .on_block_insert(&mut DummyTransaction::new(), test_id(49), test_id(50), Some(50), false).unwrap().is_none()); + .on_block_insert( + &mut DummyTransaction::new(), + test_id(49), + test_id(50), + Some(50), + nfin, + ).unwrap().is_none()); // when trying to insert block @ finalized number assert!(ListCache::new(DummyStorage::new(), 1024, test_id(100)) - .on_block_insert(&mut DummyTransaction::new(), test_id(99), test_id(100), Some(100), false).unwrap().is_none()); + .on_block_insert( + &mut DummyTransaction::new(), + test_id(99), + test_id(100), + Some(100), + nfin, + ).unwrap().is_none()); // when trying to insert non-final block AND it appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block @@ -848,7 +866,7 @@ pub mod tests { ); cache.unfinalized[0].best_block = Some(test_id(4)); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), nfin).unwrap(), Some(CommitOperation::AppendNewBlock(0, test_id(5)))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); @@ -856,7 +874,7 @@ pub mod tests { // when trying to insert non-final block AND it appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), nfin).unwrap(), Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: test_id(5), value: Some(5) }))); assert_eq!(*tx.inserted_entries(), vec![test_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -872,7 +890,7 @@ pub mod tests { 1024, test_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(4), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(4), nfin).unwrap(), Some(CommitOperation::AppendNewBlock(0, correct_id(5)))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); @@ -880,7 +898,7 @@ pub mod tests { // when trying to insert non-final block AND it is the first block that appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(5), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(5), nfin).unwrap(), Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(5), value: Some(5) }))); assert_eq!(*tx.inserted_entries(), vec![correct_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -898,7 +916,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), nfin).unwrap(), Some(CommitOperation::AddNewFork(Entry { valid_from: fork_id(0, 3, 4), value: Some(14) }))); assert_eq!(*tx.inserted_entries(), vec![fork_id(0, 3, 4).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -913,7 +931,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), false).unwrap(), None); + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), nfin).unwrap(), None); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); @@ -926,16 +944,16 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), nfin).unwrap(), Some(CommitOperation::AddNewFork(Entry { valid_from: correct_id(3), value: Some(3) }))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); assert_eq!(*tx.updated_meta(), Some(Metadata { finalized: Some(correct_id(2)), unfinalized: vec![correct_id(3)] })); - // when inserting finalized entry AND there are no previous finalzed entries + // when inserting finalized entry AND there are no previous finalized entries let cache = ListCache::new(DummyStorage::new(), 1024, correct_id(2)); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), Some(Entry { valid_from: correct_id(3), value: Some(3) }), Default::default()))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -948,14 +966,14 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), None, Default::default()))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); // when inserting finalized entry AND value differs from previous finalized let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), Some(Entry { valid_from: correct_id(3), value: Some(3) }), Default::default()))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -970,7 +988,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), None, vec![0].into_iter().collect()))); } @@ -1031,7 +1049,7 @@ pub mod tests { // when new block is appended to unfinalized fork cache.on_transaction_commit(CommitOperation::AppendNewBlock(0, correct_id(6))); assert_eq!(cache.unfinalized[0].best_block, Some(correct_id(6))); - // when new entry is appnded to unfinalized fork + // when new entry is appended to unfinalized fork cache.on_transaction_commit(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(7), value: Some(7) })); assert_eq!(cache.unfinalized[0].best_block, Some(correct_id(7))); assert_eq!(cache.unfinalized[0].head, Entry { valid_from: correct_id(7), value: Some(7) }); diff --git a/core/client/db/src/cache/list_storage.rs b/core/client/db/src/cache/list_storage.rs index 659a30507e136576a844624fa167eb1cfb08ddb9..6271f892bc859059cdc01b44a5d0acd4f3ca67f3 100644 --- a/core/client/db/src/cache/list_storage.rs +++ b/core/client/db/src/cache/list_storage.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use kvdb::{KeyValueDB, DBTransaction}; -use client::error::{Error as ClientError, ErrorKind as ClientErrorKind, Result as ClientResult}; +use client::error::{Error as ClientError, Result as ClientResult}; use parity_codec::{Encode, Decode}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; @@ -59,7 +59,7 @@ pub trait Storage { self.read_entry(at) .and_then(|entry| entry .ok_or_else(|| ClientError::from( - ClientErrorKind::Backend(format!("Referenced cache entry at {:?} is not found", at))))) + ClientError::Backend(format!("Referenced cache entry at {:?} is not found", at))))) } } @@ -151,7 +151,7 @@ impl Storage for DbStorage { .map_err(db_err) .and_then(|entry| match entry { Some(entry) => StorageEntry::::decode(&mut &entry[..]) - .ok_or_else(|| ClientErrorKind::Backend("Failed to decode cache entry".into()).into()) + .ok_or_else(|| ClientError::Backend("Failed to decode cache entry".into())) .map(Some), None => Ok(None), }) @@ -236,9 +236,9 @@ mod meta { pub fn decode(encoded: &[u8]) -> ClientResult> { let input = &mut &*encoded; let finalized: Option> = Decode::decode(input) - .ok_or_else(|| ClientError::from(ClientErrorKind::Backend("Error decoding cache meta".into())))?; + .ok_or_else(|| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; let unfinalized: Vec> = Decode::decode(input) - .ok_or_else(|| ClientError::from(ClientErrorKind::Backend("Error decoding cache meta".into())))?; + .ok_or_else(|| ClientError::from(ClientError::Backend("Error decoding cache meta".into())))?; Ok(Metadata { finalized, unfinalized }) } @@ -253,19 +253,19 @@ pub mod tests { impl Storage for FaultyStorage { fn read_id(&self, _at: NumberFor) -> ClientResult> { - Err(ClientErrorKind::Backend("TestError".into()).into()) + Err(ClientError::Backend("TestError".into())) } fn read_header(&self, _at: &Block::Hash) -> ClientResult> { - Err(ClientErrorKind::Backend("TestError".into()).into()) + Err(ClientError::Backend("TestError".into())) } fn read_meta(&self) -> ClientResult> { - Err(ClientErrorKind::Backend("TestError".into()).into()) + Err(ClientError::Backend("TestError".into())) } fn read_entry(&self, _at: &ComplexBlockId) -> ClientResult>> { - Err(ClientErrorKind::Backend("TestError".into()).into()) + Err(ClientError::Backend("TestError".into())) } } diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index b5dd45f11dd52e69ea715243924ac5e799e038b1..d8ffaea723c8d4d3b52249c23040f0d464ae7083 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -25,9 +25,9 @@ use client::blockchain::Cache as BlockchainCache; use client::error::Result as ClientResult; use parity_codec::{Encode, Decode}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, As}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus_common::well_known_cache_keys::Id as CacheKeyId; -use crate::utils::{self, COLUMN_META}; +use crate::utils::{self, COLUMN_META, db_err}; use self::list_cache::ListCache; @@ -36,7 +36,18 @@ mod list_entry; mod list_storage; /// Minimal post-finalization age age of finalized blocks before they'll pruned. -const PRUNE_DEPTH: u64 = 1024; +const PRUNE_DEPTH: u32 = 1024; + +/// The type of entry that is inserted to the cache. +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum EntryType { + /// Non-final entry. + NonFinal, + /// Final entry. + Final, + /// Genesis entry (inserted during cache initialization). + Genesis, +} /// Block identifier that holds both hash and number. #[derive(Clone, Debug, Encode, Decode, PartialEq)] @@ -70,6 +81,7 @@ pub struct DbCache { key_lookup_column: Option, header_column: Option, authorities_column: Option, + genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, } @@ -80,6 +92,7 @@ impl DbCache { key_lookup_column: Option, header_column: Option, authorities_column: Option, + genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, ) -> Self { Self { @@ -88,10 +101,16 @@ impl DbCache { key_lookup_column, header_column, authorities_column, + genesis_hash, best_finalized_block, } } + /// Set genesis block hash. + pub fn set_genesis_hash(&mut self, genesis_hash: Block::Hash) { + self.genesis_hash = genesis_hash; + } + /// Begin cache transaction. pub fn transaction<'a>(&'a mut self, tx: &'a mut DBTransaction) -> DbCacheTransaction<'a, Block> { DbCacheTransaction { @@ -147,7 +166,7 @@ fn get_cache_helper<'a, Block: BlockT>( cache, }, ), - As::sa(PRUNE_DEPTH), + PRUNE_DEPTH.into(), best_finalized_block.clone(), ) }) @@ -182,7 +201,7 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { parent: ComplexBlockId, block: ComplexBlockId, data_at: HashMap>, - is_final: bool, + entry_type: EntryType, ) -> ClientResult { assert!(self.cache_at_op.is_empty()); @@ -203,7 +222,7 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { parent.clone(), block.clone(), value.or(cache.value_at_block(&parent)?), - is_final, + entry_type, )?; if let Some(op) = op { self.cache_at_op.insert(name, op); @@ -214,8 +233,10 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { data_at.into_iter().try_for_each(|(name, data)| insert_op(name, Some(data)))?; missed_caches.into_iter().try_for_each(|name| insert_op(name, None))?; - if is_final { - self.best_finalized_block = Some(block); + match entry_type { + EntryType::Final | EntryType::Genesis => + self.best_finalized_block = Some(block), + EntryType::NonFinal => (), } Ok(self) @@ -254,6 +275,25 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { pub struct DbCacheSync(pub RwLock>); impl BlockchainCache for DbCacheSync { + fn initialize(&self, key: &CacheKeyId, data: Vec) -> ClientResult<()> { + let mut cache = self.0.write(); + let genesis_hash = cache.genesis_hash; + let cache_contents = vec![(*key, data)].into_iter().collect(); + let db = cache.db.clone(); + let mut dbtx = DBTransaction::new(); + let tx = cache.transaction(&mut dbtx); + let tx = tx.on_block_insert( + ComplexBlockId::new(Default::default(), Zero::zero()), + ComplexBlockId::new(genesis_hash, Zero::zero()), + cache_contents, + EntryType::Genesis, + )?; + let tx_ops = tx.into_ops(); + db.write(dbtx).map_err(db_err)?; + cache.commit(tx_ops); + Ok(()) + } + fn get_at(&self, key: &CacheKeyId, at: &BlockId) -> Option> { let cache = self.0.read(); let storage = cache.cache_at.get(key)?.storage(); diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index ac22bcbb0169c39ba591074cf7c345d9e2f0a7f7..8f54099a784cb615579520ea720a7dcd47352a3e 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -46,7 +46,10 @@ use parking_lot::{Mutex, RwLock}; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, Digest, DigestItem}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, Digest, DigestItem, + SaturatedConversion, +}; use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; use executor::RuntimeInfo; @@ -65,7 +68,6 @@ use client::in_mem::Backend as InMemoryBackend; const CANONICALIZATION_DELAY: u64 = 4096; const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u64 = 32768; -const STATE_CACHE_SIZE_BYTES: usize = 16 * 1024 * 1024; /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; @@ -74,6 +76,8 @@ pub type DbState = state_machine::TrieBackend, + /// State cache size. + pub state_cache_size: usize, /// Path to the database. pub path: PathBuf, /// Pruning mode. @@ -225,7 +229,7 @@ impl client::blockchain::Backend for BlockchainDb { match read_db(&*self.db, columns::KEY_LOOKUP, columns::BODY, id)? { Some(body) => match Decode::decode(&mut &body[..]) { Some(body) => Ok(Some(body)), - None => return Err(client::error::ErrorKind::Backend("Error decoding body".into()).into()), + None => return Err(client::error::Error::Backend("Error decoding body".into())), } None => Ok(None), } @@ -235,7 +239,7 @@ impl client::blockchain::Backend for BlockchainDb { match read_db(&*self.db, columns::KEY_LOOKUP, columns::JUSTIFICATION, id)? { Some(justification) => match Decode::decode(&mut &justification[..]) { Some(justification) => Ok(Some(justification)), - None => return Err(client::error::ErrorKind::Backend("Error decoding justification".into()).into()), + None => return Err(client::error::Error::Backend("Error decoding justification".into())), } None => Ok(None), } @@ -323,29 +327,26 @@ where Block: BlockT, Ok(()) } - fn reset_storage(&mut self, mut top: StorageOverlay, children: ChildrenStorageOverlay) -> Result { + fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> Result { if top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { - return Err(client::error::ErrorKind::GenesisInvalid.into()); + return Err(client::error::Error::GenesisInvalid.into()); } - let mut transaction: PrefixedMemoryDB = Default::default(); - - for (child_key, child_map) in children { + for child_key in children.keys() { if !well_known_keys::is_child_storage_key(&child_key) { - return Err(client::error::ErrorKind::GenesisInvalid.into()); - } - - let (root, is_default, update) = self.old_state.child_storage_root(&child_key, child_map.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); - - if !is_default { - top.insert(child_key, root); + return Err(client::error::Error::GenesisInvalid.into()); } } - let (root, update) = self.old_state.storage_root(top.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); + let child_delta = children.into_iter() + .map(|(storage_key, child_overlay)| + (storage_key, child_overlay.into_iter().map(|(k, v)| (k, Some(v))))); + + let (root, transaction) = self.old_state.full_storage_root( + top.into_iter().map(|(k, v)| (k, Some(v))), + child_delta + ); self.db_updates = transaction; Ok(root) @@ -448,7 +449,7 @@ impl DbChangesTrieStorage { min_blocks_to_keep, &state_machine::ChangesTrieAnchorBlockId { hash: convert_hash(&block_hash), - number: block_num.as_(), + number: block_num.saturated_into::(), }, |node| tx.delete(columns::CHANGES_TRIE, node.as_ref())); } @@ -479,19 +480,19 @@ impl state_machine::ChangesTrieRootsStorage for DbC } // we need to get hash of the block to resolve changes trie root - let block_id = if block <= self.meta.read().finalized_number.as_() { + let block_id = if block <= self.meta.read().finalized_number.saturated_into::() { // if block is finalized, we could just read canonical hash - BlockId::Number(As::sa(block)) + BlockId::Number(block.saturated_into()) } else { // the block is not finalized let mut current_num = anchor.number; let mut current_hash: Block::Hash = convert_hash(&anchor.hash); let maybe_anchor_header: Block::Header = utils::require_header::( - &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Number(As::sa(current_num)) + &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Number(current_num.saturated_into()) ).map_err(|e| e.to_string())?; if maybe_anchor_header.hash() == current_hash { // if anchor is canonicalized, then the block is also canonicalized - BlockId::Number(As::sa(block)) + BlockId::Number(block.saturated_into()) } else { // else (block is not finalized + anchor is not canonicalized): // => we should find the required block hash by traversing @@ -543,7 +544,7 @@ impl> Backend { pub fn new(config: DatabaseSettings, canonicalization_delay: u64) -> Result { let db = open_database(&config, columns::META, "full")?; - Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay) + Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) } #[cfg(any(test, feature = "test-helpers"))] @@ -556,10 +557,11 @@ impl> Backend { db as Arc<_>, PruningMode::keep_blocks(keep_blocks), canonicalization_delay, + 16777216, ).expect("failed to create test-db") } - fn from_kvdb(db: Arc, pruning: PruningMode, canonicalization_delay: u64) -> Result { + fn from_kvdb(db: Arc, pruning: PruningMode, canonicalization_delay: u64, state_cache_size: usize) -> Result { let is_archive_pruning = pruning.is_archive(); let blockchain = BlockchainDb::new(db.clone())?; let meta = blockchain.meta.clone(); @@ -582,7 +584,7 @@ impl> Backend { changes_trie_config: Mutex::new(None), blockchain, canonicalization_delay, - shared_cache: new_shared_cache(STATE_CACHE_SIZE_BYTES), + shared_cache: new_shared_cache(state_cache_size), }) } @@ -684,7 +686,7 @@ impl> Backend { (&r.number, &r.hash) ); - return Err(::client::error::ErrorKind::NotInFinalizedChain.into()); + return Err(::client::error::Error::NotInFinalizedChain.into()); } retracted.push(r.hash.clone()); @@ -726,7 +728,7 @@ impl> Backend { ) -> Result<(), client::error::Error> { let last_finalized = last_finalized.unwrap_or_else(|| self.blockchain.meta.read().finalized_hash); if *header.parent_hash() != last_finalized { - return Err(::client::error::ErrorKind::NonSequentialFinalization( + return Err(::client::error::Error::NonSequentialFinalization( format!("Last finalized {:?} not parent of {:?}", last_finalized, header.hash()), ).into()); } @@ -762,7 +764,7 @@ impl> Backend { Ok((*hash, number, false, true)) } - // performs forced canonicaliziation with a delay after importning a non-finalized block. + // performs forced canonicaliziation with a delay after importing a non-finalized block. fn force_delayed_canonicalize( &self, transaction: &mut DBTransaction, @@ -771,7 +773,7 @@ impl> Backend { ) -> Result<(), client::error::Error> { - let number_u64 = number.as_(); + let number_u64 = number.saturated_into::(); if number_u64 > self.canonicalization_delay { let new_canonical = number_u64 - self.canonicalization_delay; @@ -782,7 +784,7 @@ impl> Backend { let hash = if new_canonical == number_u64 { hash } else { - ::client::blockchain::HeaderBackend::hash(&self.blockchain, As::sa(new_canonical))? + ::client::blockchain::HeaderBackend::hash(&self.blockchain, new_canonical.saturated_into())? .expect("existence of block with number `new_canonical` \ implies existence of blocks with all numbers before it; qed") }; @@ -866,7 +868,7 @@ impl> Backend { changeset.deleted.push(key); } } - let number_u64 = number.as_(); + let number_u64 = number.saturated_into::(); let commit = self.storage.state_db.insert_block(&hash, number_u64, &pending_block.header.parent_hash(), changeset) .map_err(|e: state_db::Error| client::error::Error::from(format!("State database error: {:?}", e)))?; apply_state_commit(&mut transaction, commit); @@ -926,7 +928,7 @@ impl> Backend { (number.clone(), hash.clone()) )?; } else { - return Err(client::error::ErrorKind::UnknownBlock(format!("Cannot set head {:?}", set_head)).into()) + return Err(client::error::Error::UnknownBlock(format!("Cannot set head {:?}", set_head))) } } @@ -979,7 +981,7 @@ impl> Backend { { let f_num = f_header.number().clone(); - if self.storage.state_db.best_canonical().map(|c| f_num.as_() > c).unwrap_or(true) { + if self.storage.state_db.best_canonical().map(|c| f_num.saturated_into::() > c).unwrap_or(true) { let parent_hash = f_header.parent_hash().clone(); let lookup_key = utils::number_and_hash_to_lookup_key(f_num, f_hash.clone()); @@ -1122,28 +1124,26 @@ impl client::backend::Backend for Backend whe } fn revert(&self, n: NumberFor) -> Result, client::error::Error> { - use client::blockchain::HeaderBackend; - let mut best = self.blockchain.info()?.best_number; let finalized = self.blockchain.info()?.finalized_number; let revertible = best - finalized; let n = if revertible < n { revertible } else { n }; - for c in 0 .. n.as_() { - if best == As::sa(0) { - return Ok(As::sa(c)) + for c in 0 .. n.saturated_into::() { + if best.is_zero() { + return Ok(c.saturated_into::>()) } let mut transaction = DBTransaction::new(); match self.storage.state_db.revert_one() { Some(commit) => { apply_state_commit(&mut transaction, commit); let removed = self.blockchain.header(BlockId::Number(best))?.ok_or_else( - || client::error::ErrorKind::UnknownBlock( + || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; - best -= As::sa(1); // prev block + best -= One::one(); // prev block let hash = self.blockchain.hash(best)?.ok_or_else( - || client::error::ErrorKind::UnknownBlock( + || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; let key = utils::number_and_hash_to_lookup_key(best.clone(), &hash); transaction.put(columns::META, meta_keys::BEST_BLOCK, &key); @@ -1153,7 +1153,7 @@ impl client::backend::Backend for Backend whe self.blockchain.update_meta(hash, best, true, false); self.blockchain.leaves.write().revert(removed.hash().clone(), removed.number().clone(), removed.parent_hash().clone()); } - None => return Ok(As::sa(c)) + None => return Ok(c.saturated_into::>()) } } Ok(n) @@ -1163,6 +1163,11 @@ impl client::backend::Backend for Backend whe &self.blockchain } + fn used_state_cache_size(&self) -> Option { + let used = (*&self.shared_cache).lock().used_storage_cache_size(); + Some(used) + } + fn state_at(&self, block: BlockId) -> Result { use client::blockchain::HeaderBackend as BcHeaderBackend; @@ -1180,21 +1185,21 @@ impl client::backend::Backend for Backend whe match self.blockchain.header(block) { Ok(Some(ref hdr)) => { let hash = hdr.hash(); - if !self.storage.state_db.is_pruned(&hash, hdr.number().as_()) { + if !self.storage.state_db.is_pruned(&hash, (*hdr.number()).saturated_into::()) { let root = H256::from_slice(hdr.state_root().as_ref()); let state = DbState::new(self.storage.clone(), root); Ok(CachingState::new(state, self.shared_cache.clone(), Some(hash))) } else { - Err(client::error::ErrorKind::UnknownBlock(format!("State already discarded for {:?}", block)).into()) + Err(client::error::Error::UnknownBlock(format!("State already discarded for {:?}", block))) } }, - Ok(None) => Err(client::error::ErrorKind::UnknownBlock(format!("Unknown state for block {:?}", block)).into()), + Ok(None) => Err(client::error::Error::UnknownBlock(format!("Unknown state for block {:?}", block))), Err(e) => Err(e), } } fn have_state_at(&self, hash: &Block::Hash, number: NumberFor) -> bool { - !self.storage.state_db.is_pruned(hash, number.as_()) + !self.storage.state_db.is_pruned(hash, number.saturated_into::()) } fn destroy_state(&self, mut state: Self::State) -> Result<(), client::error::Error> { @@ -1321,7 +1326,7 @@ mod tests { db.storage.db.clone() }; - let backend = Backend::::from_kvdb(backing, PruningMode::keep_blocks(1), 0).unwrap(); + let backend = Backend::::from_kvdb(backing, PruningMode::keep_blocks(1), 0, 16777216).unwrap(); assert_eq!(backend.blockchain().info().unwrap().best_number, 9); for i in 0..10 { assert!(backend.blockchain().hash(i).unwrap().is_some()) diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 62b6486f54d7ea28ac5561a33aa5b374943e26ec..02525455ba457ea774c4a35efab638b62340e98f 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -17,6 +17,7 @@ //! RocksDB-based light client blockchain storage. use std::{sync::Arc, collections::HashMap}; +use std::convert::TryInto; use parking_lot::RwLock; use kvdb::{KeyValueDB, DBTransaction}; @@ -26,15 +27,16 @@ use client::blockchain::{BlockStatus, Cache as BlockchainCache, HeaderBackend as BlockchainHeaderBackend, Info as BlockchainInfo}; use client::cht; use client::leaves::{LeafSet, FinalizationDisplaced}; -use client::error::{ErrorKind as ClientErrorKind, Result as ClientResult}; +use client::error::{Error as ClientError, Result as ClientResult}; use client::light::blockchain::Storage as LightBlockchainStorage; use parity_codec::{Decode, Encode}; use primitives::Blake2Hasher; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, - Zero, One, As, NumberFor, Digest, DigestItem}; + Zero, One, SaturatedConversion, NumberFor, Digest, DigestItem +}; use consensus_common::well_known_cache_keys; -use crate::cache::{DbCacheSync, DbCache, ComplexBlockId}; +use crate::cache::{DbCacheSync, DbCache, ComplexBlockId, EntryType as CacheEntryType}; use crate::utils::{self, meta_keys, Meta, db_err, open_database, read_db, block_id_to_lookup_key, read_meta}; use crate::DatabaseSettings; @@ -91,6 +93,7 @@ impl LightStorage columns::KEY_LOOKUP, columns::HEADER, columns::CACHE, + meta.genesis_hash, ComplexBlockId::new(meta.finalized_hash, meta.finalized_number), ); @@ -256,7 +259,7 @@ impl LightStorage { ) -> ClientResult<()> { let meta = self.meta.read(); if &meta.finalized_hash != header.parent_hash() { - return Err(::client::error::ErrorKind::NonSequentialFinalization( + return Err(::client::error::Error::NonSequentialFinalization( format!("Last finalized {:?} not parent of {:?}", meta.finalized_hash, hash), ).into()) @@ -270,8 +273,8 @@ impl LightStorage { let new_cht_start: NumberFor = cht::start_number(cht::SIZE, new_cht_number); let new_header_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.as_()..) - .map(|num| self.hash(As::sa(num))) + cht::SIZE, new_cht_number, (new_cht_start.saturated_into::()..) + .map(|num| self.hash(num.saturated_into())) )?; transaction.put( columns::CHT, @@ -282,8 +285,8 @@ impl LightStorage { // if the header includes changes trie root, let's build a changes tries roots CHT if header.digest().log(DigestItem::as_changes_trie_root).is_some() { let new_changes_trie_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.as_()..) - .map(|num| self.changes_trie_root(BlockId::Number(As::sa(num)))) + cht::SIZE, new_cht_number, (new_cht_start.saturated_into::()..) + .map(|num| self.changes_trie_root(BlockId::Number(num.saturated_into()))) )?; transaction.put( columns::CHT, @@ -330,7 +333,7 @@ impl LightStorage { cht_size: u64, block: NumberFor ) -> ClientResult { - let no_cht_for_block = || ClientErrorKind::Backend(format!("CHT for block {} not exists", block)).into(); + let no_cht_for_block = || ClientError::Backend(format!("CHT for block {} not exists", block)); let cht_number = cht::block_to_cht_number(cht_size, block).ok_or_else(no_cht_for_block)?; let cht_start = cht::start_number(cht_size, cht_number); @@ -406,6 +409,7 @@ impl LightBlockchainStorage for LightStorage let is_genesis = number.is_zero(); if is_genesis { + self.cache.0.write().set_genesis_hash(hash); transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); } @@ -434,7 +438,7 @@ impl LightBlockchainStorage for LightStorage ComplexBlockId::new(*header.parent_hash(), if number.is_zero() { Zero::zero() } else { number - One::one() }), ComplexBlockId::new(hash, number), cache_at, - finalized, + if finalized { CacheEntryType::Final } else { CacheEntryType::NonFinal }, )? .into_ops(); @@ -474,7 +478,7 @@ impl LightBlockchainStorage for LightStorage self.db.write(transaction).map_err(db_err)?; Ok(()) } else { - Err(ClientErrorKind::UnknownBlock(format!("Cannot set head {:?}", id)).into()) + Err(ClientError::UnknownBlock(format!("Cannot set head {:?}", id))) } } @@ -514,7 +518,7 @@ impl LightBlockchainStorage for LightStorage Ok(()) } else { - Err(ClientErrorKind::UnknownBlock(format!("Cannot finalize block {:?}", id)).into()) + Err(ClientError::UnknownBlock(format!("Cannot finalize block {:?}", id))) } } @@ -528,7 +532,7 @@ impl LightBlockchainStorage for LightStorage } /// Build the key for inserting header-CHT at given block. -fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { +fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { let mut key = [cht_type; 5]; key[1..].copy_from_slice(&utils::number_index_key(block)); key @@ -1040,4 +1044,24 @@ pub(crate) mod tests { // leaves at same height stay. Leaves at lower heights pruned. assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c]); } + + #[test] + fn cache_can_be_initialized_after_genesis_inserted() { + let db = LightStorage::::new_test(); + + // before cache is initialized => None + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + + // insert genesis block (no value for cache is provided) + insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); + + // after genesis is inserted => None + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + + // initialize cache + db.cache().initialize(b"test", vec![42]).unwrap(); + + // after genesis is inserted + cache is initialized => Some + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), Some(vec![42])); + } } diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index 6cfdbdd09b53db4ea986965550d076831cd07eae..bc0a179cf84f63df68d9a005b539da172f3d5942 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -39,17 +39,40 @@ pub struct Cache { /// Information on the modifications in recently committed blocks; specifically which keys /// changed in which block. Ordered by block number. modifications: VecDeque>, + /// Maximum cache size available, in Bytes. + shared_cache_size: usize, + /// Used storage size, in Bytes. + storage_used_size: usize, +} + +impl Cache { + /// Returns the used memory size of the storage cache in bytes. + pub fn used_storage_cache_size(&self) -> usize { + self.storage_used_size + } } pub type SharedCache = Arc>>; /// Create new shared cache instance with given max memory usage. pub fn new_shared_cache(shared_cache_size: usize) -> SharedCache { - let cache_items = shared_cache_size / 100; // Guestimate, potentially inaccurate + // we need to supply a max capacity to `LruCache`, but since + // we don't have any idea how large the size of each item + // that is stored will be we can't calculate the max amount + // of items properly from `shared_cache_size`. + // + // what we do instead is to supply `shared_cache_size` as the + // max upper bound capacity (this would only be reached if each + // item would be one byte). + // each time we store to the storage cache we verify the memory + // constraint and pop the lru item if space needs to be freed. + Arc::new(Mutex::new(Cache { - storage: LruCache::new(cache_items), - hashes: LruCache::new(cache_items), + storage: LruCache::new(shared_cache_size), + hashes: LruCache::new(shared_cache_size), modifications: VecDeque::new(), + shared_cache_size: shared_cache_size, + storage_used_size: 0, })) } @@ -109,6 +132,33 @@ impl, B: Block> CachingState { } } + fn storage_insert(cache: &mut Cache, k: StorageValue, v: Option) { + if let Some(v_) = &v { + while cache.storage_used_size + v_.len() > cache.shared_cache_size { + // pop until space constraint satisfied + match cache.storage.remove_lru() { + Some((_, Some(popped_v))) => + cache.storage_used_size = cache.storage_used_size - popped_v.len(), + Some((_, None)) => continue, + None => break, + }; + } + cache.storage_used_size = cache.storage_used_size + v_.len(); + } + cache.storage.insert(k, v); + } + + fn storage_remove( + storage: &mut LruCache>, + k: &StorageKey, + storage_used_size: &mut usize, + ) { + let v = storage.remove(k); + if let Some(Some(v_)) = v { + *storage_used_size = *storage_used_size - v_.len(); + } + } + /// Propagate local cache into the shared cache and synchronize /// the shared cache with the best block state. /// This function updates the shared cache by removing entries @@ -139,7 +189,7 @@ impl, B: Block> CachingState { m.is_canon = true; for a in &m.storage { trace!("Reverting enacted key {:?}", a); - cache.storage.remove(a); + CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); } false } else { @@ -155,7 +205,7 @@ impl, B: Block> CachingState { m.is_canon = false; for a in &m.storage { trace!("Retracted key {:?}", a); - cache.storage.remove(a); + CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); } false } else { @@ -178,7 +228,7 @@ impl, B: Block> CachingState { if is_best { trace!("Committing {} local, {} hashes, {} modified entries", local_cache.storage.len(), local_cache.hashes.len(), changes.len()); for (k, v) in local_cache.storage.drain() { - cache.storage.insert(k, v); + CachingState::::storage_insert(cache, k, v); } for (k, v) in local_cache.hashes.drain() { cache.hashes.insert(k, v); @@ -198,7 +248,7 @@ impl, B: Block> CachingState { modifications.insert(k.clone()); if is_best { cache.hashes.remove(&k); - cache.storage.insert(k, v); + CachingState::::storage_insert(cache, k, v); } } // Save modified storage. These are ordered by the block number. @@ -347,10 +397,14 @@ impl, B:Block> StateBackend for CachingState) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { self.state.keys(prefix) } + fn child_keys(&self, child_key: &[u8], prefix: &[u8]) -> Vec> { + self.state.child_keys(child_key, prefix) + } + fn try_into_trie_backend(self) -> Option> { self.state.try_into_trie_backend() } @@ -418,4 +472,38 @@ mod tests { let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert!(s.storage(&key).unwrap().is_none()); } + + #[test] + fn should_track_used_size_correctly() { + let root_parent = H256::random(); + let shared = new_shared_cache::(5); + let h0 = H256::random(); + + let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); + + let key = H256::random()[..].to_vec(); + s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3]))], Some(h0.clone()), Some(0), || true); + assert_eq!(shared.lock().used_storage_cache_size(), 3 /* bytes */); + + let key = H256::random()[..].to_vec(); + s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); + assert_eq!(shared.lock().used_storage_cache_size(), 5 /* bytes */); + } + + #[test] + fn should_remove_lru_items_based_on_tracking_used_size() { + let root_parent = H256::random(); + let shared = new_shared_cache::(5); + let h0 = H256::random(); + + let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); + + let key = H256::random()[..].to_vec(); + s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3, 4]))], Some(h0.clone()), Some(0), || true); + assert_eq!(shared.lock().used_storage_cache_size(), 4 /* bytes */); + + let key = H256::random()[..].to_vec(); + s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); + assert_eq!(shared.lock().used_storage_cache_size(), 2 /* bytes */); + } } diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index ce843a93a2fa4531761d1f94925bb14a23d9f72a..43c559b349298bb5231b502e3959d1270ade7fba 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -19,6 +19,7 @@ use std::sync::Arc; use std::io; +use std::convert::TryInto; use kvdb::{KeyValueDB, DBTransaction}; use kvdb_rocksdb::{Database, DatabaseConfig}; @@ -28,7 +29,10 @@ use client; use parity_codec::Decode; use trie::DBValue; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, Zero}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Zero, UniqueSaturatedFrom, + UniqueSaturatedInto, CheckedConversion +}; use crate::DatabaseSettings; /// Number of columns in the db. Must be the same for both full && light dbs. @@ -78,10 +82,8 @@ pub type NumberIndexKey = [u8; 4]; /// /// In the current database schema, this kind of key is only used for /// lookups into an index, NOT for storing header data or others. -pub fn number_index_key(n: N) -> NumberIndexKey where N: As { - let n: u64 = n.as_(); - assert!(n & 0xffffffff00000000 == 0); - +pub fn number_index_key>(n: N) -> NumberIndexKey { + let n = n.checked_into::().unwrap(); [ (n >> 24) as u8, ((n >> 16) & 0xff) as u8, @@ -93,7 +95,7 @@ pub fn number_index_key(n: N) -> NumberIndexKey where N: As { /// Convert number and hash into long lookup key for blocks that are /// not in the canonical chain. pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where - N: As, + N: TryInto, H: AsRef<[u8]> { let mut lookup_key = number_index_key(number).to_vec(); @@ -103,18 +105,20 @@ pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where /// Convert block lookup key into block number. /// all block lookup keys start with the block number. -pub fn lookup_key_to_number(key: &[u8]) -> client::error::Result where N: As { +pub fn lookup_key_to_number(key: &[u8]) -> client::error::Result where + N: From +{ if key.len() < 4 { - return Err(client::error::ErrorKind::Backend("Invalid block key".into()).into()); + return Err(client::error::Error::Backend("Invalid block key".into())); } - Ok((key[0] as u64) << 24 - | (key[1] as u64) << 16 - | (key[2] as u64) << 8 - | (key[3] as u64)).map(As::sa) + Ok((key[0] as u32) << 24 + | (key[1] as u32) << 16 + | (key[2] as u32) << 8 + | (key[3] as u32)).map(Into::into) } /// Delete number to hash mapping in DB transaction. -pub fn remove_number_to_key_mapping>( +pub fn remove_number_to_key_mapping>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -123,7 +127,7 @@ pub fn remove_number_to_key_mapping>( } /// Remove key mappings. -pub fn remove_key_mappings, H: AsRef<[u8]>>( +pub fn remove_key_mappings, H: AsRef<[u8]>>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -135,7 +139,7 @@ pub fn remove_key_mappings, H: AsRef<[u8]>>( /// Place a number mapping into the database. This maps number to current perceived /// block hash at that position. -pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( +pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -149,7 +153,7 @@ pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( } /// Insert a hash to key mapping in the database. -pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( +pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -171,7 +175,7 @@ pub fn block_id_to_lookup_key( id: BlockId ) -> Result>, client::error::Error> where Block: BlockT, - ::runtime_primitives::traits::NumberFor: As, + ::runtime_primitives::traits::NumberFor: UniqueSaturatedFrom + UniqueSaturatedInto, { let res = match id { BlockId::Number(n) => db.get( @@ -187,21 +191,21 @@ pub fn block_id_to_lookup_key( /// Maps database error to client error pub fn db_err(err: io::Error) -> client::error::Error { use std::error::Error; - client::error::ErrorKind::Backend(err.description().into()).into() + client::error::Error::Backend(err.description().into()) } /// Open RocksDB database. pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: &str) -> client::error::Result> { let mut db_config = DatabaseConfig::with_columns(Some(NUM_COLUMNS)); db_config.memory_budget = config.cache_size; - let path = config.path.to_str().ok_or_else(|| client::error::ErrorKind::Backend("Invalid database path".into()))?; + let path = config.path.to_str().ok_or_else(|| client::error::Error::Backend("Invalid database path".into()))?; let db = Database::open(&db_config, &path).map_err(db_err)?; // check database type match db.get(col_meta, meta_keys::TYPE).map_err(db_err)? { Some(stored_type) => { if db_type.as_bytes() != &*stored_type { - return Err(client::error::ErrorKind::Backend( + return Err(client::error::Error::Backend( format!("Unexpected database type. Expected: {}", db_type)).into()); } }, @@ -237,7 +241,7 @@ pub fn read_header( Some(header) => match Block::Header::decode(&mut &header[..]) { Some(header) => Ok(Some(header)), None => return Err( - client::error::ErrorKind::Backend("Error decoding header".into()).into() + client::error::Error::Backend("Error decoding header".into()) ), } None => Ok(None), @@ -252,7 +256,7 @@ pub fn require_header( id: BlockId, ) -> client::error::Result { read_header(db, col_index, col, id) - .and_then(|header| header.ok_or_else(|| client::error::ErrorKind::UnknownBlock(format!("{}", id)).into())) + .and_then(|header| header.ok_or_else(|| client::error::Error::UnknownBlock(format!("{}", id)))) } /// Read meta from the database. @@ -266,7 +270,7 @@ pub fn read_meta(db: &KeyValueDB, col_meta: Option, col_header: Opti let genesis_hash: Block::Hash = match db.get(col_meta, meta_keys::GENESIS_HASH).map_err(db_err)? { Some(h) => match Decode::decode(&mut &h[..]) { Some(h) => h, - None => return Err(client::error::ErrorKind::Backend("Error decoding genesis hash".into()).into()), + None => return Err(client::error::Error::Backend("Error decoding genesis hash".into())), }, None => return Ok(Meta { best_hash: Default::default(), diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index 8a6ffe4384b2e8c2a858002ec7ccc84deb31959c..09faab1a12fedaed23ce6c3017d471acf5487fa6 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -141,6 +141,8 @@ pub trait Backend: AuxStore + Send + Sync where fn finalize_block(&self, block: BlockId, justification: Option) -> error::Result<()>; /// Returns reference to blockchain backend. fn blockchain(&self) -> &Self::Blockchain; + /// Returns the used state cache, if existent. + fn used_state_cache_size(&self) -> Option; /// Returns reference to changes trie storage. fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage>; /// Returns true if state for given block is available. diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index fd1ce4aefbf85a34bfd6e51bc538e8e139842846..4d40bed9b050e31a68b091666dcbdc3e1da390a3 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -24,10 +24,9 @@ use runtime_primitives::traits::{ }; use primitives::{H256, ExecutionContext}; use crate::blockchain::HeaderBackend; -use crate::runtime_api::Core; +use crate::runtime_api::{Core, ApiExt}; use crate::error; - /// Utility for building new (valid) blocks from a stream of extrinsics. pub struct BlockBuilder<'a, Block, A: ProvideRuntimeApi> where Block: BlockT { header: ::Header, @@ -44,18 +43,28 @@ where { /// Create a new instance of builder from the given client, building on the latest block. pub fn new(api: &'a A) -> error::Result { - api.info().and_then(|i| Self::at_block(&BlockId::Hash(i.best_hash), api)) + api.info().and_then(|i| + Self::at_block(&BlockId::Hash(i.best_hash), api, false) + ) } - /// Create a new instance of builder from the given client using a particular block's ID to - /// build upon. - pub fn at_block(block_id: &BlockId, api: &'a A) -> error::Result { + /// Create a new instance of builder from the given client using a + /// particular block's ID to build upon with optional proof recording enabled. + /// + /// While proof recording is enabled, all accessed trie nodes are saved. + /// These recorded trie nodes can be used by a third party to proof the + /// output of this block builder without having access to the full storage. + pub fn at_block( + block_id: &BlockId, + api: &'a A, + proof_recording: bool + ) -> error::Result { let number = api.block_number_from_id(block_id)? - .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))? + .ok_or_else(|| error::Error::UnknownBlock(format!("{}", block_id)))? + One::one(); let parent_hash = api.block_hash_from_id(block_id)? - .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))?; + .ok_or_else(|| error::Error::UnknownBlock(format!("{}", block_id)))?; let header = <::Header as HeaderT>::new( number, Default::default(), @@ -63,8 +72,17 @@ where parent_hash, Default::default() ); - let api = api.runtime_api(); - api.initialize_block_with_context(block_id, ExecutionContext::BlockConstruction, &header)?; + + let mut api = api.runtime_api(); + + if proof_recording { + api.record_proof(); + } + + api.initialize_block_with_context( + block_id, ExecutionContext::BlockConstruction, &header + )?; + Ok(BlockBuilder { header, extrinsics: Vec::new(), @@ -77,19 +95,21 @@ where /// /// This will ensure the extrinsic can be validly executed (by executing it); pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { - use crate::runtime_api::ApiExt; - let block_id = &self.block_id; let extrinsics = &mut self.extrinsics; self.api.map_api_result(|api| { - match api.apply_extrinsic_with_context(block_id, ExecutionContext::BlockConstruction, xt.clone())? { + match api.apply_extrinsic_with_context( + block_id, + ExecutionContext::BlockConstruction, + xt.clone() + )? { Ok(ApplyOutcome::Success) | Ok(ApplyOutcome::Fail) => { extrinsics.push(xt); Ok(()) } Err(e) => { - Err(error::ErrorKind::ApplyExtrinsicFailed(e).into()) + Err(error::Error::ApplyExtrinsicFailed(e)) } } }) @@ -97,13 +117,34 @@ where /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - self.header = self.api.finalize_block_with_context(&self.block_id, ExecutionContext::BlockConstruction)?; + self.bake_impl()?; + Ok(::new(self.header, self.extrinsics)) + } + + fn bake_impl(&mut self) -> error::Result<()> { + self.header = self.api.finalize_block_with_context( + &self.block_id, ExecutionContext::BlockConstruction + )?; debug_assert_eq!( self.header.extrinsics_root().clone(), - HashFor::::ordered_trie_root(self.extrinsics.iter().map(Encode::encode)), + HashFor::::ordered_trie_root( + self.extrinsics.iter().map(Encode::encode) + ), ); - Ok(::new(self.header, self.extrinsics)) + Ok(()) + } + + /// Consume the builder to return a valid `Block` containing all pushed extrinsics + /// and the generated proof. + /// + /// The proof will be `Some(_)`, if proof recording was enabled while creating + /// the block builder. + pub fn bake_and_extract_proof(mut self) -> error::Result<(Block, Option>>)> { + self.bake_impl()?; + + let proof = self.api.extract_proof(); + Ok((::new(self.header, self.extrinsics), proof)) } } diff --git a/core/client/src/blockchain.rs b/core/client/src/blockchain.rs index 5d7b2a9c231e34ed0b70e9b82013a066f3b27022..d168ecda197c687adba005bad36af0288cb099a4 100644 --- a/core/client/src/blockchain.rs +++ b/core/client/src/blockchain.rs @@ -23,7 +23,7 @@ use runtime_primitives::generic::BlockId; use runtime_primitives::Justification; use consensus::well_known_cache_keys; -use crate::error::{ErrorKind, Result}; +use crate::error::{Error, Result}; /// Blockchain database header backend. Does not perform any validation. pub trait HeaderBackend: Send + Sync { @@ -56,19 +56,19 @@ pub trait HeaderBackend: Send + Sync { /// Get block header. Returns `UnknownBlock` error if block is not found. fn expect_header(&self, id: BlockId) -> Result { - self.header(id)?.ok_or_else(|| ErrorKind::UnknownBlock(format!("{}", id)).into()) + self.header(id)?.ok_or_else(|| Error::UnknownBlock(format!("{}", id))) } /// Convert an arbitrary block ID into a block number. Returns `UnknownBlock` error if block is not found. fn expect_block_number_from_id(&self, id: &BlockId) -> Result> { self.block_number_from_id(id) - .and_then(|n| n.ok_or_else(|| ErrorKind::UnknownBlock(format!("{}", id)).into())) + .and_then(|n| n.ok_or_else(|| Error::UnknownBlock(format!("{}", id)))) } /// Convert an arbitrary block ID into a block hash. Returns `UnknownBlock` error if block is not found. fn expect_block_hash_from_id(&self, id: &BlockId) -> Result { self.block_hash_from_id(id) - .and_then(|n| n.ok_or_else(|| ErrorKind::UnknownBlock(format!("{}", id)).into())) + .and_then(|n| n.ok_or_else(|| Error::UnknownBlock(format!("{}", id)))) } } @@ -100,6 +100,11 @@ pub trait ProvideCache { /// Blockchain optional data cache. pub trait Cache: Send + Sync { + /// Initialize genesis value for the given cache. + /// + /// The operation should be performed once before anything else is inserted in the cache. + /// Otherwise cache may end up in inconsistent state. + fn initialize(&self, key: &well_known_cache_keys::Id, value_at_genesis: Vec) -> Result<()>; /// Returns cached value by the given key. fn get_at(&self, key: &well_known_cache_keys::Id, block: &BlockId) -> Option>; } @@ -196,7 +201,7 @@ pub fn tree_route>( let load_header = |id: BlockId| { match backend.header(id) { Ok(Some(hdr)) => Ok(hdr), - Ok(None) => Err(ErrorKind::UnknownBlock(format!("Unknown block {:?}", id)).into()), + Ok(None) => Err(Error::UnknownBlock(format!("Unknown block {:?}", id))), Err(e) => Err(e), } }; diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index b0bf9b4c2cef21c73b4de2e63d80fa2ef83631be..9a47d1ac21497920dc0f55caf3b57b2053db0a7d 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -14,21 +14,25 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use std::{sync::Arc, cmp::Ord, panic::UnwindSafe, result}; +use std::{sync::Arc, cmp::Ord, panic::UnwindSafe, result, cell::RefCell, rc::Rc}; use parity_codec::{Encode, Decode}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, RuntimeApiInfo}; +use runtime_primitives::{ + generic::BlockId, traits::Block as BlockT, +}; use state_machine::{ - self, OverlayedChanges, Ext, CodeExecutor, ExecutionManager, ExecutionStrategy, NeverOffchainExt, + self, OverlayedChanges, Ext, CodeExecutor, ExecutionManager, + ExecutionStrategy, NeverOffchainExt, backend::Backend as _, }; use executor::{RuntimeVersion, RuntimeInfo, NativeVersion}; use hash_db::Hasher; use trie::MemoryDB; -use primitives::{H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue, OffchainExt}; +use primitives::{ + H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue, OffchainExt +}; +use crate::runtime_api::{ProofRecorder, InitializeBlock}; use crate::backend; use crate::error; -use crate::runtime_api::Core as CoreApi; /// Method call executor. pub trait CallExecutor @@ -60,8 +64,9 @@ where /// Before executing the method, passed header is installed as the current header /// of the execution context. fn contextual_call< + 'a, O: OffchainExt, - PB: Fn() -> error::Result, + IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -70,15 +75,16 @@ where NC: FnOnce() -> result::Result + UnwindSafe, >( &self, + initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, B>, execution_manager: ExecutionManager, native_call: Option, side_effects_handler: Option<&mut O>, + proof_recorder: &Option>>>, ) -> error::Result> where ExecutionManager: Clone; /// Extract RuntimeVersion of given block @@ -119,7 +125,10 @@ where call_data: &[u8] ) -> Result<(Vec, Vec>), error::Error> { let trie_state = state.try_into_trie_backend() - .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; + .ok_or_else(|| + Box::new(state_machine::ExecutionError::UnableToGenerateProof) + as Box + )?; self.prove_at_trie_state(&trie_state, overlay, method, call_data) } @@ -172,7 +181,8 @@ where { type Error = E::Error; - fn call(&self, + fn call( + &self, id: &BlockId, method: &str, call_data: &[u8], @@ -200,8 +210,9 @@ where } fn contextual_call< + 'a, O: OffchainExt, - PB: Fn() -> error::Result, + IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -210,71 +221,82 @@ where NC: FnOnce() -> result::Result + UnwindSafe, >( &self, + initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, execution_manager: ExecutionManager, native_call: Option, - mut side_effects_handler: Option<&mut O>, + side_effects_handler: Option<&mut O>, + recorder: &Option>>>, ) -> Result, error::Error> where ExecutionManager: Clone { + match initialize_block { + InitializeBlock::Do(ref init_block) + if init_block.borrow().as_ref().map(|id| id != at).unwrap_or(true) => { + initialize_block_fn()?; + }, + // We don't need to initialize the runtime at a block. + _ => {}, + } + let state = self.backend.state_at(*at)?; - let core_version = self.runtime_version(at)?.apis.iter().find(|a| a.0 == CoreApi::::ID).map(|a| a.1); - let init_block_function = if core_version < Some(2) { - "Core_initialise_block" - } else { - "Core_initialize_block" - }; + match recorder { + Some(recorder) => { + let trie_state = state.try_into_trie_backend() + .ok_or_else(|| + Box::new(state_machine::ExecutionError::UnableToGenerateProof) + as Box + )?; + + let backend = state_machine::ProvingBackend::new_with_recorder( + &trie_state, + recorder.clone() + ); - if method != init_block_function && initialized_block.map(|id| id != *at).unwrap_or(true) { - let header = prepare_environment_block()?; - state_machine::new( + state_machine::new( + &backend, + self.backend.changes_trie_storage(), + side_effects_handler, + &mut *changes.borrow_mut(), + &self.executor, + method, + call_data, + ) + .execute_using_consensus_failure_handler( + execution_manager, + false, + native_call, + ) + .map(|(result, _, _)| result) + .map_err(Into::into) + } + None => state_machine::new( &state, self.backend.changes_trie_storage(), - side_effects_handler.as_mut().map(|x| &mut **x), - changes, + side_effects_handler, + &mut *changes.borrow_mut(), &self.executor, - init_block_function, - &header.encode(), - ).execute_using_consensus_failure_handler::<_, R, fn() -> _>( - execution_manager.clone(), + method, + call_data, + ) + .execute_using_consensus_failure_handler( + execution_manager, false, - None, - )?; - *initialized_block = Some(*at); - } - - let result = state_machine::new( - &state, - self.backend.changes_trie_storage(), - side_effects_handler, - changes, - &self.executor, - method, - call_data, - ).execute_using_consensus_failure_handler( - execution_manager, - false, - native_call, - ).map(|(result, _, _)| result)?; - - // If the method is `initialize_block` we need to set the `initialized_block` - if method == init_block_function { - *initialized_block = Some(*at); + native_call, + ) + .map(|(result, _, _)| result) + .map_err(Into::into) } - - self.backend.destroy_state(state)?; - Ok(result) } fn runtime_version(&self, id: &BlockId) -> error::Result { let mut overlay = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; let mut ext = Ext::new(&mut overlay, &state, self.backend.changes_trie_storage(), NeverOffchainExt::new()); - self.executor.runtime_version(&mut ext).ok_or(error::ErrorKind::VersionInvalid.into()) + self.executor.runtime_version(&mut ext).ok_or(error::Error::VersionInvalid.into()) } fn call_at_state< diff --git a/core/client/src/children.rs b/core/client/src/children.rs index 48b39d18cdd60d8c11585aae71d30ce1ab9ce335..3a9f0a6bea5b43c9242e9e6a7d9a60b682c74693 100644 --- a/core/client/src/children.rs +++ b/core/client/src/children.rs @@ -32,7 +32,7 @@ pub fn read_children< let raw_val_opt = match db.get(column, &buf[..]) { Ok(raw_val_opt) => raw_val_opt, - Err(_) => return Err(error::ErrorKind::Backend("Error reading value from database".into()).into()), + Err(_) => return Err(error::Error::Backend("Error reading value from database".into())), }; let raw_val = match raw_val_opt { @@ -42,7 +42,7 @@ pub fn read_children< let children: Vec = match Decode::decode(&mut &raw_val[..]) { Some(children) => children, - None => return Err(error::ErrorKind::Backend("Error decoding children".into()).into()), + None => return Err(error::Error::Backend("Error decoding children".into())), }; Ok(children) @@ -118,4 +118,4 @@ mod tests { assert_eq!(r1, vec![1_3, 1_5]); assert_eq!(r2.len(), 0); } -} \ No newline at end of file +} diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index d8e7ffbff33a74ab65539913fa9f23839422660f..42b4654d34f68dbb6e25021a138fe8723e1b543d 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -26,16 +26,20 @@ use std::collections::HashSet; use hash_db; -use heapsize::HeapSizeOf; use trie; use primitives::{H256, convert_hash}; -use runtime_primitives::traits::{As, Header as HeaderT, SimpleArithmetic, One}; +// We're using saturatedconversion in order to go back and forth to `u64`. this is stupid. +// instead we should just make the CHT generic over the block number. +use runtime_primitives::traits::{ + Header as HeaderT, SimpleArithmetic, One, SaturatedConversion, + UniqueSaturatedInto +}; use state_machine::backend::InMemory as InMemoryState; use state_machine::{MemoryDB, TrieBackend, Backend as StateBackend, prove_read_on_trie_backend, read_proof_check, read_proof_check_on_proving_backend}; -use crate::error::{Error as ClientError, ErrorKind as ClientErrorKind, Result as ClientResult}; +use crate::error::{Error as ClientError, Result as ClientResult}; /// The size of each CHT. This value is passed to every CHT-related function from /// production code. Other values are passed from tests. @@ -88,7 +92,7 @@ pub fn build_proof( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, BlocksI: IntoIterator, HashesI: IntoIterator>>, { @@ -120,7 +124,7 @@ pub fn check_proof( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, { do_check_proof::(local_root, local_number, remote_hash, move |local_root, local_cht_key| read_proof_check::(local_root, remote_proof, @@ -137,7 +141,7 @@ pub fn check_proof_on_proving_backend( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, { do_check_proof::(local_root, local_number, remote_hash, |_, local_cht_key| read_proof_check_on_proving_backend::( @@ -154,17 +158,17 @@ fn do_check_proof( where Header: HeaderT, Hasher: hash_db::Hasher, - Hasher::Out: Ord + HeapSizeOf, + Hasher::Out: Ord, F: FnOnce(Hasher::Out, &[u8]) -> ClientResult>>, { let root: Hasher::Out = convert_hash(&local_root); let local_cht_key = encode_cht_key(local_number); let local_cht_value = checker(root, &local_cht_key)?; - let local_cht_value = local_cht_value.ok_or_else(|| ClientErrorKind::InvalidCHTProof)?; - let local_hash = decode_cht_value(&local_cht_value).ok_or_else(|| ClientErrorKind::InvalidCHTProof)?; + let local_cht_value = local_cht_value.ok_or_else(|| ClientError::InvalidCHTProof)?; + let local_hash = decode_cht_value(&local_cht_value).ok_or_else(|| ClientError::InvalidCHTProof)?; match &local_hash[..] == remote_hash.as_ref() { true => Ok(()), - false => Err(ClientErrorKind::InvalidCHTProof.into()), + false => Err(ClientError::InvalidCHTProof.into()), } } @@ -184,9 +188,9 @@ pub fn for_each_cht_group( let mut current_cht_num = None; let mut current_cht_blocks = Vec::new(); for block in blocks { - let new_cht_num = match block_to_cht_number(cht_size, block.as_()) { + let new_cht_num = match block_to_cht_number(cht_size, block.saturated_into()) { Some(new_cht_num) => new_cht_num, - None => return Err(ClientErrorKind::Backend(format!( + None => return Err(ClientError::Backend(format!( "Cannot compute CHT root for the block #{}", block)).into() ), }; @@ -199,7 +203,7 @@ pub fn for_each_cht_group( functor_param = functor( functor_param, - As::sa(current_cht_num), + current_cht_num.saturated_into(), ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -211,7 +215,7 @@ pub fn for_each_cht_group( if let Some(current_cht_num) = current_cht_num { functor( functor_param, - As::sa(current_cht_num), + current_cht_num.saturated_into(), ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -234,7 +238,10 @@ fn build_pairs( let mut hash_number = start_num; for hash in hashes.into_iter().take(cht_size as usize) { let hash = hash?.ok_or_else(|| ClientError::from( - ClientErrorKind::MissingHashRequiredForCHT(cht_num.as_(), hash_number.as_()) + ClientError::MissingHashRequiredForCHT( + cht_num.saturated_into::(), + hash_number.saturated_into::() + ) ))?; pairs.push(( encode_cht_key(hash_number).to_vec(), @@ -246,7 +253,10 @@ fn build_pairs( if pairs.len() as u64 == cht_size { Ok(pairs) } else { - Err(ClientErrorKind::MissingHashRequiredForCHT(cht_num.as_(), hash_number.as_()).into()) + Err(ClientError::MissingHashRequiredForCHT( + cht_num.saturated_into::(), + hash_number.saturated_into::() + )) } } @@ -257,12 +267,12 @@ fn build_pairs( /// This is because the genesis hash is assumed to be known /// and including it would be redundant. pub fn start_number(cht_size: u64, cht_num: N) -> N { - (cht_num * As::sa(cht_size)) + N::one() + (cht_num * cht_size.saturated_into()) + N::one() } /// Get the ending block of a given CHT. pub fn end_number(cht_size: u64, cht_num: N) -> N { - (cht_num + N::one()) * As::sa(cht_size) + (cht_num + N::one()) * cht_size.saturated_into() } /// Convert a block number to a CHT number. @@ -271,13 +281,14 @@ pub fn block_to_cht_number(cht_size: u64, block_num: N) -> if block_num == N::zero() { None } else { - Some((block_num - N::one()) / As::sa(cht_size)) + Some((block_num - N::one()) / cht_size.saturated_into()) } } /// Convert header number into CHT key. -pub fn encode_cht_key>(number: N) -> Vec { - let number: u64 = number.as_(); +pub fn encode_cht_key>(number: N) -> Vec { + // why not just use Encode? + let number: u64 = number.saturated_into(); vec![ (number >> 56) as u8, ((number >> 48) & 0xff) as u8, diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 041933cfffaff9f964adf117dba6022bbffd5fa4..c9f70039eafacead8399924b7e3e131999645ee7 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -16,7 +16,10 @@ //! Substrate Client -use std::{marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, panic::UnwindSafe, result}; +use std::{ + marker::PhantomData, collections::{HashSet, BTreeMap, HashMap}, sync::Arc, + panic::UnwindSafe, result, cell::RefCell, rc::Rc, +}; use crate::error::Error; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; @@ -26,22 +29,31 @@ use runtime_primitives::{ generic::{BlockId, SignedBlock}, }; use consensus::{ - Error as ConsensusError, ErrorKind as ConsensusErrorKind, ImportBlock, ImportResult, - BlockOrigin, ForkChoiceStrategy, well_known_cache_keys::Id as CacheKeyId, + Error as ConsensusError, ImportBlock, + ImportResult, BlockOrigin, ForkChoiceStrategy, + well_known_cache_keys::Id as CacheKeyId, + SelectChain, self, }; use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, As, NumberFor, CurrentHeight, BlockNumberToHash, - ApiRef, ProvideRuntimeApi, Digest, DigestItem + Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, + BlockNumberToHash, ApiRef, ProvideRuntimeApi, Digest, DigestItem, + SaturatedConversion, One }; use runtime_primitives::BuildStorage; -use crate::runtime_api::{CallRuntimeAt, ConstructRuntimeApi}; -use primitives::{Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, NeverNativeValue, ExecutionContext}; +use crate::runtime_api::{ + CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, + InitializeBlock, +}; +use primitives::{ + Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, + NeverNativeValue, ExecutionContext +}; use primitives::storage::{StorageKey, StorageData}; use primitives::storage::well_known_keys; use parity_codec::{Encode, Decode}; use state_machine::{ DBValue, Backend as StateBackend, CodeExecutor, ChangesTrieAnchorBlockId, - ExecutionStrategy, ExecutionManager, prove_read, + ExecutionStrategy, ExecutionManager, prove_read, prove_child_read, ChangesTrieRootsStorage, ChangesTrieStorage, key_changes, key_changes_proof, OverlayedChanges, NeverOffchainExt, }; @@ -49,23 +61,21 @@ use hash_db::Hasher; use crate::backend::{self, BlockImportOperation, PrunableStateChangesTrieStorage}; use crate::blockchain::{ - self, Info as ChainInfo, Backend as ChainBackend, HeaderBackend as ChainHeaderBackend, - ProvideCache, Cache, + self, Info as ChainInfo, Backend as ChainBackend, + HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, }; use crate::call_executor::{CallExecutor, LocalCallExecutor}; use executor::{RuntimeVersion, RuntimeInfo}; use crate::notifications::{StorageNotifications, StorageEventStream}; use crate::light::{call_executor::prove_execution, fetcher::ChangesProof}; use crate::cht; -use crate::error::{self, ErrorKind}; +use crate::error; use crate::in_mem; use crate::block_builder::{self, api::BlockBuilder as BlockBuilderAPI}; use crate::genesis; -use consensus; use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, trace, warn}; -use error_chain::bail; /// Type that implements `futures::Stream` of block import events. pub type ImportNotifications = mpsc::UnboundedReceiver>; @@ -73,7 +83,11 @@ pub type ImportNotifications = mpsc::UnboundedReceiver = mpsc::UnboundedReceiver>; -type StorageUpdate = <<>::BlockImportOperation as BlockImportOperation>::State as state_machine::Backend>::Transaction; +type StorageUpdate = < + < + >::BlockImportOperation + as BlockImportOperation + >::State as state_machine::Backend>::Transaction; type ChangesUpdate = trie::MemoryDB; /// Execution strategies settings. @@ -110,7 +124,7 @@ pub struct Client where Block: BlockT { storage_notifications: Mutex>, import_notification_sinks: Mutex>>>, finality_notification_sinks: Mutex>>>, - import_lock: Mutex<()>, + import_lock: Arc>, // holds the block hash currently being imported. TODO: replace this with block queue importing_block: RwLock>, execution_strategies: ExecutionStrategies, @@ -137,22 +151,17 @@ pub trait BlockchainEvents { /// Get storage changes event stream. /// /// Passing `None` as `filter_keys` subscribes to all storage changes. - fn storage_changes_notification_stream(&self, filter_keys: Option<&[StorageKey]>) -> error::Result>; -} - -/// Chain head information. -pub trait ChainHead { - /// Get best block header. - fn best_block_header(&self) -> Result<::Header, error::Error>; - /// Get all leaves of the chain: block hashes that have no children currently. - /// Leaves that can never be finalized will not be returned. - fn leaves(&self) -> Result::Hash>, error::Error>; + fn storage_changes_notification_stream(&self, + filter_keys: Option<&[StorageKey]> + ) -> error::Result>; } /// Fetch block body by ID. pub trait BlockBody { /// Get block body by ID. Returns `None` if the body is not stored. - fn block_body(&self, id: &BlockId) -> error::Result::Extrinsic>>>; + fn block_body(&self, + id: &BlockId + ) -> error::Result::Extrinsic>>>; } /// Client info @@ -242,16 +251,20 @@ impl PrePostHeader { pub fn new_in_mem( executor: E, genesis_storage: S, -) -> error::Result, LocalCallExecutor, E>, Block, RA>> - where - E: CodeExecutor + RuntimeInfo, - S: BuildStorage, - Block: BlockT, +) -> error::Result, + LocalCallExecutor, E>, + Block, + RA +>> where + E: CodeExecutor + RuntimeInfo, + S: BuildStorage, + Block: BlockT, { new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage) } -/// Create a client with the explicitely provided backend. +/// Create a client with the explicitly provided backend. /// This is useful for testing backend implementations. pub fn new_with_backend( backend: Arc, @@ -286,7 +299,10 @@ impl Client where backend.begin_state_operation(&mut op, BlockId::Hash(Default::default()))?; let state_root = op.reset_storage(genesis_storage, children_genesis_storage)?; let genesis_block = genesis::construct_genesis_block::(state_root.into()); - info!("Initializing Genesis block/state (state: {}, header-hash: {})", genesis_block.header().state_root(), genesis_block.header().hash()); + info!("Initializing Genesis block/state (state: {}, header-hash: {})", + genesis_block.header().state_root(), + genesis_block.header().hash() + ); op.set_block_data( genesis_block.deconstruct().0, Some(vec![]), @@ -320,27 +336,68 @@ impl Client where } /// Expose backend reference. To be used in tests only + #[doc(hidden)] + #[deprecated(note="Rather than relying on `client` to provide this, access \ + to the backend should be handled at setup only - see #1134. This function \ + will be removed once that is in place.")] pub fn backend(&self) -> &Arc { &self.backend } - /// Return storage entry keys in state in a block of given hash with given prefix. + /// Expose reference to import lock + #[doc(hidden)] + #[deprecated(note="Rather than relying on `client` to provide this, access \ + to the backend should be handled at setup only - see #1134. This function \ + will be removed once that is in place.")] + pub fn import_lock(&self) -> Arc> { + self.import_lock.clone() + } + + /// Given a `BlockId` and a key prefix, return the matching child storage keys in that block. pub fn storage_keys(&self, id: &BlockId, key_prefix: &StorageKey) -> error::Result> { let keys = self.state_at(id)?.keys(&key_prefix.0).into_iter().map(StorageKey).collect(); Ok(keys) } - /// Return single storage entry of contract under given address in state in a block of given hash. + /// Given a `BlockId` and a key, return the value under the key in that block. pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result> { Ok(self.state_at(id)? .storage(&key.0).map_err(|e| error::Error::from_state(Box::new(e)))? .map(StorageData)) } + /// Given a `BlockId`, a key prefix, and a child storage key, return the matching child storage keys. + pub fn child_storage_keys( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key_prefix: &StorageKey + ) -> error::Result> { + let keys = self.state_at(id)? + .child_keys(&child_storage_key.0, &key_prefix.0) + .into_iter() + .map(StorageKey) + .collect(); + Ok(keys) + } + + /// Given a `BlockId`, a key and a child storage key, return the value under the key in that block. + pub fn child_storage( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key: &StorageKey + ) -> error::Result> { + Ok(self.state_at(id)? + .child_storage(&child_storage_key.0, &key.0).map_err(|e| error::Error::from_state(Box::new(e)))? + .map(StorageData)) + } + /// Get the code at a given block. pub fn code_at(&self, id: &BlockId) -> error::Result> { Ok(self.storage(id, &StorageKey(well_known_keys::CODE.to_vec()))? - .expect("None is returned if there's no value stored for the given key; ':code' key is always defined; qed").0) + .expect("None is returned if there's no value stored for the given key;\ + ':code' key is always defined; qed").0) } /// Get the RuntimeVersion at a given block. @@ -361,11 +418,29 @@ impl Client where .map_err(Into::into)) } + /// Reads child storage value at a given block + storage_key + key, returning + /// read proof. + pub fn read_child_proof( + &self, + id: &BlockId, + storage_key: &[u8], + key: &[u8] + ) -> error::Result>> { + self.state_at(id) + .and_then(|state| prove_child_read(state, storage_key, key) + .map(|(_, proof)| proof) + .map_err(Into::into)) + } + /// Execute a call to a contract on top of state in a block of given hash /// AND returning execution proof. /// /// No changes are made. - pub fn execution_proof(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result<(Vec, Vec>)> { + pub fn execution_proof(&self, + id: &BlockId, + method: &str, + call_data: &[u8] + ) -> error::Result<(Vec, Vec>)> { let state = self.state_at(id)?; let header = self.prepare_environment_block(id)?; prove_execution(state, header, &self.executor, method, call_data) @@ -377,18 +452,23 @@ impl Client where } /// Get block hash by number. - pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result> { + pub fn block_hash(&self, + block_number: <::Header as HeaderT>::Number + ) -> error::Result> { self.backend.blockchain().hash(block_number) } /// Reads given header and generates CHT-based header proof for CHT of given size. - pub fn header_proof_with_cht_size(&self, id: &BlockId, cht_size: u64) -> error::Result<(Block::Header, Vec>)> { - let proof_error = || error::ErrorKind::Backend(format!("Failed to generate header proof for {:?}", id)); + pub fn header_proof_with_cht_size(&self, + id: &BlockId, + cht_size: u64 + ) -> error::Result<(Block::Header, Vec>)> { + let proof_error = || error::Error::Backend(format!("Failed to generate header proof for {:?}", id)); let header = self.backend.blockchain().expect_header(*id)?; let block_num = *header.number(); let cht_num = cht::block_to_cht_number(cht_size, block_num).ok_or_else(proof_error)?; let cht_start = cht::start_number(cht_size, cht_num); - let headers = (cht_start.as_()..).map(|num| self.block_hash(As::sa(num))); + let headers = (cht_start.saturated_into()..).map(|num| self.block_hash(num.saturated_into())); let proof = cht::build_proof::(cht_size, cht_num, ::std::iter::once(block_num), headers)?; Ok((header, proof)) } @@ -406,14 +486,14 @@ impl Client where Some((config, storage)) => (config, storage), None => return Ok(None), }; - let first = first.as_(); - let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?.as_(); + let first = first.saturated_into::(); + let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?.saturated_into::(); if first > last_num { - return Err(error::ErrorKind::ChangesTrieAccessFailed("Invalid changes trie range".into()).into()); + return Err(error::Error::ChangesTrieAccessFailed("Invalid changes trie range".into())); } let finalized_number = self.backend.blockchain().info()?.finalized_number; - let oldest = storage.oldest_changes_trie_block(&config, finalized_number.as_()); - let first = As::sa(::std::cmp::max(first, oldest)); + let oldest = storage.oldest_changes_trie_block(&config, finalized_number.saturated_into::()); + let first = ::std::cmp::max(first, oldest).saturated_into::>(); Ok(Some((first, last))) } @@ -426,21 +506,21 @@ impl Client where key: &StorageKey ) -> error::Result, u32)>> { let (config, storage) = self.require_changes_trie()?; - let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?.as_(); + let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?.saturated_into::(); let last_hash = self.backend.blockchain().expect_block_hash_from_id(&last)?; key_changes::<_, Blake2Hasher>( &config, &*storage, - first.as_(), + first.saturated_into::(), &ChangesTrieAnchorBlockId { hash: convert_hash(&last_hash), number: last_number, }, - self.backend.blockchain().info()?.best_number.as_(), + self.backend.blockchain().info()?.best_number.saturated_into::(), &key.0) - .and_then(|r| r.map(|r| r.map(|(block, tx)| (As::sa(block), tx))).collect::>()) - .map_err(|err| error::ErrorKind::ChangesTrieAccessFailed(err).into()) + .and_then(|r| r.map(|r| r.map(|(block, tx)| (block.saturated_into(), tx))).collect::>()) + .map_err(|err| error::Error::ChangesTrieAccessFailed(err)) } /// Get proof for computation of (block, extrinsic) pairs where key has been changed at given blocks range. @@ -489,7 +569,7 @@ impl Client where if block < self.min { if let Some(ref root) = root { self.required_roots_proofs.lock().insert( - As::sa(block), + block.saturated_into(), root.clone() ); } @@ -509,7 +589,7 @@ impl Client where let recording_storage = AccessedRootsRecorder:: { storage, - min: min_number.as_(), + min: min_number.saturated_into::(), required_roots_proofs: Mutex::new(BTreeMap::new()), }; @@ -519,8 +599,12 @@ impl Client where ); // fetch key changes proof - let first_number = self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(first))?.as_(); - let last_number = self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(last))?.as_(); + let first_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(first))? + .saturated_into::(); + let last_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(last))? + .saturated_into::(); let key_changes_proof = key_changes_proof::<_, Blake2Hasher>( &config, &recording_storage, @@ -529,10 +613,10 @@ impl Client where hash: convert_hash(&last), number: last_number, }, - max_number.as_(), + max_number.saturated_into::(), &key.0 ) - .map_err(|err| error::Error::from(error::ErrorKind::ChangesTrieAccessFailed(err)))?; + .map_err(|err| error::Error::from(error::Error::ChangesTrieAccessFailed(err)))?; // now gather proofs for all changes tries roots that were touched during key_changes_proof // execution AND are unknown (i.e. replaced with CHT) to the requester @@ -574,7 +658,7 @@ impl Client where blocks: Vec> ) -> error::Result>> { let cht_start = cht::start_number(cht_size, cht_num); - let roots = (cht_start.as_()..).map(|num| self.header(&BlockId::Number(As::sa(num))) + let roots = (cht_start.saturated_into()..).map(|num| self.header(&BlockId::Number(num.saturated_into())) .map(|block| block.and_then(|block| block.digest().log(DigestItem::as_changes_trie_root).cloned()))); let proof = cht::build_proof::(cht_size, cht_num, blocks, roots)?; Ok(proof) @@ -586,7 +670,7 @@ impl Client where let storage = self.backend.changes_trie_storage(); match (config, storage) { (Some(config), Some(storage)) => Ok((config, storage)), - _ => Err(error::ErrorKind::ChangesTriesNotSupported.into()), + _ => Err(error::Error::ChangesTriesNotSupported.into()), } } @@ -611,7 +695,23 @@ impl Client where Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::at_block(parent, &self) + block_builder::BlockBuilder::at_block(parent, &self, false) + } + + /// Create a new block, built on top of `parent` with proof recording enabled. + /// + /// While proof recording is enabled, all accessed trie nodes are saved. + /// These recorded trie nodes can be used by a third party to proof the + /// output of this block builder without having access to the full storage. + pub fn new_block_at_with_proof_recording( + &self, parent: &BlockId + ) -> error::Result> where + E: Clone + Send + Sync, + RA: Send + Sync, + Self: ProvideRuntimeApi, + ::Api: BlockBuilderAPI + { + block_builder::BlockBuilder::at_block(parent, &self, true) } /// Lock the import lock, and run operations inside. @@ -676,8 +776,6 @@ impl Client where ) -> error::Result where E: CallExecutor + Send + Sync + Clone, { - use runtime_primitives::traits::Digest; - let ImportBlock { origin, header, @@ -709,7 +807,7 @@ impl Client where }; let hash = import_headers.post().hash(); - let height: u64 = import_headers.post().number().as_(); + let height = (*import_headers.post().number()).saturated_into::(); *self.importing_block.write() = Some(hash); @@ -910,7 +1008,7 @@ impl Client where warn!("Safety violation: attempted to revert finalized block {:?} which is not in the \ same chain as last finalized {:?}", retracted, last_finalized); - bail!(error::ErrorKind::NotInFinalizedChain); + return Err(error::Error::NotInFinalizedChain); } let route_from_best = crate::blockchain::tree_route( @@ -959,6 +1057,11 @@ impl Client where let header = self.header(&BlockId::Hash(finalized_hash))? .expect("header already known to exist in DB because it is indicated in the tree route; qed"); + telemetry!(SUBSTRATE_INFO; "notify.finalized"; + "height" => format!("{}", header.number()), + "best" => ?finalized_hash, + ); + let notification = FinalityNotification { header, hash: finalized_hash, @@ -1074,7 +1177,7 @@ impl Client where }; match hash_and_number { Some((hash, number)) => { - if self.backend().have_state_at(&hash, number) { + if self.backend.have_state_at(&hash, number) { Ok(BlockStatus::InChainWithState) } else { Ok(BlockStatus::InChainPruned) @@ -1110,138 +1213,12 @@ impl Client where }) } - /// Get best block header. - pub fn best_block_header(&self) -> error::Result<::Header> { - let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; - Ok(self.header(&BlockId::Hash(info.best_hash))?.expect("Best block header must always exist")) - } - - /// Get the most recent block hash of the best (longest) chains - /// that contain block with the given `target_hash`. - /// - /// The search space is always limited to blocks which are in the finalized - /// chain or descendents of it. - /// - /// If `maybe_max_block_number` is `Some(max_block_number)` - /// the search is limited to block `numbers <= max_block_number`. - /// in other words as if there were no blocks greater `max_block_number`. - /// TODO : we want to move this implement to `blockchain::Backend`, see [#1443](https://github.com/paritytech/substrate/issues/1443) - /// Returns `Ok(None)` if `target_hash` is not found in search space. - /// TODO: document time complexity of this, see [#1444](https://github.com/paritytech/substrate/issues/1444) - pub fn best_containing(&self, target_hash: Block::Hash, maybe_max_number: Option>) - -> error::Result> - { - let target_header = { - match self.backend.blockchain().header(BlockId::Hash(target_hash))? { - Some(x) => x, - // target not in blockchain - None => { return Ok(None); }, - } - }; - - if let Some(max_number) = maybe_max_number { - // target outside search range - if target_header.number() > &max_number { - return Ok(None); - } - } - - let (leaves, best_already_checked) = { - // ensure no blocks are imported during this code block. - // an import could trigger a reorg which could change the canonical chain. - // we depend on the canonical chain staying the same during this code block. - let _import_lock = self.import_lock.lock(); - - let info = self.backend.blockchain().info()?; - - let canon_hash = self.backend.blockchain().hash(*target_header.number())? - .ok_or_else(|| error::Error::from(format!("failed to get hash for block number {}", target_header.number())))?; - - if canon_hash == target_hash { - // if no block at the given max depth exists fallback to the best block - if let Some(max_number) = maybe_max_number { - if let Some(header) = self.backend.blockchain().hash(max_number)? { - return Ok(Some(header)); - } - } - - return Ok(Some(info.best_hash)); - } else if info.finalized_number >= *target_header.number() { - // header is on a dead fork. - return Ok(None); - } - - (self.backend.blockchain().leaves()?, info.best_hash) - }; - - // for each chain. longest chain first. shortest last - for leaf_hash in leaves { - // ignore canonical chain which we already checked above - if leaf_hash == best_already_checked { - continue; - } - - // start at the leaf - let mut current_hash = leaf_hash; - - // if search is not restricted then the leaf is the best - let mut best_hash = leaf_hash; - - // go backwards entering the search space - // waiting until we are <= max_number - if let Some(max_number) = maybe_max_number { - loop { - let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? - .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; - - if current_header.number() <= &max_number { - best_hash = current_header.hash(); - break; - } - - current_hash = *current_header.parent_hash(); - } - } - - // go backwards through the chain (via parent links) - loop { - // until we find target - if current_hash == target_hash { - return Ok(Some(best_hash)); - } - - let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? - .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; - - // stop search in this chain once we go below the target's block number - if current_header.number() < target_header.number() { - break; - } - - current_hash = *current_header.parent_hash(); - } - } - - // header may be on a dead fork -- the only leaves that are considered are - // those which can still be finalized. - // - // FIXME #1558 only issue this warning when not on a dead fork - warn!( - "Block {:?} exists in chain but not found when following all \ - leaves backwards. Number limit = {:?}", - target_hash, - maybe_max_number, - ); - - Ok(None) - } - /// Gets the uncles of the block with `target_hash` going back `max_generation` ancestors. pub fn uncles(&self, target_hash: Block::Hash, max_generation: NumberFor) -> error::Result> { let load_header = |id: Block::Hash| -> error::Result { match self.backend.blockchain().header(BlockId::Hash(id))? { Some(hdr) => Ok(hdr), - None => Err(ErrorKind::UnknownBlock(format!("Unknown block {:?}", id)).into()), + None => Err(Error::UnknownBlock(format!("Unknown block {:?}", id))), } }; @@ -1254,7 +1231,7 @@ impl Client where let mut ancestor = load_header(ancestor_hash)?; let mut uncles = Vec::new(); - for _generation in 0..max_generation.as_() { + for _generation in 0..max_generation.saturated_into() { let children = self.backend.blockchain().children(ancestor_hash)?; uncles.extend(children.into_iter().filter(|h| h != ¤t_hash)); current_hash = ancestor_hash; @@ -1277,7 +1254,7 @@ impl Client where /// Prepare in-memory header that is used in execution environment. fn prepare_environment_block(&self, parent: &BlockId) -> error::Result { Ok(<::Header as HeaderT>::new( - self.backend.blockchain().expect_block_number_from_id(parent)? + As::sa(1), + self.backend.blockchain().expect_block_number_from_id(parent)? + One::one(), Default::default(), Default::default(), self.backend.blockchain().expect_block_hash_from_id(&parent)?, @@ -1338,27 +1315,36 @@ impl ProvideRuntimeApi for Client where impl CallRuntimeAt for Client where B: backend::Backend, E: CallExecutor + Clone + Send + Sync, - Block: BlockT + Block: BlockT, { fn call_api_at< + 'a, R: Encode + Decode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, + C: CoreApi, >( &self, + core_api: &C, at: &BlockId, function: &'static str, args: Vec, - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, native_call: Option, context: ExecutionContext, + recorder: &Option>>>, ) -> error::Result> { let manager = match context { - ExecutionContext::BlockConstruction => self.execution_strategies.block_construction.get_manager(), - ExecutionContext::Syncing => self.execution_strategies.syncing.get_manager(), - ExecutionContext::Importing => self.execution_strategies.importing.get_manager(), - ExecutionContext::OffchainWorker(_) => self.execution_strategies.offchain_worker.get_manager(), - ExecutionContext::Other => self.execution_strategies.other.get_manager(), + ExecutionContext::BlockConstruction => + self.execution_strategies.block_construction.get_manager(), + ExecutionContext::Syncing => + self.execution_strategies.syncing.get_manager(), + ExecutionContext::Importing => + self.execution_strategies.importing.get_manager(), + ExecutionContext::OffchainWorker(_) => + self.execution_strategies.offchain_worker.get_manager(), + ExecutionContext::Other => + self.execution_strategies.other.get_manager(), }; let mut offchain_extensions = match context { @@ -1367,15 +1353,16 @@ impl CallRuntimeAt for Client where }; self.executor.contextual_call::<_, _, fn(_,_) -> _,_,_>( + || core_api.initialize_block(at, &self.prepare_environment_block(at)?), at, function, &args, changes, - initialized_block, - || self.prepare_environment_block(at), + initialize_block, manager, native_call, offchain_extensions.as_mut(), + recorder, ) } @@ -1400,7 +1387,7 @@ impl consensus::BlockImport for Client ) -> Result { self.lock_import_and_run(|operation| { self.apply_block(operation, import_block, new_cache) - }).map_err(|e| ConsensusErrorKind::ClientImport(e.to_string()).into()) + }).map_err(|e| ConsensusError::ClientImport(e.to_string()).into()) } /// Check block preconditions. @@ -1410,7 +1397,7 @@ impl consensus::BlockImport for Client parent_hash: Block::Hash, ) -> Result { match self.block_status(&BlockId::Hash(parent_hash)) - .map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? { BlockStatus::InChainWithState | BlockStatus::Queued => {}, BlockStatus::Unknown | BlockStatus::InChainPruned => return Ok(ImportResult::UnknownParent), @@ -1418,7 +1405,7 @@ impl consensus::BlockImport for Client } match self.block_status(&BlockId::Hash(hash)) - .map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? { BlockStatus::InChainWithState | BlockStatus::Queued => return Ok(ImportResult::AlreadyInChain), BlockStatus::Unknown | BlockStatus::InChainPruned => {}, @@ -1477,14 +1464,168 @@ where } } -impl ChainHead for Client +/// Implement Longest Chain Select implementation +/// where 'longest' is defined as the highest number of blocks +pub struct LongestChain { + backend: Arc, + import_lock: Arc>, + _phantom: PhantomData +} + +impl Clone for LongestChain { + fn clone(&self) -> Self { + let backend = self.backend.clone(); + let import_lock = self.import_lock.clone(); + LongestChain { + backend, + import_lock, + _phantom: Default::default() + } + } +} + +impl LongestChain where B: backend::Backend, - E: CallExecutor, Block: BlockT, { + /// Instantiate a new LongestChain for Backend B + pub fn new(backend: Arc, import_lock: Arc>) -> Self { + LongestChain { + backend, + import_lock, + _phantom: Default::default() + } + } + fn best_block_header(&self) -> error::Result<::Header> { - Client::best_block_header(self) + let info : ChainInfo = match self.backend.blockchain().info() { + Ok(i) => i, + Err(e) => return Err(error::Error::from_blockchain(Box::new(e))) + }; + Ok(self.backend.blockchain().header(BlockId::Hash(info.best_hash))? + .expect("Best block header must always exist")) + } + + /// Get the most recent block hash of the best (longest) chains + /// that contain block with the given `target_hash`. + /// + /// The search space is always limited to blocks which are in the finalized + /// chain or descendents of it. + /// + /// If `maybe_max_block_number` is `Some(max_block_number)` + /// the search is limited to block `numbers <= max_block_number`. + /// in other words as if there were no blocks greater `max_block_number`. + /// Returns `Ok(None)` if `target_hash` is not found in search space. + /// TODO: document time complexity of this, see [#1444](https://github.com/paritytech/substrate/issues/1444) + fn best_containing( + &self, + target_hash: Block::Hash, + maybe_max_number: Option> + ) -> error::Result> { + let target_header = { + match self.backend.blockchain().header(BlockId::Hash(target_hash))? { + Some(x) => x, + // target not in blockchain + None => { return Ok(None); }, + } + }; + + if let Some(max_number) = maybe_max_number { + // target outside search range + if target_header.number() > &max_number { + return Ok(None); + } + } + + let (leaves, best_already_checked) = { + // ensure no blocks are imported during this code block. + // an import could trigger a reorg which could change the canonical chain. + // we depend on the canonical chain staying the same during this code block. + let _import_lock = self.import_lock.lock(); + + let info = self.backend.blockchain().info()?; + + let canon_hash = self.backend.blockchain().hash(*target_header.number())? + .ok_or_else(|| error::Error::from(format!("failed to get hash for block number {}", target_header.number())))?; + + if canon_hash == target_hash { + // if no block at the given max depth exists fallback to the best block + if let Some(max_number) = maybe_max_number { + if let Some(header) = self.backend.blockchain().hash(max_number)? { + return Ok(Some(header)); + } + } + + return Ok(Some(info.best_hash)); + } else if info.finalized_number >= *target_header.number() { + // header is on a dead fork. + return Ok(None); + } + + (self.backend.blockchain().leaves()?, info.best_hash) + }; + + // for each chain. longest chain first. shortest last + for leaf_hash in leaves { + // ignore canonical chain which we already checked above + if leaf_hash == best_already_checked { + continue; + } + + // start at the leaf + let mut current_hash = leaf_hash; + + // if search is not restricted then the leaf is the best + let mut best_hash = leaf_hash; + + // go backwards entering the search space + // waiting until we are <= max_number + if let Some(max_number) = maybe_max_number { + loop { + let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? + .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; + + if current_header.number() <= &max_number { + best_hash = current_header.hash(); + break; + } + + current_hash = *current_header.parent_hash(); + } + } + + // go backwards through the chain (via parent links) + loop { + // until we find target + if current_hash == target_hash { + return Ok(Some(best_hash)); + } + + let current_header = self.backend.blockchain().header(BlockId::Hash(current_hash.clone()))? + .ok_or_else(|| error::Error::from(format!("failed to get header for hash {}", current_hash)))?; + + // stop search in this chain once we go below the target's block number + if current_header.number() < target_header.number() { + break; + } + + current_hash = *current_header.parent_hash(); + } + } + + // header may be on a dead fork -- the only leaves that are considered are + // those which can still be finalized. + // + // FIXME #1558 only issue this warning when not on a dead fork + warn!( + "Block {:?} exists in chain but not found when following all \ + leaves backwards. Number limit = {:?}", + target_hash, + maybe_max_number, + ); + + Ok(None) } fn leaves(&self) -> Result::Hash>, error::Error> { @@ -1492,6 +1633,34 @@ where } } +impl SelectChain for LongestChain +where + B: backend::Backend, + Block: BlockT, +{ + + fn leaves(&self) -> Result::Hash>, ConsensusError> { + LongestChain::leaves(self) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) + } + + fn best_chain(&self) + -> Result<::Header, ConsensusError> + { + LongestChain::best_block_header(&self) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) + } + + fn finality_target( + &self, + target_hash: Block::Hash, + maybe_max_number: Option> + ) -> Result, ConsensusError> { + LongestChain::best_containing(self, target_hash, maybe_max_number) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) + } +} + impl BlockBody for Client where B: backend::Backend, @@ -1534,11 +1703,11 @@ impl backend::AuxStore for Client pub(crate) mod tests { use std::collections::HashMap; use super::*; - use primitives::twox_128; + use primitives::blake2_256; use runtime_primitives::traits::DigestItem as DigestItemT; use runtime_primitives::generic::DigestItem; use test_client::{self, TestClient, AccountKeyring}; - use consensus::BlockOrigin; + use consensus::{BlockOrigin, SelectChain}; use test_client::client::backend::Backend as TestBackend; use test_client::BlockBuilderExt; use test_client::runtime::{self, Block, Transfer, RuntimeApi, TestAPI}; @@ -1584,12 +1753,12 @@ pub(crate) mod tests { } // prepare test cases - let alice = twox_128(&runtime::system::balance_of_key(AccountKeyring::Alice.into())).to_vec(); - let bob = twox_128(&runtime::system::balance_of_key(AccountKeyring::Bob.into())).to_vec(); - let charlie = twox_128(&runtime::system::balance_of_key(AccountKeyring::Charlie.into())).to_vec(); - let dave = twox_128(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); - let eve = twox_128(&runtime::system::balance_of_key(AccountKeyring::Eve.into())).to_vec(); - let ferdie = twox_128(&runtime::system::balance_of_key(AccountKeyring::Ferdie.into())).to_vec(); + let alice = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Alice.into())).to_vec(); + let bob = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Bob.into())).to_vec(); + let charlie = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Charlie.into())).to_vec(); + let dave = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); + let eve = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Eve.into())).to_vec(); + let ferdie = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Ferdie.into())).to_vec(); let test_cases = vec![ (1, 4, alice.clone(), vec![(4, 0), (1, 0)]), (1, 3, alice.clone(), vec![(1, 0)]), @@ -1715,8 +1884,14 @@ pub(crate) mod tests { let client = test_client::new(); let genesis_hash = client.info().unwrap().chain.genesis_hash; + let longest_chain_select = test_client::client::LongestChain::new( + client.backend().clone(), + client.import_lock() + ); + - assert_eq!(genesis_hash.clone(), client.best_containing(genesis_hash.clone(), None).unwrap().unwrap()); + assert_eq!(genesis_hash.clone(), longest_chain_select.finality_target( + genesis_hash.clone(), None).unwrap().unwrap()); } #[test] @@ -1727,8 +1902,13 @@ pub(crate) mod tests { let client = test_client::new(); let uninserted_block = client.new_block().unwrap().bake().unwrap(); + let backend = client.backend().as_in_memory(); + let longest_chain_select = test_client::client::LongestChain::new( + Arc::new(backend), + client.import_lock()); - assert_eq!(None, client.best_containing(uninserted_block.hash().clone(), None).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + uninserted_block.hash().clone(), None).unwrap()); } #[test] @@ -1843,7 +2023,7 @@ pub(crate) mod tests { } #[test] - fn best_containing_with_single_chain_3_blocks() { + fn best_containing_on_longest_chain_with_single_chain_3_blocks() { // block tree: // G -> A1 -> A2 @@ -1859,18 +2039,20 @@ pub(crate) mod tests { let genesis_hash = client.info().unwrap().chain.genesis_hash; - assert_eq!(a2.hash(), client.best_containing(genesis_hash, None).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a1.hash(), None).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a2.hash(), None).unwrap().unwrap()); + let longest_chain_select = test_client::client::LongestChain::new( + Arc::new(client.backend().as_in_memory()), + client.import_lock()); + + assert_eq!(a2.hash(), longest_chain_select.finality_target( + genesis_hash, None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + a1.hash(), None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + a2.hash(), None).unwrap().unwrap()); } #[test] - fn best_containing_with_multiple_forks() { - // NOTE: we use the version of the trait from `test_client` - // because that is actually different than the version linked to - // in the test facade crate. - use test_client::blockchain::Backend as BlockchainBackendT; - + fn best_containing_on_longest_chain_with_multiple_forks() { // block tree: // G -> A1 -> A2 -> A3 -> A4 -> A5 // A1 -> B2 -> B3 -> B4 @@ -1945,7 +2127,11 @@ pub(crate) mod tests { assert_eq!(client.info().unwrap().chain.best_hash, a5.hash()); let genesis_hash = client.info().unwrap().chain.genesis_hash; - let leaves = BlockchainBackendT::leaves(client.backend().blockchain()).unwrap(); + let longest_chain_select = test_client::client::LongestChain::new( + Arc::new(client.backend().as_in_memory()), + client.import_lock()); + + let leaves = longest_chain_select.leaves().unwrap(); assert!(leaves.contains(&a5.hash())); assert!(leaves.contains(&b4.hash())); @@ -1955,131 +2141,208 @@ pub(crate) mod tests { // search without restriction - assert_eq!(a5.hash(), client.best_containing(genesis_hash, None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a1.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a2.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a3.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a4.hash(), None).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a5.hash(), None).unwrap().unwrap()); - - assert_eq!(b4.hash(), client.best_containing(b2.hash(), None).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b3.hash(), None).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b4.hash(), None).unwrap().unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), None).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + genesis_hash, None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a1.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a2.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a3.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a4.hash(), None).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a5.hash(), None).unwrap().unwrap()); + + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b2.hash(), None).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b3.hash(), None).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b4.hash(), None).unwrap().unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), None).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), None).unwrap().unwrap()); // search only blocks with number <= 5. equivalent to without restriction for this scenario - assert_eq!(a5.hash(), client.best_containing(genesis_hash, Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a1.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a2.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a3.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a4.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(a5.hash(), client.best_containing(a5.hash(), Some(5)).unwrap().unwrap()); - - assert_eq!(b4.hash(), client.best_containing(b2.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b3.hash(), Some(5)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b4.hash(), Some(5)).unwrap().unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), Some(5)).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + genesis_hash, Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a1.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a2.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a3.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a4.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(a5.hash(), longest_chain_select.finality_target( + a5.hash(), Some(5)).unwrap().unwrap()); + + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b2.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b3.hash(), Some(5)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b4.hash(), Some(5)).unwrap().unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), Some(5)).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(5)).unwrap().unwrap()); // search only blocks with number <= 4 - assert_eq!(a4.hash(), client.best_containing(genesis_hash, Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a1.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a2.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a3.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(a4.hash(), client.best_containing(a4.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(4)).unwrap()); - - assert_eq!(b4.hash(), client.best_containing(b2.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b3.hash(), Some(4)).unwrap().unwrap()); - assert_eq!(b4.hash(), client.best_containing(b4.hash(), Some(4)).unwrap().unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), Some(4)).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + genesis_hash, Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a1.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a2.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a3.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(a4.hash(), longest_chain_select.finality_target( + a4.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(4)).unwrap()); + + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b2.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b3.hash(), Some(4)).unwrap().unwrap()); + assert_eq!(b4.hash(), longest_chain_select.finality_target( + b4.hash(), Some(4)).unwrap().unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), Some(4)).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(4)).unwrap().unwrap()); // search only blocks with number <= 3 - assert_eq!(a3.hash(), client.best_containing(genesis_hash, Some(3)).unwrap().unwrap()); - assert_eq!(a3.hash(), client.best_containing(a1.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(a3.hash(), client.best_containing(a2.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(a3.hash(), client.best_containing(a3.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(3)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(3)).unwrap()); - - assert_eq!(b3.hash(), client.best_containing(b2.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(b3.hash(), client.best_containing(b3.hash(), Some(3)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(3)).unwrap()); - - assert_eq!(c3.hash(), client.best_containing(c3.hash(), Some(3)).unwrap().unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + genesis_hash, Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + a1.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + a2.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(a3.hash(), longest_chain_select.finality_target( + a3.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(3)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(3)).unwrap()); + + assert_eq!(b3.hash(), longest_chain_select.finality_target( + b2.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(b3.hash(), longest_chain_select.finality_target( + b3.hash(), Some(3)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(3)).unwrap()); + + assert_eq!(c3.hash(), longest_chain_select.finality_target( + c3.hash(), Some(3)).unwrap().unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(3)).unwrap().unwrap()); // search only blocks with number <= 2 - assert_eq!(a2.hash(), client.best_containing(genesis_hash, Some(2)).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a1.hash(), Some(2)).unwrap().unwrap()); - assert_eq!(a2.hash(), client.best_containing(a2.hash(), Some(2)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a3.hash(), Some(2)).unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(2)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(2)).unwrap()); - - assert_eq!(b2.hash(), client.best_containing(b2.hash(), Some(2)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(b3.hash(), Some(2)).unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(2)).unwrap()); - - assert_eq!(None, client.best_containing(c3.hash(), Some(2)).unwrap()); - - assert_eq!(d2.hash(), client.best_containing(d2.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + genesis_hash, Some(2)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + a1.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + a2.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a3.hash(), Some(2)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(2)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(2)).unwrap()); + + assert_eq!(b2.hash(), longest_chain_select.finality_target( + b2.hash(), Some(2)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b3.hash(), Some(2)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(2)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + c3.hash(), Some(2)).unwrap()); + + assert_eq!(d2.hash(), longest_chain_select.finality_target( + d2.hash(), Some(2)).unwrap().unwrap()); // search only blocks with number <= 1 - assert_eq!(a1.hash(), client.best_containing(genesis_hash, Some(1)).unwrap().unwrap()); - assert_eq!(a1.hash(), client.best_containing(a1.hash(), Some(1)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a2.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(a3.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(1)).unwrap()); - - assert_eq!(None, client.best_containing(b2.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(b3.hash(), Some(1)).unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(1)).unwrap()); - - assert_eq!(None, client.best_containing(c3.hash(), Some(1)).unwrap()); - - assert_eq!(None, client.best_containing(d2.hash(), Some(1)).unwrap()); + assert_eq!(a1.hash(), longest_chain_select.finality_target( + genesis_hash, Some(1)).unwrap().unwrap()); + assert_eq!(a1.hash(), longest_chain_select.finality_target( + a1.hash(), Some(1)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a2.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a3.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(1)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + b2.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b3.hash(), Some(1)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(1)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + c3.hash(), Some(1)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + d2.hash(), Some(1)).unwrap()); // search only blocks with number <= 0 - assert_eq!(genesis_hash, client.best_containing(genesis_hash, Some(0)).unwrap().unwrap()); - assert_eq!(None, client.best_containing(a1.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a2.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a3.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a4.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(a5.hash(), Some(0)).unwrap()); - - assert_eq!(None, client.best_containing(b2.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(b3.hash(), Some(0)).unwrap()); - assert_eq!(None, client.best_containing(b4.hash(), Some(0)).unwrap()); - - assert_eq!(None, client.best_containing(c3.hash().clone(), Some(0)).unwrap()); - - assert_eq!(None, client.best_containing(d2.hash().clone(), Some(0)).unwrap()); + assert_eq!(genesis_hash, longest_chain_select.finality_target( + genesis_hash, Some(0)).unwrap().unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a1.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a2.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a3.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a4.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + a5.hash(), Some(0)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + b2.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b3.hash(), Some(0)).unwrap()); + assert_eq!(None, longest_chain_select.finality_target( + b4.hash(), Some(0)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + c3.hash().clone(), Some(0)).unwrap()); + + assert_eq!(None, longest_chain_select.finality_target( + d2.hash().clone(), Some(0)).unwrap()); } #[test] - fn best_containing_with_max_depth_higher_than_best() { + fn best_containing_on_longest_chain_with_max_depth_higher_than_best() { // block tree: // G -> A1 -> A2 @@ -2094,8 +2357,13 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, a2.clone()).unwrap(); let genesis_hash = client.info().unwrap().chain.genesis_hash; + let longest_chain_select = test_client::client::LongestChain::new( + Arc::new(client.backend().as_in_memory()), + client.import_lock() + ); - assert_eq!(a2.hash(), client.best_containing(genesis_hash, Some(10)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target( + genesis_hash, Some(10)).unwrap().unwrap()); } #[test] diff --git a/core/client/src/error.rs b/core/client/src/error.rs index 3ee3c0e2a1ac52c157a20398beaf3ed5adea62ae..b201c092e0ed15af4295b1a33f8cc8cc888651d8 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -16,159 +16,120 @@ //! Substrate client possible errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] -#![allow(missing_docs)] - -use std; +use std::{self, error, result}; use state_machine; use runtime_primitives::ApplyError; use consensus; -use error_chain::*; - -error_chain! { - links { - Consensus(consensus::Error, consensus::ErrorKind); - } - errors { - /// Backend error. - Backend(s: String) { - description("Unrecoverable backend error"), - display("Backend error: {}", s), - } - - /// Unknown block. - UnknownBlock(h: String) { - description("unknown block"), - display("UnknownBlock: {}", &*h), - } - - /// Applying extrinsic error. - ApplyExtrinsicFailed(e: ApplyError) { - description("Extrinsic error"), - display("Extrinsic error: {:?}", e), - } - - /// Execution error. - Execution(e: Box) { - description("execution error"), - display("Execution: {}", e), - } - - /// Blockchain error. - Blockchain(e: Box) { - description("Blockchain error"), - display("Blockchain: {}", e), - } - - /// Could not get runtime version. - VersionInvalid { - description("Runtime version error"), - display("On-chain runtime does not specify version"), - } - - /// Genesis config is invalid. - GenesisInvalid { - description("Genesis config error"), - display("Genesis config provided is invalid"), - } - - /// Bad justification for header. - BadJustification(h: String) { - description("bad justification for header"), - display("bad justification for header: {}", &*h), - } - - /// Not available on light client. - NotAvailableOnLightClient { - description("not available on light client"), - display("This method is not currently available when running in light client mode"), - } - - /// Invalid remote CHT-based proof. - InvalidCHTProof { - description("invalid header proof"), - display("Remote node has responded with invalid header proof"), - } - - /// Remote fetch has been cancelled. - RemoteFetchCancelled { - description("remote fetch cancelled"), - display("Remote data fetch has been cancelled"), - } - - /// Remote fetch has been failed. - RemoteFetchFailed { - description("remote fetch failed"), - display("Remote data fetch has been failed"), - } - - /// Error decoding call result. - CallResultDecode(method: &'static str) { - description("Error decoding call result") - display("Error decoding call result of {}", method) - } - - /// Error converting a parameter between runtime and node. - RuntimeParamConversion(param: &'static str) { - description("Error converting parameter between runtime and node") - display("Error converting `{}` between runtime and node", param) - } - - /// Changes tries are not supported. - ChangesTriesNotSupported { - description("changes tries are not supported"), - display("Changes tries are not supported by the runtime"), - } - - /// Key changes query has failed. - ChangesTrieAccessFailed(e: String) { - description("invalid changes proof"), - display("Failed to check changes proof: {}", e), - } - - /// Last finalized block not parent of current. - NonSequentialFinalization(s: String) { - description("Did not finalize blocks in sequential order."), - display("Did not finalize blocks in sequential order."), - } - - /// Safety violation: new best block not descendent of last finalized. - NotInFinalizedChain { - description("Potential long-range attack: block not in finalized chain."), - display("Potential long-range attack: block not in finalized chain."), - } +use derive_more::{Display, From}; + +/// Client Result type alias +pub type Result = result::Result; + +/// Substrate Client error +#[derive(Debug, Display, From)] +pub enum Error { + /// Consensus Error + #[display(fmt = "Consensus: {}", _0)] + Consensus(consensus::Error), + /// Backend error. + #[display(fmt = "Backend error: {}", _0)] + Backend(String), + /// Unknown block. + #[display(fmt = "UnknownBlock: {}", _0)] + UnknownBlock(String), + /// Applying extrinsic error. + #[display(fmt = "Extrinsic error: {:?}", _0)] + ApplyExtrinsicFailed(ApplyError), + /// Execution error. + #[display(fmt = "Execution: {}", _0)] + Execution(Box), + /// Blockchain error. + #[display(fmt = "Blockchain: {}", _0)] + Blockchain(Box), + /// Invalid authorities set received from the runtime. + #[display(fmt = "Current state of blockchain has invalid authorities set")] + InvalidAuthoritiesSet, + /// Could not get runtime version. + #[display(fmt = "On-chain runtime does not specify version")] + VersionInvalid, + /// Genesis config is invalid. + #[display(fmt = "Genesis config provided is invalid")] + GenesisInvalid, + /// Error decoding header justification. + #[display(fmt = "error decoding justification for header")] + JustificationDecode, + /// Justification for header is correctly encoded, but invalid. + #[display(fmt = "bad justification for header: {}", _0)] + BadJustification(String), + /// Not available on light client. + #[display(fmt = "This method is not currently available when running in light client mode")] + NotAvailableOnLightClient, + /// Invalid remote CHT-based proof. + #[display(fmt = "Remote node has responded with invalid header proof")] + InvalidCHTProof, + /// Remote fetch has been cancelled. + #[display(fmt = "Remote data fetch has been cancelled")] + RemoteFetchCancelled, + /// Remote fetch has been failed. + #[display(fmt = "Remote data fetch has been failed")] + RemoteFetchFailed, + /// Error decoding call result. + #[display(fmt = "Error decoding call result of {}", _0)] + CallResultDecode(&'static str), + /// Error converting a parameter between runtime and node. + #[display(fmt = "Error converting `{}` between runtime and node", _0)] + RuntimeParamConversion(&'static str), + /// Changes tries are not supported. + #[display(fmt = "Changes tries are not supported by the runtime")] + ChangesTriesNotSupported, + /// Key changes query has failed. + #[display(fmt = "Failed to check changes proof: {}", _0)] + ChangesTrieAccessFailed(String), + /// Last finalized block not parent of current. + #[display(fmt = "Did not finalize blocks in sequential order.")] + NonSequentialFinalization(String), + /// Safety violation: new best block not descendent of last finalized. + #[display(fmt = "Potential long-range attack: block not in finalized chain.")] + NotInFinalizedChain, + /// Hash that is required for building CHT is missing. + #[display(fmt = "Failed to get hash of block#{} for building CHT#{}", _0, _1)] + MissingHashRequiredForCHT(u64, u64), + /// A convenience variant for String + #[display(fmt = "{}", _0)] + Msg(String), +} - /// Hash that is required for building CHT is missing. - MissingHashRequiredForCHT(cht_num: u64, block_number: u64) { - description("missed hash required for building CHT"), - display("Failed to get hash of block#{} for building CHT#{}", block_number, cht_num), +impl error::Error for Error { + fn source(&self) -> Option<&(error::Error + 'static)> { + match self { + Error::Consensus(e) => Some(e), + Error::Blockchain(e) => Some(e), + _ => None, } } } -impl From> for Error { - fn from(e: Box) -> Self { - ErrorKind::Execution(e).into() +impl From for Error { + fn from(s: String) -> Self { + Error::Msg(s) } } -impl From for Error { - fn from(e: state_machine::backend::Void) -> Self { - match e {} +impl<'a> From<&'a str> for Error { + fn from(s: &'a str) -> Self { + Error::Msg(s.into()) } } impl Error { /// Chain a blockchain error. - pub fn from_blockchain(e: Box) -> Self { - ErrorKind::Blockchain(e).into() + pub fn from_blockchain(e: Box) -> Self { + Error::Blockchain(e) } /// Chain a state error. pub fn from_state(e: Box) -> Self { - ErrorKind::Execution(e).into() + Error::Execution(e) } } diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index eea0a251cac79d45031c12831063598ea4776c4d..74bc74360a2c9517c7344b4f1dfc31c07cc1b870 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -46,7 +46,7 @@ mod tests { use state_machine::backend::InMemory; use test_client::{ runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}, - runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest, Extrinsic}, + runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest}, AccountKeyring, AuthorityKeyring }; use runtime_primitives::traits::BlakeTwo256; @@ -68,12 +68,7 @@ mod tests { ) -> (Vec, Hash) { use trie::ordered_trie_root; - let transactions = txs.into_iter().map(|tx| { - let signature = AccountKeyring::from_public(&tx.from).unwrap() - .sign(&tx.encode()).into(); - - Extrinsic::Transfer(tx, signature) - }).collect::>(); + let transactions = txs.into_iter().map(|tx| tx.into_signed_tx()).collect::>(); let extrinsics_root = ordered_trie_root::(transactions.iter().map(Encode::encode)).into(); diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 29256169f943425926abb1b8e6761087e2329cd9..558643e887a560d374bddfdbc7059e903f282d88 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -21,13 +21,14 @@ use std::sync::Arc; use parking_lot::RwLock; use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, - NumberFor, As, Digest, DigestItem}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Zero, + NumberFor, SaturatedConversion, Digest, DigestItem +}; use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; -use state_machine::backend::{Backend as StateBackend, InMemory, Consolidate}; +use state_machine::backend::{Backend as StateBackend, InMemory}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::MemoryDB; use consensus::well_known_cache_keys::Id as CacheKeyId; @@ -207,7 +208,7 @@ impl Blockchain { pub fn set_head(&self, id: BlockId) -> error::Result<()> { let header = match self.header(id)? { Some(h) => h, - None => return Err(error::ErrorKind::UnknownBlock(format!("{}", id)).into()), + None => return Err(error::Error::UnknownBlock(format!("{}", id))), }; self.apply_head(&header) @@ -258,7 +259,7 @@ impl Blockchain { fn finalize_header(&self, id: BlockId, justification: Option) -> error::Result<()> { let hash = match self.header(id)? { Some(h) => h.hash(), - None => return Err(error::ErrorKind::UnknownBlock(format!("{}", id)).into()), + None => return Err(error::Error::UnknownBlock(format!("{}", id))), }; let mut storage = self.storage.write(); @@ -416,12 +417,12 @@ impl light::blockchain::Storage for Blockchain fn header_cht_root(&self, _cht_size: u64, block: NumberFor) -> error::Result { self.storage.read().header_cht_roots.get(&block).cloned() - .ok_or_else(|| error::ErrorKind::Backend(format!("Header CHT for block {} not exists", block)).into()) + .ok_or_else(|| error::Error::Backend(format!("Header CHT for block {} not exists", block))) } fn changes_trie_cht_root(&self, _cht_size: u64, block: NumberFor) -> error::Result { self.storage.read().changes_trie_cht_roots.get(&block).cloned() - .ok_or_else(|| error::ErrorKind::Backend(format!("Changes trie CHT for block {} not exists", block)).into()) + .ok_or_else(|| error::Error::Backend(format!("Changes trie CHT for block {} not exists", block))) } fn cache(&self) -> Option>> { @@ -446,7 +447,7 @@ where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type State = InMemory; @@ -483,22 +484,17 @@ where Ok(()) } - fn reset_storage(&mut self, mut top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result { + fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result { check_genesis_storage(&top, &children)?; - let mut transaction: Vec<(Option>, Vec, Option>)> = Default::default(); + let child_delta = children.into_iter() + .map(|(storage_key, child_overlay)| + (storage_key, child_overlay.into_iter().map(|(k, v)| (k, Some(v))))); - for (child_key, child_map) in children { - let (root, is_default, update) = self.old_state.child_storage_root(&child_key, child_map.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); - - if !is_default { - top.insert(child_key, root); - } - } - - let (root, update) = self.old_state.storage_root(top.into_iter().map(|(k, v)| (k, Some(v)))); - transaction.consolidate(update); + let (root, transaction) = self.old_state.full_storage_root( + top.into_iter().map(|(k, v)| (k, Some(v))), + child_delta + ); self.new_state = Some(InMemory::from(transaction)); Ok(root) @@ -532,7 +528,7 @@ pub struct Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { states: RwLock>>, changes_trie_storage: ChangesTrieStorage, @@ -543,7 +539,7 @@ impl Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { /// Create a new instance of in-mem backend. pub fn new() -> Backend { @@ -559,7 +555,7 @@ impl backend::AuxStore for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { fn insert_aux< 'a, @@ -580,7 +576,7 @@ impl backend::Backend for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; @@ -625,7 +621,11 @@ where if let Some(changes_trie_root) = changes_trie_root { if let Some(changes_trie_update) = operation.changes_trie_update { let changes_trie_root: H::Out = changes_trie_root.into(); - self.changes_trie_storage.0.insert(header.number().as_(), changes_trie_root, changes_trie_update); + self.changes_trie_storage.0.insert( + (*header.number()).saturated_into::(), + changes_trie_root, + changes_trie_update + ); } } @@ -651,6 +651,10 @@ where &self.blockchain } + fn used_state_cache_size(&self) -> Option { + None + } + fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage> { Some(&self.changes_trie_storage) } @@ -665,12 +669,12 @@ where match self.blockchain.id(block).and_then(|id| self.states.read().get(&id).cloned()) { Some(state) => Ok(state), - None => Err(error::ErrorKind::UnknownBlock(format!("{}", block)).into()), + None => Err(error::Error::UnknownBlock(format!("{}", block))), } } fn revert(&self, _n: NumberFor) -> error::Result> { - Ok(As::sa(0)) + Ok(Zero::zero()) } } @@ -678,14 +682,14 @@ impl backend::LocalBackend for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, {} impl backend::RemoteBackend for Backend where Block: BlockT, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { fn is_local_state_available(&self, block: &BlockId) -> bool { self.blockchain.expect_block_number_from_id(block) @@ -695,20 +699,20 @@ where } /// Prunable in-memory changes trie storage. -pub struct ChangesTrieStorage(InMemoryChangesTrieStorage) where H::Out: HeapSizeOf; -impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage where H::Out: HeapSizeOf { +pub struct ChangesTrieStorage(InMemoryChangesTrieStorage); +impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { fn oldest_changes_trie_block(&self, _config: &ChangesTrieConfiguration, _best_finalized: u64) -> u64 { 0 } } -impl state_machine::ChangesTrieRootsStorage for ChangesTrieStorage where H::Out: HeapSizeOf { +impl state_machine::ChangesTrieRootsStorage for ChangesTrieStorage { fn root(&self, anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { self.0.root(anchor, block) } } -impl state_machine::ChangesTrieStorage for ChangesTrieStorage where H::Out: HeapSizeOf { +impl state_machine::ChangesTrieStorage for ChangesTrieStorage { fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { self.0.get(key, prefix) } @@ -717,11 +721,11 @@ impl state_machine::ChangesTrieStorage for ChangesTrieStorage w /// Check that genesis storage is valid. pub fn check_genesis_storage(top: &StorageOverlay, children: &ChildrenStorageOverlay) -> error::Result<()> { if top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { - return Err(error::ErrorKind::GenesisInvalid.into()); + return Err(error::Error::GenesisInvalid.into()); } if children.keys().any(|child_key| !well_known_keys::is_child_storage_key(&child_key)) { - return Err(error::ErrorKind::GenesisInvalid.into()); + return Err(error::Error::GenesisInvalid.into()); } Ok(()) diff --git a/core/client/src/leaves.rs b/core/client/src/leaves.rs index cc906d59a4bb1882211df3de855afe3d683aad7c..144237f777ca8b066be3ba03882bc68bee0d8612 100644 --- a/core/client/src/leaves.rs +++ b/core/client/src/leaves.rs @@ -85,11 +85,11 @@ impl LeafSet where let raw_hash = &mut &key[prefix.len()..]; let hash = match Decode::decode(raw_hash) { Some(hash) => hash, - None => return Err(error::ErrorKind::Backend("Error decoding hash".into()).into()), + None => return Err(error::Error::Backend("Error decoding hash".into())), }; let number = match Decode::decode(&mut &value[..]) { Some(number) => number, - None => return Err(error::ErrorKind::Backend("Error decoding number".into()).into()), + None => return Err(error::Error::Backend("Error decoding number".into())), }; storage.entry(Reverse(number)).or_insert_with(Vec::new).push(hash); } diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index d2da243d14a4db3980bcc91c200deb80ba0aed0e..574ec95dc003ff4604d5da11be7ddcd2f7c35306 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -58,12 +58,13 @@ pub use crate::client::{ new_with_backend, new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, - BlockImportNotification, Client, ClientInfo, ChainHead, ExecutionStrategies, + BlockImportNotification, Client, ClientInfo, ExecutionStrategies, + LongestChain }; #[cfg(feature = "std")] pub use crate::notifications::{StorageEventStream, StorageChangeSet}; #[cfg(feature = "std")] -pub use state_machine::ExecutionStrategy; +pub use state_machine::{ExecutionStrategy, NeverOffchainExt}; #[cfg(feature = "std")] pub use crate::leaves::LeafSet; diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index b4b805f3c6411c1f2c83460f6a8779c0d823c674..0579c8c8d4fa3217f157612a86c80e4713e1fcef 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -28,12 +28,11 @@ use runtime_primitives::traits::{Block as BlockT, NumberFor, Zero, Header}; use crate::in_mem::{self, check_genesis_storage}; use crate::backend::{AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState}; use crate::blockchain::HeaderBackend as BlockchainHeaderBackend; -use crate::error::{Error as ClientError, ErrorKind as ClientErrorKind, Result as ClientResult}; +use crate::error::{Error as ClientError, Result as ClientResult}; use crate::light::blockchain::{Blockchain, Storage as BlockchainStorage}; use crate::light::fetcher::{Fetcher, RemoteReadRequest}; use hash_db::Hasher; use trie::MemoryDB; -use heapsize::HeapSizeOf; use consensus::well_known_cache_keys; const IN_MEMORY_EXPECT_PROOF: &str = "InMemory state backend has Void error type and always suceeds; qed"; @@ -108,7 +107,7 @@ impl ClientBackend for Backend where S: BlockchainStorage, F: Fetcher, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type BlockImportOperation = ImportOperation; type Blockchain = Blockchain; @@ -183,6 +182,10 @@ impl ClientBackend for Backend where &self.blockchain } + fn used_state_cache_size(&self) -> Option { + None + } + fn changes_trie_storage(&self) -> Option<&Self::ChangesTrieStorage> { None } @@ -208,7 +211,7 @@ impl ClientBackend for Backend where } fn revert(&self, _n: NumberFor) -> ClientResult> { - Err(ClientErrorKind::NotAvailableOnLightClient.into()) + Err(ClientError::NotAvailableOnLightClient.into()) } } @@ -218,7 +221,7 @@ where S: BlockchainStorage, F: Fetcher, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { fn is_local_state_available(&self, block: &BlockId) -> bool { self.genesis_state.read().is_some() @@ -234,7 +237,7 @@ where F: Fetcher, S: BlockchainStorage, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type State = OnDemandOrGenesisState; @@ -275,11 +278,20 @@ where // this is only called when genesis block is imported => shouldn't be performance bottleneck let mut storage: HashMap>, StorageOverlay> = HashMap::new(); storage.insert(None, top); + + // create a list of children keys to re-compute roots for + let child_delta = children.keys() + .cloned() + .map(|storage_key| (storage_key, None)) + .collect::>(); + + // make sure to persist the child storage for (child_key, child_storage) in children { storage.insert(Some(child_key), child_storage); } + let storage_update: InMemoryState = storage.into(); - let (storage_root, _) = storage_update.storage_root(::std::iter::empty()); + let (storage_root, _) = storage_update.full_storage_root(::std::iter::empty(), child_delta); self.storage_update = Some(storage_update); Ok(storage_root) @@ -323,13 +335,13 @@ where let mut header = self.cached_header.read().clone(); if header.is_none() { let cached_header = self.blockchain.upgrade() - .ok_or_else(|| ClientErrorKind::UnknownBlock(format!("{}", self.block)).into()) + .ok_or_else(|| ClientError::UnknownBlock(format!("{}", self.block))) .and_then(|blockchain| blockchain.expect_header(BlockId::Hash(self.block)))?; header = Some(cached_header.clone()); *self.cached_header.write() = Some(cached_header); } - self.fetcher.upgrade().ok_or(ClientErrorKind::NotAvailableOnLightClient)? + self.fetcher.upgrade().ok_or(ClientError::NotAvailableOnLightClient)? .remote_read(RemoteReadRequest { block: self.block, header: header.expect("if block above guarantees that header is_some(); qed"), @@ -340,7 +352,7 @@ where } fn child_storage(&self, _storage_key: &[u8], _key: &[u8]) -> ClientResult>> { - Err(ClientErrorKind::NotAvailableOnLightClient.into()) + Err(ClientError::NotAvailableOnLightClient.into()) } fn for_keys_with_prefix(&self, _prefix: &[u8], _action: A) { @@ -370,7 +382,7 @@ where Vec::new() } - fn keys(&self, _prefix: &Vec) -> Vec> { + fn keys(&self, _prefix: &[u8]) -> Vec> { // whole state is not available on light node Vec::new() } @@ -386,7 +398,7 @@ where F: Fetcher, S: BlockchainStorage, H: Hasher, - H::Out: HeapSizeOf + Ord, + H::Out: Ord, { type Error = ClientError; type Transaction = (); @@ -462,7 +474,7 @@ where } } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { match *self { OnDemandOrGenesisState::OnDemand(ref state) => StateBackend::::keys(state, prefix), diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index e081c14d1a5caee3b7d46611f16c35f09925b448..d7fcd442324ea97f54b2a57be9fa40561aba18c8 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Light client blockchin backend. Only stores headers and justifications of recent +//! Light client blockchain backend. Only stores headers and justifications of recent //! blocks. CHT roots are stored for headers of ancient blocks. use std::{sync::{Weak, Arc}, collections::HashMap}; @@ -29,8 +29,8 @@ use crate::backend::{AuxStore, NewBlockState}; use crate::blockchain::{Backend as BlockchainBackend, BlockStatus, Cache as BlockchainCache, HeaderBackend as BlockchainHeaderBackend, Info as BlockchainInfo, ProvideCache}; use crate::cht; -use crate::error::{ErrorKind as ClientErrorKind, Result as ClientResult}; -use crate::light::fetcher::{Fetcher, RemoteHeaderRequest}; +use crate::error::{Error as ClientError, Result as ClientResult}; +use crate::light::fetcher::{Fetcher, RemoteBodyRequest, RemoteHeaderRequest}; /// Light client blockchain storage. pub trait Storage: AuxStore + BlockchainHeaderBackend { @@ -114,7 +114,7 @@ impl BlockchainHeaderBackend for Blockchain where Bloc return Ok(None); } - self.fetcher().upgrade().ok_or(ClientErrorKind::NotAvailableOnLightClient)? + self.fetcher().upgrade().ok_or(ClientError::NotAvailableOnLightClient)? .remote_header(RemoteHeaderRequest { cht_root: self.storage.header_cht_root(cht::SIZE, number)?, block: number, @@ -144,9 +144,19 @@ impl BlockchainHeaderBackend for Blockchain where Bloc } impl BlockchainBackend for Blockchain where Block: BlockT, S: Storage, F: Fetcher { - fn body(&self, _id: BlockId) -> ClientResult>> { - // TODO: #1445 fetch from remote node - Ok(None) + fn body(&self, id: BlockId) -> ClientResult>> { + let header = match self.header(id)? { + Some(header) => header, + None => return Ok(None), + }; + + self.fetcher().upgrade().ok_or(ClientError::NotAvailableOnLightClient)? + .remote_body(RemoteBodyRequest { + header, + retry_count: None, + }) + .into_future().wait() + .map(Some) } fn justification(&self, _id: BlockId) -> ClientResult> { @@ -202,22 +212,22 @@ pub mod tests { impl BlockchainHeaderBackend for DummyStorage { fn header(&self, _id: BlockId) -> ClientResult> { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } fn info(&self) -> ClientResult> { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } fn status(&self, _id: BlockId) -> ClientResult { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } fn number(&self, hash: Hash) -> ClientResult>> { if hash == Default::default() { Ok(Some(Default::default())) } else { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } } @@ -225,7 +235,7 @@ pub mod tests { if number == 0 { Ok(Some(Default::default())) } else { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } } } @@ -261,26 +271,26 @@ pub mod tests { } fn set_head(&self, _block: BlockId) -> ClientResult<()> { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } fn finalize_header(&self, _block: BlockId) -> ClientResult<()> { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } fn last_finalized(&self) -> ClientResult { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } fn header_cht_root(&self, _cht_size: u64, _block: u64) -> ClientResult { - Err(ClientErrorKind::Backend("Test error".into()).into()) + Err(ClientError::Backend("Test error".into())) } fn changes_trie_cht_root(&self, cht_size: u64, block: u64) -> ClientResult { cht::block_to_cht_number(cht_size, block) .and_then(|cht_num| self.changes_tries_cht_roots.get(&cht_num)) .cloned() - .ok_or_else(|| ClientErrorKind::Backend( + .ok_or_else(|| ClientError::Backend( format!("Test error: CHT for block #{} not found", block) ).into()) } diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 1e50d3398ecf725cd79a4d32df38de28f66b05f0..a45a16667486fa87889da3a085cdfede61667d04 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -14,27 +14,33 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Light client call exector. Executes methods on remote full nodes, fetching +//! Light client call executor. Executes methods on remote full nodes, fetching //! execution proof and checking it locally. -use std::{collections::HashSet, sync::Arc, panic::UnwindSafe, result, marker::PhantomData}; +use std::{ + collections::HashSet, sync::Arc, panic::UnwindSafe, result, + marker::PhantomData, cell::RefCell, rc::Rc, +}; use futures::{IntoFuture, Future}; use parity_codec::{Encode, Decode}; use primitives::{H256, Blake2Hasher, convert_hash, NativeOrEncoded, OffchainExt}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT}; -use state_machine::{self, Backend as StateBackend, CodeExecutor, OverlayedChanges, ExecutionStrategy, - create_proof_check_backend, execution_proof_check_on_trie_backend, ExecutionManager, NeverOffchainExt}; +use runtime_primitives::traits::{One, Block as BlockT, Header as HeaderT}; +use state_machine::{ + self, Backend as StateBackend, CodeExecutor, OverlayedChanges, + ExecutionStrategy, create_proof_check_backend, + execution_proof_check_on_trie_backend, ExecutionManager, NeverOffchainExt +}; use hash_db::Hasher; +use crate::runtime_api::{ProofRecorder, InitializeBlock}; use crate::backend::RemoteBackend; use crate::blockchain::Backend as ChainBackend; use crate::call_executor::CallExecutor; -use crate::error::{Error as ClientError, ErrorKind as ClientErrorKind, Result as ClientResult}; +use crate::error::{Error as ClientError, Result as ClientResult}; use crate::light::fetcher::{Fetcher, RemoteCallRequest}; use executor::{RuntimeVersion, NativeVersion}; -use heapsize::HeapSizeOf; use trie::MemoryDB; /// Call executor that executes methods on remote node, querying execution proof @@ -104,8 +110,9 @@ where } fn contextual_call< + 'a, O: OffchainExt, - PB: Fn() -> ClientResult, + IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -114,28 +121,36 @@ where NC, >( &self, + _initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - _prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, execution_manager: ExecutionManager, _native_call: Option, side_effects_handler: Option<&mut O>, + _recorder: &Option>>>, ) -> ClientResult> where ExecutionManager: Clone { + let block_initialized = match initialize_block { + InitializeBlock::Do(ref init_block) => { + init_block.borrow().is_some() + }, + InitializeBlock::Skip => false, + }; + // it is only possible to execute contextual call if changes are empty - if !changes.is_empty() || initialized_block.is_some() { - return Err(ClientErrorKind::NotAvailableOnLightClient.into()); + if !changes.borrow().is_empty() || block_initialized { + return Err(ClientError::NotAvailableOnLightClient.into()); } self.call(at, method, call_data, (&execution_manager).into(), side_effects_handler).map(NativeOrEncoded::Encoded) } fn runtime_version(&self, id: &BlockId) -> ClientResult { - let call_result = self.call(id, "version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; + let call_result = self.call(id, "Core_version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; RuntimeVersion::decode(&mut call_result.as_slice()) - .ok_or_else(|| ClientErrorKind::VersionInvalid.into()) + .ok_or_else(|| ClientError::VersionInvalid.into()) } fn call_at_state< @@ -156,7 +171,7 @@ where _native_call: Option, _side_effects_handler: Option<&mut O>, ) -> ClientResult<(NativeOrEncoded, S::Transaction, Option>)> { - Err(ClientErrorKind::NotAvailableOnLightClient.into()) + Err(ClientError::NotAvailableOnLightClient.into()) } fn prove_at_trie_state>( @@ -166,7 +181,7 @@ where _method: &str, _call_data: &[u8] ) -> ClientResult<(Vec, Vec>)> { - Err(ClientErrorKind::NotAvailableOnLightClient.into()) + Err(ClientError::NotAvailableOnLightClient.into()) } fn native_runtime_version(&self) -> Option<&NativeVersion> { @@ -231,8 +246,9 @@ impl CallExecutor for } fn contextual_call< + 'a, O: OffchainExt, - PB: Fn() -> ClientResult, + IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, Result, Self::Error> @@ -241,15 +257,16 @@ impl CallExecutor for NC: FnOnce() -> result::Result + UnwindSafe, >( &self, + initialize_block_fn: IB, at: &BlockId, method: &str, call_data: &[u8], - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, - prepare_environment_block: PB, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, _manager: ExecutionManager, native_call: Option, side_effects_handler: Option<&mut O>, + recorder: &Option>>>, ) -> ClientResult> where ExecutionManager: Clone { // there's no actual way/need to specify native/wasm execution strategy on light node // => we can safely ignore passed values @@ -266,16 +283,17 @@ impl CallExecutor for NC >( &self.local, + initialize_block_fn, at, method, call_data, changes, - initialized_block, - prepare_environment_block, + initialize_block, ExecutionManager::NativeWhenPossible, native_call, side_effects_handler, - ).map_err(|e| ClientErrorKind::Execution(Box::new(e.to_string())).into()), + recorder, + ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), false => CallExecutor::contextual_call::< _, _, @@ -287,16 +305,17 @@ impl CallExecutor for NC >( &self.remote, + initialize_block_fn, at, method, call_data, changes, - initialized_block, - prepare_environment_block, + initialize_block, ExecutionManager::NativeWhenPossible, native_call, side_effects_handler, - ).map_err(|e| ClientErrorKind::Execution(Box::new(e.to_string())).into()), + recorder, + ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))), } } @@ -346,7 +365,7 @@ impl CallExecutor for ExecutionManager::NativeWhenPossible, native_call, side_effects_handler, - ).map_err(|e| ClientErrorKind::Execution(Box::new(e.to_string())).into()) + ).map_err(|e| ClientError::Execution(Box::new(e.to_string()))) } fn prove_at_trie_state>( @@ -406,7 +425,7 @@ pub fn prove_execution( /// Check remote contextual execution proof using given backend. /// /// Method is executed using passed header as environment' current block. -/// Proof shoul include both environment preparation proof and method execution proof. +/// Proof should include both environment preparation proof and method execution proof. pub fn check_execution_proof( executor: &E, request: &RemoteCallRequest
, @@ -416,7 +435,7 @@ pub fn check_execution_proof( Header: HeaderT, E: CodeExecutor, H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { let local_state_root = request.header.state_root(); let root: H::Out = convert_hash(&local_state_root); @@ -425,7 +444,7 @@ pub fn check_execution_proof( let mut changes = OverlayedChanges::default(); let trie_backend = create_proof_check_backend(root, remote_proof)?; let next_block =
::new( - *request.header.number() + As::sa(1), + *request.header.number() + One::one(), Default::default(), Default::default(), request.header.hash(), diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 4cbbc819b31413e33e4bc33c0772ee42d5b6c6ab..29fd6f4c39852844569d0bf48ab2a7e25e540d12 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -22,14 +22,18 @@ use std::marker::PhantomData; use futures::IntoFuture; use hash_db::{HashDB, Hasher}; -use heapsize::HeapSizeOf; +use parity_codec::Encode; use primitives::{ChangesTrieConfiguration, convert_hash}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, NumberFor}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, + UniqueSaturatedInto, UniqueSaturatedFrom, SaturatedConversion +}; use state_machine::{CodeExecutor, ChangesTrieRootsStorage, ChangesTrieAnchorBlockId, - TrieBackend, read_proof_check, key_changes_proof_check, create_proof_check_backend_storage}; + TrieBackend, read_proof_check, key_changes_proof_check, + create_proof_check_backend_storage, read_child_proof_check}; use crate::cht; -use crate::error::{Error as ClientError, ErrorKind as ClientErrorKind, Result as ClientResult}; +use crate::error::{Error as ClientError, Result as ClientResult}; use crate::light::blockchain::{Blockchain, Storage as BlockchainStorage}; use crate::light::call_executor::check_execution_proof; @@ -72,6 +76,21 @@ pub struct RemoteReadRequest { pub retry_count: Option, } +/// Remote storage read child request. +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub struct RemoteReadChildRequest { + /// Read at state of given block. + pub block: Header::Hash, + /// Header of block at which read is performed. + pub header: Header, + /// Storage key for child. + pub storage_key: Vec, + /// Child storage key to read. + pub key: Vec, + /// Number of times to retry request. None means that default RETRY_COUNT is used. + pub retry_count: Option, +} + /// Remote key changes read request. #[derive(Clone, Debug, PartialEq, Eq)] pub struct RemoteChangesRequest { @@ -109,27 +128,48 @@ pub struct ChangesProof { pub roots_proof: Vec>, } +/// Remote block body request +#[derive(Clone, Default, Debug, PartialEq, Eq, Hash)] +pub struct RemoteBodyRequest { + /// Header of the requested block body + pub header: Header, + /// Number of times to retry request. None means that default RETRY_COUNT is used. + pub retry_count: Option, +} + /// Light client data fetcher. Implementations of this trait must check if remote data /// is correct (see FetchedDataChecker) and return already checked data. pub trait Fetcher: Send + Sync { /// Remote header future. - type RemoteHeaderResult: IntoFuture; + type RemoteHeaderResult: IntoFuture; /// Remote storage read future. - type RemoteReadResult: IntoFuture>, Error=ClientError>; + type RemoteReadResult: IntoFuture>, Error = ClientError>; /// Remote call result future. - type RemoteCallResult: IntoFuture, Error=ClientError>; + type RemoteCallResult: IntoFuture, Error = ClientError>; /// Remote changes result future. - type RemoteChangesResult: IntoFuture, u32)>, Error=ClientError>; + type RemoteChangesResult: IntoFuture, u32)>, Error = ClientError>; + /// Remote block body result future. + type RemoteBodyResult: IntoFuture, Error = ClientError>; /// Fetch remote header. fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult; /// Fetch remote storage value. - fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult; + fn remote_read( + &self, + request: RemoteReadRequest + ) -> Self::RemoteReadResult; + /// Fetch remote storage child value. + fn remote_read_child( + &self, + request: RemoteReadChildRequest + ) -> Self::RemoteReadResult; /// Fetch remote call result. fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult; /// Fetch remote changes ((block number, extrinsic index)) where given key has been changed /// at a given blocks range. fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult; + /// Fetch remote block body + fn remote_body(&self, request: RemoteBodyRequest) -> Self::RemoteBodyResult; } /// Light client remote data checker. @@ -150,6 +190,12 @@ pub trait FetchChecker: Send + Sync { request: &RemoteReadRequest, remote_proof: Vec> ) -> ClientResult>>; + /// Check remote storage read proof. + fn check_read_child_proof( + &self, + request: &RemoteReadChildRequest, + remote_proof: Vec> + ) -> ClientResult>>; /// Check remote method execution proof. fn check_execution_proof( &self, @@ -162,6 +208,12 @@ pub trait FetchChecker: Send + Sync { request: &RemoteChangesRequest, proof: ChangesProof ) -> ClientResult, u32)>>; + /// Check remote body proof. + fn check_body_proof( + &self, + request: &RemoteBodyRequest, + body: Vec + ) -> ClientResult>; } /// Remote data checker. @@ -188,12 +240,12 @@ impl, F> LightDataChecker ClientResult, u32)>> where H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { // since we need roots of all changes tries for the range begin..max // => remote node can't use max block greater that one that we have passed if remote_proof.max_block > request.max_block.0 || remote_proof.max_block < request.last_block.0 { - return Err(ClientErrorKind::ChangesTrieAccessFailed(format!( + return Err(ClientError::ChangesTrieAccessFailed(format!( "Invalid max_block used by the remote node: {}. Local: {}..{}..{}", remote_proof.max_block, request.first_block.0, request.last_block.0, request.max_block.0, )).into()); @@ -209,7 +261,7 @@ impl, F> LightDataChecker= request.tries_roots.0) .unwrap_or(false); if is_extra_first_root || is_extra_last_root { - return Err(ClientErrorKind::ChangesTrieAccessFailed(format!( + return Err(ClientError::ChangesTrieAccessFailed(format!( "Extra changes tries roots proofs provided by the remote node: [{:?}..{:?}]. Expected in range: [{}; {})", remote_proof.roots.keys().next(), remote_proof.roots.keys().next_back(), request.first_block.0, request.tries_roots.0, @@ -239,15 +291,17 @@ impl, F> LightDataChecker(), &ChangesTrieAnchorBlockId { hash: convert_hash(&request.last_block.1), - number: request.last_block.0.as_(), + number: request.last_block.0.saturated_into::(), }, - remote_max_block.as_(), + remote_max_block.saturated_into::(), &request.key) - .map(|pairs| pairs.into_iter().map(|(b, x)| (As::sa(b), x)).collect()) - .map_err(|err| ClientErrorKind::ChangesTrieAccessFailed(err).into()) + .map(|pairs| pairs.into_iter().map(|(b, x)| + (b.saturated_into::>(), x) + ).collect()) + .map_err(|err| ClientError::ChangesTrieAccessFailed(err)) } /// Check CHT-based proof for changes tries roots. @@ -259,7 +313,7 @@ impl, F> LightDataChecker ClientResult<()> where H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { // all the checks are sharing the same storage let storage = create_proof_check_backend_storage(remote_roots_proof); @@ -283,7 +337,7 @@ impl, F> LightDataChecker FetchChecker for LightDataChecker, H: Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, S: BlockchainStorage, F: Send + Sync, { @@ -320,7 +374,7 @@ impl FetchChecker for LightDataChecker> ) -> ClientResult { let remote_header = remote_header.ok_or_else(|| - ClientError::from(ClientErrorKind::InvalidCHTProof))?; + ClientError::from(ClientError::InvalidCHTProof))?; let remote_header_hash = remote_header.hash(); cht::check_proof::( request.cht_root, @@ -339,6 +393,19 @@ impl FetchChecker for LightDataChecker, + remote_proof: Vec> + ) -> ClientResult>> { + read_child_proof_check::( + convert_hash(request.header.state_root()), + remote_proof, + &request.storage_key, + &request.key) + .map_err(Into::into) + } + fn check_execution_proof( &self, request: &RemoteCallRequest, @@ -354,10 +421,29 @@ impl FetchChecker for LightDataChecker ClientResult, u32)>> { self.check_changes_proof_with_cht_size(request, remote_proof, cht::SIZE) } + + fn check_body_proof( + &self, + request: &RemoteBodyRequest, + body: Vec + ) -> ClientResult> { + + // TODO: #2621 + let extrinsics_root = HashFor::::ordered_trie_root(body.iter().map(Encode::encode)); + if *request.header.extrinsics_root() == extrinsics_root { + Ok(body) + } else { + Err(format!("RemoteBodyRequest: invalid extrinsics root expected: {} but got {}", + *request.header.extrinsics_root(), + extrinsics_root, + ).into()) + } + + } } /// A view of BTreeMap as a changes trie roots storage. -struct RootsStorage<'a, Number: As, Hash: 'a> { +struct RootsStorage<'a, Number: UniqueSaturatedInto + UniqueSaturatedFrom, Hash: 'a> { roots: (Number, &'a [Hash]), prev_roots: BTreeMap, } @@ -365,15 +451,16 @@ struct RootsStorage<'a, Number: As, Hash: 'a> { impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> where H: Hasher, - Number: Send + Sync + Eq + ::std::cmp::Ord + Copy + As, + Number: Send + Sync + Eq + ::std::cmp::Ord + Copy + UniqueSaturatedInto + + UniqueSaturatedFrom, Hash: 'a + Send + Sync + Clone + AsRef<[u8]>, { fn root(&self, _anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { // we can't ask for roots from parallel forks here => ignore anchor - let root = if block < self.roots.0.as_() { - self.prev_roots.get(&As::sa(block)).cloned() + let root = if block < self.roots.0.saturated_into::() { + self.prev_roots.get(&Number::unique_saturated_from(block)).cloned() } else { - block.checked_sub(self.roots.0.as_()) + block.checked_sub(self.roots.0.saturated_into::()) .and_then(|index| self.roots.1.get(index as usize)) .cloned() }; @@ -396,7 +483,7 @@ pub mod tests { use crate::error::Error as ClientError; use test_client::{ self, TestClient, blockchain::HeaderBackend, AccountKeyring, - runtime::{self, Hash, Block, Header} + runtime::{self, Hash, Block, Header, Extrinsic} }; use consensus::BlockOrigin; @@ -404,7 +491,7 @@ pub mod tests { use crate::light::fetcher::{Fetcher, FetchChecker, LightDataChecker, RemoteCallRequest, RemoteHeaderRequest}; use crate::light::blockchain::tests::{DummyStorage, DummyBlockchain}; - use primitives::{twox_128, Blake2Hasher}; + use primitives::{blake2_256, Blake2Hasher, H256}; use primitives::storage::{StorageKey, well_known_keys}; use runtime_primitives::generic::BlockId; use state_machine::Backend; @@ -412,18 +499,30 @@ pub mod tests { pub type OkCallFetcher = Mutex>; + fn not_implemented_in_tests() -> FutureResult + where + E: std::convert::From<&'static str>, + { + err("Not implemented on test node".into()) + } + impl Fetcher for OkCallFetcher { type RemoteHeaderResult = FutureResult; type RemoteReadResult = FutureResult>, ClientError>; type RemoteCallResult = FutureResult, ClientError>; type RemoteChangesResult = FutureResult, u32)>, ClientError>; + type RemoteBodyResult = FutureResult, ClientError>; fn remote_header(&self, _request: RemoteHeaderRequest
) -> Self::RemoteHeaderResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() } fn remote_read(&self, _request: RemoteReadRequest
) -> Self::RemoteReadResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() + } + + fn remote_read_child(&self, _request: RemoteReadChildRequest
) -> Self::RemoteReadResult { + not_implemented_in_tests() } fn remote_call(&self, _request: RemoteCallRequest
) -> Self::RemoteCallResult { @@ -431,11 +530,21 @@ pub mod tests { } fn remote_changes(&self, _request: RemoteChangesRequest
) -> Self::RemoteChangesResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() + } + + fn remote_body(&self, _request: RemoteBodyRequest
) -> Self::RemoteBodyResult { + not_implemented_in_tests() } } - type TestChecker = LightDataChecker, Blake2Hasher, Block, DummyStorage, OkCallFetcher>; + type TestChecker = LightDataChecker< + executor::NativeExecutor, + Blake2Hasher, + Block, + DummyStorage, + OkCallFetcher, + >; fn prepare_for_read_proof_check() -> (TestChecker, Header, Vec>, u32) { // prepare remote client @@ -473,7 +582,7 @@ pub mod tests { let builder = remote_client.new_block().unwrap(); remote_client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); local_headers_hashes.push(remote_client.block_hash(i + 1) - .map_err(|_| ClientErrorKind::Backend("TestError".into()).into())); + .map_err(|_| ClientError::Backend("TestError".into()))); } // 'fetch' header proof from remote node @@ -491,6 +600,14 @@ pub mod tests { (local_checker, local_cht_root, remote_block_header, remote_header_proof) } + fn header_with_computed_extrinsics_root(extrinsics: Vec) -> Header { + let extrinsics_root = + trie::ordered_trie_root::(extrinsics.iter().map(Encode::encode)); + + // only care about `extrinsics_root` + Header::new(0, extrinsics_root, H256::zero(), H256::zero(), Default::default()) + } + #[test] fn storage_read_proof_is_generated_and_checked() { let (local_checker, remote_block_header, remote_read_proof, authorities_len) = prepare_for_read_proof_check(); @@ -587,7 +704,7 @@ pub mod tests { // we're testing this test case here: // (1, 4, dave.clone(), vec![(4, 0), (1, 1), (1, 0)]), let (remote_client, remote_roots, _) = prepare_client_with_key_changes(); - let dave = twox_128(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); + let dave = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); let dave = StorageKey(dave); // 'fetch' changes proof from remote node: @@ -699,7 +816,7 @@ pub mod tests { let (remote_client, remote_roots, _) = prepare_client_with_key_changes(); let local_cht_root = cht::compute_root::( 4, 0, remote_roots.iter().cloned().map(|ct| Ok(Some(ct)))).unwrap(); - let dave = twox_128(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); + let dave = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); let dave = StorageKey(dave); // 'fetch' changes proof from remote node: @@ -730,4 +847,47 @@ pub mod tests { ); assert!(local_checker.check_changes_tries_proof(4, &remote_proof.roots, vec![]).is_err()); } + + #[test] + fn check_body_proof_faulty() { + let header = header_with_computed_extrinsics_root( + vec![Extrinsic::IncludeData(vec![1, 2, 3, 4])] + ); + let block = Block::new(header.clone(), Vec::new()); + + let local_checker = TestChecker::new( + Arc::new(DummyBlockchain::new(DummyStorage::new())), + test_client::LocalExecutor::new(None) + ); + + let body_request = RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }; + + assert!( + local_checker.check_body_proof(&body_request, block.extrinsics).is_err(), + "vec![1, 2, 3, 4] != vec![]" + ); + } + + #[test] + fn check_body_proof_of_same_data_should_succeed() { + let extrinsics = vec![Extrinsic::IncludeData(vec![1, 2, 3, 4, 5, 6, 7, 8, 255])]; + + let header = header_with_computed_extrinsics_root(extrinsics.clone()); + let block = Block::new(header.clone(), extrinsics); + + let local_checker = TestChecker::new( + Arc::new(DummyBlockchain::new(DummyStorage::new())), + test_client::LocalExecutor::new(None) + ); + + let body_request = RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }; + + assert!(local_checker.check_body_proof(&body_request, block.extrinsics).is_ok()); + } } diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index 68eed3b73ce8fc0a15d307ce4dd4503e7307cb08..f5c8a59a903c4565097735d987080b458ed1c5c2 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -24,7 +24,10 @@ pub use state_machine::OverlayedChanges; pub use primitives::NativeOrEncoded; #[doc(hidden)] pub use runtime_primitives::{ - traits::{AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, Header as HeaderT, ApiRef, RuntimeApiInfo}, + traits::{ + AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, + Header as HeaderT, ApiRef, RuntimeApiInfo, Hash as HashT, + }, generic::BlockId, transaction_validity::TransactionValidity, }; #[doc(hidden)] @@ -42,8 +45,16 @@ use crate::error; use sr_api_macros::decl_runtime_apis; use primitives::OpaqueMetadata; #[cfg(feature = "std")] -use std::panic::UnwindSafe; +use std::{panic::UnwindSafe, cell::RefCell, rc::Rc}; use rstd::vec::Vec; +#[cfg(feature = "std")] +use primitives::Hasher as HasherT; + +#[cfg(feature = "std")] +/// A type that records all accessed trie nodes and generates a proof out of it. +pub type ProofRecorder = state_machine::ProofRecorder< + <<<::Header as HeaderT>::Hashing as HashT>::Hasher as HasherT>::Out +>; /// Something that can be constructed to a runtime api. #[cfg(feature = "std")] @@ -87,6 +98,35 @@ pub trait ApiExt { /// Returns the runtime version at the given block id. fn runtime_version_at(&self, at: &BlockId) -> error::Result; + + /// Start recording all accessed trie nodes for generating proofs. + fn record_proof(&mut self); + + /// Extract the recorded proof. + /// This stops the proof recording. + fn extract_proof(&mut self) -> Option>>; +} + +/// Before calling any runtime api function, the runtime need to be initialized +/// at the requested block. However, some functions like `execute_block` or +/// `initialize_block` itself don't require to have the runtime initialized +/// at the requested block. +/// +/// `call_api_at` is instructed by this enum to do the initialization or to skip +/// it. +#[cfg(feature = "std")] +#[derive(Clone, Copy)] +pub enum InitializeBlock<'a, Block: BlockT> { + /// Skip initializing the runtime for a given block. + /// + /// This is used by functions who do the initialization by themself or don't + /// require it. + Skip, + /// Initialize the runtime for a given block. + /// + /// If the stored `BlockId` is `Some(_)`, the runtime is currently initialized + /// at this block. + Do(&'a RefCell>>), } /// Something that can call into the runtime at a given block. @@ -95,17 +135,21 @@ pub trait CallRuntimeAt { /// Calls the given api function with the given encoded arguments at the given block /// and returns the encoded result. fn call_api_at< + 'a, R: Encode + Decode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, + C: Core, >( &self, + core_api: &C, at: &BlockId, function: &'static str, args: Vec, - changes: &mut OverlayedChanges, - initialized_block: &mut Option>, + changes: &RefCell, + initialize_block: InitializeBlock<'a, Block>, native_call: Option, context: ExecutionContext, + recorder: &Option>>>, ) -> error::Result>; /// Returns the runtime version at the given block. @@ -120,9 +164,12 @@ decl_runtime_apis! { /// Returns the version of the runtime. fn version() -> RuntimeVersion; /// Execute the given block. + #[skip_initialize_block] fn execute_block(block: Block); /// Initialize a block with the given header. #[renamed("initialise_block", 2)] + #[skip_initialize_block] + #[initialize_block] fn initialize_block(header: &::Header); /// Returns the authorities. #[deprecated(since = "1.0", note = "Please switch to `AuthoritiesApi`.")] diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index f806dd719da0538f55f8d18b6497726033d65a3b..6e489cf8a9bda3833ff67eaf49bba41f69995087 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -1,31 +1,30 @@ [package] name = "substrate-consensus-aura" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" [dependencies] -parity-codec = "3.3" -client = { package = "substrate-client", path = "../../client" } +parity-codec = "3.4" primitives = { package = "substrate-primitives", path = "../../primitives" } runtime_support = { package = "srml-support", path = "../../../srml/support" } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } -aura_slots = { package = "substrate-consensus-aura-slots", path = "slots" } +slots = { package = "substrate-consensus-slots", path = "../slots" } aura_primitives = { package = "substrate-consensus-aura-primitives", path = "primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } srml-consensus = { path = "../../../srml/consensus" } srml-aura = { path = "../../../srml/aura" } +client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } +consensus_common = { package = "substrate-consensus-common", path = "../common" } +authorities = { package = "substrate-consensus-authorities", path = "../authorities" } +runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } futures = "0.1.17" tokio = "0.1.7" parking_lot = "0.7.1" -error-chain = "0.12" log = "0.4" -consensus_common = { package = "substrate-consensus-common", path = "../common" } -authorities = { package = "substrate-consensus-authorities", path = "../authorities" } [dev-dependencies] keyring = { package = "substrate-keyring", path = "../../keyring" } diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index 759dfae37cd6979bd458670606c7454bedcddf8e..a5e24e6fbee827c2a6b774ab4f5106fc86c2d972 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,5 +12,6 @@ runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives [features] default = ["std"] std = [ + "runtime_primitives/std", "substrate-client/std", ] diff --git a/core/consensus/aura/slots/Cargo.toml b/core/consensus/aura/slots/Cargo.toml deleted file mode 100644 index 68d066191efa8bd00eb0f2724f3aedd88aa3f157..0000000000000000000000000000000000000000 --- a/core/consensus/aura/slots/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "substrate-consensus-aura-slots" -version = "1.0.0" -authors = ["Parity Technologies "] -description = "Generic slots-based utilities for consensus" -edition = "2018" - -[dependencies] -codec = { package = "parity-codec", version = "3.2" } -client = { package = "substrate-client", path = "../../../client" } -primitives = { package = "substrate-primitives", path = "../../../primitives" } -runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives" } -aura_primitives = { package = "substrate-consensus-aura-primitives", path = "../primitives" } -consensus_common = { package = "substrate-consensus-common", path = "../../common" } -inherents = { package = "substrate-inherents", path = "../../../inherents" } -futures = "0.1.17" -tokio = "0.1.7" -parking_lot = "0.7.1" -error-chain = "0.12" -log = "0.4" diff --git a/core/consensus/aura/slots/src/lib.rs b/core/consensus/aura/slots/src/lib.rs deleted file mode 100644 index cfad5b69cdef129e96bd971aec3d413f3a42a09b..0000000000000000000000000000000000000000 --- a/core/consensus/aura/slots/src/lib.rs +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// 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 Substrate. If not, see . - -mod slots; - -pub use slots::{Slots, SlotInfo}; - -use std::sync::{mpsc, Arc}; -use std::thread; -use futures::prelude::*; -use futures::{Future, IntoFuture, future::{self, Either}}; -use log::{warn, debug, info}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{ProvideRuntimeApi, Block}; -use consensus_common::SyncOracle; -use inherents::{InherentData, InherentDataProviders}; -use aura_primitives::AuraApi; -use client::ChainHead; -use codec::Encode; - -/// A worker that should be invoked at every new slot. -pub trait SlotWorker { - type OnSlot: IntoFuture; - - /// Called when the proposer starts. - fn on_start( - &self, - slot_duration: u64 - ) -> Result<(), consensus_common::Error>; - - /// Called when a new slot is triggered. - fn on_slot( - &self, - chain_head: B::Header, - slot_info: SlotInfo, - ) -> Self::OnSlot; -} - -/// Slot compatible inherent data. -pub trait SlotCompatible { - /// Extract timestamp and slot from inherent data. - fn extract_timestamp_and_slot(inherent: &InherentData) -> Result<(u64, u64), consensus_common::Error>; -} - -/// Convert an inherent error to common error. -pub fn inherent_to_common_error(err: inherents::RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() -} - -/// Start a new slot worker in a separate thread. -pub fn start_slot_worker_thread( - slot_duration: SlotDuration, - client: Arc, - worker: Arc, - sync_oracle: SO, - on_exit: OnExit, - inherent_data_providers: InherentDataProviders, -) -> Result<(), consensus_common::Error> where - B: Block + 'static, - C: ChainHead + Send + Sync + 'static, - W: SlotWorker + Send + Sync + 'static, - SO: SyncOracle + Send + Clone + 'static, - SC: SlotCompatible + 'static, - OnExit: Future + Send + 'static -{ - use tokio::runtime::current_thread::Runtime; - - let (result_sender, result_recv) = mpsc::channel(); - - thread::spawn(move || { - let mut runtime = match Runtime::new() { - Ok(r) => r, - Err(e) => { - warn!("Unable to start authorship: {:?}", e); - return; - } - }; - - let slot_worker_future = match start_slot_worker::<_, _, _, _, SC, _>( - slot_duration, - client, - worker, - sync_oracle, - on_exit, - inherent_data_providers, - ) { - Ok(slot_worker_future) => { - result_sender - .send(Ok(())) - .expect("Receive is not dropped before receiving a result; qed"); - slot_worker_future - }, - Err(e) => { - result_sender - .send(Err(e)) - .expect("Receive is not dropped before receiving a result; qed"); - return; - } - }; - - let _ = runtime.block_on(slot_worker_future); - }); - - result_recv.recv().expect("Aura start thread result sender dropped") -} - -/// Start a new slot worker. -pub fn start_slot_worker( - slot_duration: SlotDuration, - client: Arc, - worker: Arc, - sync_oracle: SO, - on_exit: OnExit, - inherent_data_providers: InherentDataProviders, -) -> Result, consensus_common::Error> where - B: Block, - C: ChainHead, - W: SlotWorker, - SO: SyncOracle + Send + Clone, - SC: SlotCompatible, - OnExit: Future, -{ - worker.on_start(slot_duration.0)?; - - let make_authorship = move || { - let client = client.clone(); - let worker = worker.clone(); - let sync_oracle = sync_oracle.clone(); - let SlotDuration(slot_duration) = slot_duration; - let inherent_data_providers = inherent_data_providers.clone(); - - // rather than use a timer interval, we schedule our waits ourselves - Slots::::new(slot_duration, inherent_data_providers) - .map_err(|e| debug!(target: "aura", "Faulty timer: {:?}", e)) - .for_each(move |slot_info| { - let client = client.clone(); - let worker = worker.clone(); - let sync_oracle = sync_oracle.clone(); - - // only propose when we are not syncing. - if sync_oracle.is_major_syncing() { - debug!(target: "aura", "Skipping proposal slot due to sync."); - return Either::B(future::ok(())); - } - - let slot_num = slot_info.number; - let chain_head = match client.best_block_header() { - Ok(x) => x, - Err(e) => { - warn!(target: "aura", "Unable to author block in slot {}. \ - no best block header: {:?}", slot_num, e); - return Either::B(future::ok(())) - } - }; - - Either::A( - worker.on_slot(chain_head, slot_info).into_future() - .map_err(|e| debug!(target: "aura", "Encountered aura error: {:?}", e)) - ) - }) - }; - - let work = future::loop_fn((), move |()| { - let authorship_task = ::std::panic::AssertUnwindSafe(make_authorship()); - authorship_task.catch_unwind().then(|res| { - match res { - Ok(Ok(())) => (), - Ok(Err(())) => warn!("Aura authorship task terminated unexpectedly. Restarting"), - Err(e) => { - if let Some(s) = e.downcast_ref::<&'static str>() { - warn!("Aura authorship task panicked at {:?}", s); - } - - warn!("Restarting Aura authorship task"); - } - } - - Ok(future::Loop::Continue(())) - }) - }); - - Ok(work.select(on_exit).then(|_| Ok(()))) -} - -/// A header which has been checked -pub enum CheckedHeader { - /// A header which has slot in the future. this is the full header (not stripped) - /// and the slot in which it should be processed. - Deferred(H, u64), - /// A header which is fully checked, including signature. This is the pre-header - /// accompanied by the seal components. - /// - /// Includes the digest item that encoded the seal. - Checked(H, S), -} - -/// A slot duration. Create with `get_or_compute`. -// The internal member should stay private here. -#[derive(Clone, Copy, Debug)] -pub struct SlotDuration(u64); - -impl SlotDuration { - /// Either fetch the slot duration from disk or compute it from the genesis - /// state. - pub fn get_or_compute(client: &C) -> ::client::error::Result where - C: client::backend::AuxStore, - C: ProvideRuntimeApi, - C::Api: AuraApi, - { - use codec::Decode; - const SLOT_KEY: &[u8] = b"aura_slot_duration"; - - match client.get_aux(SLOT_KEY)? { - Some(v) => u64::decode(&mut &v[..]) - .map(SlotDuration) - .ok_or_else(|| ::client::error::ErrorKind::Backend( - format!("Aura slot duration kept in invalid format"), - ).into()), - None => { - use runtime_primitives::traits::Zero; - let genesis_slot_duration = client.runtime_api() - .slot_duration(&BlockId::number(Zero::zero()))?; - - info!( - "Loaded block-time = {:?} seconds from genesis on first-launch", - genesis_slot_duration - ); - - genesis_slot_duration.using_encoded(|s| { - client.insert_aux(&[(SLOT_KEY, &s[..])], &[]) - })?; - - Ok(SlotDuration(genesis_slot_duration)) - } - } - } - - /// Returns slot duration value. - pub fn get(&self) -> u64 { - self.0 - } -} diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index 9849594686b54ab933f3095ef281f9d8a25b9516..59483a5688d37fb50976d0b0fa8590393758e565 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -25,29 +25,35 @@ //! //! Blocks from future steps will be either deferred or rejected depending on how //! far in the future they are. -#![deny(deprecated)] +#![forbid(missing_docs, unsafe_code)] use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug}; use parity_codec::{Encode, Decode}; use consensus_common::{self, Authorities, BlockImport, Environment, Proposer, ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, + SelectChain, well_known_cache_keys +}; +use consensus_common::import_queue::{ + Verifier, BasicQueue, SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, +}; +use client::{ + block_builder::api::BlockBuilder as BlockBuilderApi, + blockchain::ProvideCache, + runtime_api::{ApiExt, Core as CoreApi}, + error::Result as CResult, + backend::AuxStore, }; -use consensus_common::well_known_cache_keys; -use consensus_common::import_queue::{Verifier, BasicQueue, SharedBlockImport, SharedJustificationImport}; -use client::ChainHead; -use client::block_builder::api::BlockBuilder as BlockBuilderApi; -use client::blockchain::ProvideCache; -use client::runtime_api::{ApiExt, Core as CoreApi}; use aura_primitives::AURA_ENGINE_ID; use runtime_primitives::{generic, generic::BlockId, Justification}; use runtime_primitives::traits::{ - Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, + Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, Zero, }; use primitives::Pair; -use inherents::{InherentDataProviders, InherentData, RuntimeString}; +use inherents::{InherentDataProviders, InherentData}; use authorities::AuthoritiesApi; -use futures::{Stream, Future, IntoFuture, future}; +use futures::{Future, IntoFuture, future, stream::Stream}; use tokio::timer::Timeout; use log::{warn, debug, info, trace}; @@ -57,11 +63,10 @@ use srml_aura::{ }; use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; -use aura_slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible}; +use slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, slot_now, check_equivocation}; -pub use aura_slots::SlotDuration; pub use aura_primitives::*; -pub use consensus_common::SyncOracle; +pub use consensus_common::{SyncOracle, ExtraVerification}; type AuthorityId

=

::Public; type Signature

=

::Signature; @@ -70,6 +75,10 @@ type Signature

=

::Signature; /// handle to a gossip service or similar. /// /// Intended to be a lightweight handle such as an `Arc`. +#[deprecated( + since = "1.0.1", + note = "This is dead code and will be removed in a future release", +)] pub trait Network: Clone { /// A stream of input messages for a topic. type In: Stream,Error=()>; @@ -78,6 +87,26 @@ pub trait Network: Clone { fn send_message(&self, slot: u64, message: Vec); } +/// A slot duration. Create with `get_or_compute`. +#[derive(Clone, Copy, Debug, Encode, Decode, Hash, PartialOrd, Ord, PartialEq, Eq)] +pub struct SlotDuration(slots::SlotDuration); + +impl SlotDuration { + /// Either fetch the slot duration from disk or compute it from the genesis + /// state. + pub fn get_or_compute(client: &C) -> CResult + where + C: AuxStore, C: ProvideRuntimeApi, C::Api: AuraApi, + { + slots::SlotDuration::get_or_compute(client, |a, b| a.slot_duration(b)).map(Self) + } + + /// Get the slot duration in milliseconds. + pub fn get(&self) -> u64 { + self.0.get() + } +} + /// Get slot author for given block along with authorities. fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option<&AuthorityId

> { if authorities.is_empty() { return None } @@ -93,24 +122,6 @@ fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option Some(current_author) } -fn duration_now() -> Option { - use std::time::SystemTime; - - let now = SystemTime::now(); - now.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| { - warn!("Current time {:?} is before unix epoch. Something is wrong: {:?}", now, e); - }).ok() -} - -/// Get the slot for now. -fn slot_now(slot_duration: u64) -> Option { - duration_now().map(|s| s.as_secs() / slot_duration) -} - -fn inherent_to_common_error(err: RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() -} - /// A digest item which is usable with aura consensus. pub trait CompatibleDigestItem: Sized { /// Construct a digest item which contains a slot number and a signature on the @@ -153,6 +164,7 @@ impl CompatibleDigestItem

for generic::DigestItem Result<(TimestampInherent, AuraInherent), consensus_common::Error> { data.timestamp_inherent_data() .and_then(|t| data.aura_inherent_data().map(|a| (t, a))) - .map_err(inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } } /// Start the aura worker in a separate thread. -pub fn start_aura_thread( +#[deprecated(since = "1.1", note = "Please spawn a thread manually")] +pub fn start_aura_thread( slot_duration: SlotDuration, local_key: Arc

, client: Arc, + select_chain: SC, block_import: Arc, env: Arc, sync_oracle: SO, @@ -178,8 +193,9 @@ pub fn start_aura_thread( force_authoring: bool, ) -> Result<(), consensus_common::Error> where B: Block + 'static, - C: ChainHead + ProvideRuntimeApi + ProvideCache + Send + Sync + 'static, + C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync + 'static, C::Api: AuthoritiesApi, + SC: SelectChain + Clone + 'static, E: Environment + Send + Sync + 'static, E::Proposer: Proposer + Send + 'static, <>::Create as IntoFuture>::Future: Send + 'static, @@ -203,9 +219,10 @@ pub fn start_aura_thread( force_authoring, }; - aura_slots::start_slot_worker_thread::<_, _, _, _, AuraSlotCompatible, _>( - slot_duration, - client, + #[allow(deprecated)] // The function we are in is also deprecated. + slots::start_slot_worker_thread::<_, _, _, _, AuraSlotCompatible, u64, _>( + slot_duration.0, + select_chain, Arc::new(worker), sync_oracle, on_exit, @@ -214,10 +231,11 @@ pub fn start_aura_thread( } /// Start the aura worker. The returned future should be run in a tokio runtime. -pub fn start_aura( +pub fn start_aura( slot_duration: SlotDuration, local_key: Arc

, client: Arc, + select_chain: SC, block_import: Arc, env: Arc, sync_oracle: SO, @@ -226,8 +244,9 @@ pub fn start_aura( force_authoring: bool, ) -> Result, consensus_common::Error> where B: Block, - C: ChainHead + ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + ProvideCache + AuxStore, C::Api: AuthoritiesApi, + SC: SelectChain + Clone, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, @@ -249,9 +268,9 @@ pub fn start_aura( sync_oracle: sync_oracle.clone(), force_authoring, }; - aura_slots::start_slot_worker::<_, _, _, _, AuraSlotCompatible, _>( - slot_duration, - client, + slots::start_slot_worker::<_, _, _, _, _, AuraSlotCompatible, _>( + slot_duration.0, + select_chain, Arc::new(worker), sync_oracle, on_exit, @@ -270,7 +289,7 @@ struct AuraWorker { } impl SlotWorker for AuraWorker where - C: ProvideRuntimeApi + ProvideCache, + C: ProvideRuntimeApi + ProvideCache + AuxStore, C::Api: AuthoritiesApi, E: Environment, E::Proposer: Proposer, @@ -426,7 +445,7 @@ impl SlotWorker for AuraWorker SlotWorker for AuraWorker( +fn check_header( + client: &Arc, slot_now: u64, mut header: B::Header, hash: B::Hash, @@ -446,8 +465,9 @@ fn check_header( allow_old_seals: bool, ) -> Result>, String> where DigestItemFor: CompatibleDigestItem

, - P::Public: AsRef, P::Signature: Decode, + C: client::backend::AuxStore, + P::Public: AsRef + Encode + Decode + PartialEq + Clone, { let digest_item = match header.digest_mut().pop() { Some(x) => x, @@ -480,26 +500,32 @@ fn check_header( let public = expected_author; if P::verify(&sig, &to_sign[..], public) { - Ok(CheckedHeader::Checked(header, digest_item)) + match check_equivocation::<_, _,

::Public>( + client, + slot_now, + slot_num, + header.clone(), + public.clone(), + ) { + Ok(Some(equivocation_proof)) => { + let log_str = format!( + "Slot author is equivocating at slot {} with headers {:?} and {:?}", + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); + info!("{}", log_str); + Err(log_str) + }, + Ok(None) => Ok(CheckedHeader::Checked(header, digest_item)), + Err(e) => Err(e.to_string()), + } } else { Err(format!("Bad signature on {:?}", hash)) } } } -/// Extra verification for Aura blocks. -pub trait ExtraVerification: Send + Sync { - /// Future that resolves when the block is verified or fails with error if not. - type Verified: IntoFuture; - - /// Do additional verification for this block. - fn verify( - &self, - header: &B::Header, - body: Option<&[B::Extrinsic]>, - ) -> Self::Verified; -} - /// A verifier for Aura blocks. pub struct AuraVerifier { client: Arc, @@ -575,7 +601,7 @@ impl ExtraVerification for NothingExtra { #[forbid(deprecated)] impl Verifier for AuraVerifier where - C: ProvideRuntimeApi + Send + Sync, + C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore, C::Api: BlockBuilderApi, DigestItemFor: CompatibleDigestItem

+ DigestItem>, E: ExtraVerification, @@ -606,7 +632,8 @@ impl Verifier for AuraVerifier where // we add one to allow for some small drift. // FIXME #1019 in the future, alter this queue to allow deferring of headers - let checked_header = check_header::( + let checked_header = check_header::( + &self.client, slot_now + 1, header, hash, @@ -648,6 +675,10 @@ impl Verifier for AuraVerifier where extra_verification.into_future().wait()?; + let new_authorities = pre_header.digest() + .log(DigestItem::as_authorities_change) + .map(|digest| digest.to_vec()); + let import_block = ImportBlock { origin, header: pre_header, @@ -659,8 +690,7 @@ impl Verifier for AuraVerifier where fork_choice: ForkChoiceStrategy::LongestChain, }; - // FIXME #1019 extract authorities - Ok((import_block, None)) + Ok((import_block, new_authorities)) } CheckedHeader::Deferred(a, b) => { debug!(target: "aura", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -685,6 +715,38 @@ impl Authorities for AuraVerifier where } } +fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, +{ + // no cache => no initialization + let cache = match client.cache() { + Some(cache) => cache, + None => return Ok(()), + }; + + // check if we already have initialized the cache + let genesis_id = BlockId::Number(Zero::zero()); + let genesis_authorities: Option>> = cache + .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) + .and_then(|v| Decode::decode(&mut &v[..])); + if genesis_authorities.is_some() { + return Ok(()); + } + + let map_err = |error| consensus_common::Error::from(consensus_common::Error::ClientImport( + format!( + "Error initializing authorities cache: {}", + error, + ))); + let genesis_authorities = authorities(client, &genesis_id)?; + cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_authorities.encode()) + .map_err(map_err)?; + + Ok(()) +} + #[allow(deprecated)] fn authorities(client: &C, at: &BlockId) -> Result>, ConsensusError> where B: Block, @@ -701,7 +763,7 @@ fn authorities(client: &C, at: &BlockId) -> Result( slot_duration: SlotDuration, block_import: SharedBlockImport, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, client: Arc, extra: E, inherent_data_providers: InherentDataProviders, ) -> Result, consensus_common::Error> where B: Block, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync, + C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, C::Api: BlockBuilderApi + AuthoritiesApi, DigestItemFor: CompatibleDigestItem

+ DigestItem>, E: 'static + ExtraVerification, @@ -740,6 +805,7 @@ pub fn import_queue( P::Signature: Encode + Decode, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; + initialize_authorities_cache(&*client)?; let verifier = Arc::new( AuraVerifier { @@ -750,23 +816,32 @@ pub fn import_queue( allow_old_seals: false, } ); - Ok(BasicQueue::new(verifier, block_import, justification_import)) + Ok(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )) } /// Start an import queue for the Aura consensus algorithm with backwards compatibility. #[deprecated( - note = "should not be used unless backwards compatibility with an older chain is needed." + since = "1.0.1", + note = "should not be used unless backwards compatibility with an older chain is needed.", )] pub fn import_queue_accept_old_seals( slot_duration: SlotDuration, block_import: SharedBlockImport, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, client: Arc, extra: E, inherent_data_providers: InherentDataProviders, ) -> Result, consensus_common::Error> where B: Block, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync, + C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, C::Api: BlockBuilderApi + AuthoritiesApi, DigestItemFor: CompatibleDigestItem

+ DigestItem>, E: 'static + ExtraVerification, @@ -775,6 +850,7 @@ pub fn import_queue_accept_old_seals( P::Signature: Encode + Decode, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; + initialize_authorities_cache(&*client)?; let verifier = Arc::new( AuraVerifier { @@ -785,7 +861,13 @@ pub fn import_queue_accept_old_seals( allow_old_seals: true, } ); - Ok(BasicQueue::new(verifier, block_import, justification_import)) + Ok(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )) } #[cfg(test)] @@ -793,19 +875,22 @@ mod tests { use super::*; use consensus_common::NoNetwork as DummyOracle; use network::test::*; - use network::test::{Block as TestBlock, PeersClient}; + use network::test::{Block as TestBlock, PeersClient, PeersFullClient}; use runtime_primitives::traits::Block as BlockT; use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; - use keyring::ed25519::Keyring; - use primitives::ed25519; - use client::BlockchainEvents; + use keyring::sr25519::Keyring; + use primitives::sr25519; + use client::{LongestChain, BlockchainEvents}; use test_client; + use primitives::hash::H256; + use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest, Block as RawBlock, ExtrinsicWrapper}; + use slots::{MAX_SLOT_CAPACITY, PRUNING_BOUND}; - type Error = ::client::error::Error; + type Error = client::error::Error; - type TestClient = ::client::Client; + type TestClient = client::Client; struct DummyFactory(Arc); struct DummyProposer(u64, Arc); @@ -814,7 +899,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId]) + fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId]) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -840,7 +925,7 @@ mod tests { impl TestNetFactory for AuraTestNet { type Specialization = DummySpecialization; - type Verifier = AuraVerifier; + type Verifier = AuraVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -851,25 +936,34 @@ mod tests { } } - fn make_verifier(&self, client: Arc, _cfg: &ProtocolConfig) + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) -> Arc { - let slot_duration = SlotDuration::get_or_compute(&*client) - .expect("slot duration available"); - let inherent_data_providers = InherentDataProviders::new(); - register_aura_inherent_data_provider( - &inherent_data_providers, - slot_duration.get() - ).expect("Registers aura inherent data provider"); + match client { + PeersClient::Full(client) => { + let slot_duration = SlotDuration::get_or_compute(&*client) + .expect("slot duration available"); + let inherent_data_providers = InherentDataProviders::new(); + register_aura_inherent_data_provider( + &inherent_data_providers, + slot_duration.get() + ).expect("Registers aura inherent data provider"); + + assert_eq!(slot_duration.get(), SLOT_DURATION); + Arc::new(AuraVerifier { + client, + extra: NothingExtra, + inherent_data_providers, + phantom: Default::default(), + allow_old_seals: false, + }) + }, + PeersClient::Light(_) => unreachable!("No (yet) tests for light client + Aura"), + } + } - assert_eq!(slot_duration.get(), SLOT_DURATION); - Arc::new(AuraVerifier { - client, - extra: NothingExtra, - inherent_data_providers, - phantom: Default::default(), - allow_old_seals: false, - }) + fn uses_tokio(&self) -> bool { + true } fn peer(&self, i: usize) -> &Peer { @@ -893,6 +987,26 @@ mod tests { } } + fn create_header(slot_num: u64, number: u64, pair: &sr25519::Pair) -> (HeaderTest, H256) { + let mut header = HeaderTest { + parent_hash: Default::default(), + number, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: DigestTest { logs: vec![], }, + }; + let header_hash: H256 = header.hash(); + let to_sign = (slot_num, header_hash).encode(); + let signature = pair.sign(&to_sign[..]); + + let item = as CompatibleDigestItem>::aura_seal( + slot_num, + signature, + ); + header.digest_mut().push(item); + (header, header_hash) + } + #[test] fn authoring_blocks() { let _ = ::env_logger::try_init(); @@ -911,7 +1025,11 @@ mod tests { let mut runtime = current_thread::Runtime::new().unwrap(); for (peer_id, key) in peers { - let client = net.lock().peer(*peer_id).client().clone(); + let client = net.lock().peer(*peer_id).client().as_full().expect("full clients are created").clone(); + let select_chain = LongestChain::new( + client.backend().clone(), + client.import_lock().clone(), + ); let environ = Arc::new(DummyFactory(client.clone())); import_notifications.push( client.import_notification_stream() @@ -927,10 +1045,11 @@ mod tests { &inherent_data_providers, slot_duration.get() ).expect("Registers aura inherent data provider"); - let aura = start_aura::<_, _, _, _, ed25519::Pair, _, _, _>( + let aura = start_aura::<_, _, _, _, _, sr25519::Pair, _, _, _>( slot_duration, Arc::new(key.clone().into()), client.clone(), + select_chain, client, environ.clone(), DummyOracle, @@ -950,7 +1069,7 @@ mod tests { let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) .for_each(move |_| { net.lock().send_import_notifications(); - net.lock().route_fast(); + net.lock().sync_without_disconnects(); Ok(()) }) .map(|_| ()) @@ -970,4 +1089,43 @@ mod tests { Keyring::Charlie.into() ]); } + + #[test] + fn check_header_works_with_equivocation() { + let client = test_client::new(); + let pair = sr25519::Pair::generate(); + let public = pair.public(); + let authorities = vec![public.clone(), sr25519::Pair::generate().public()]; + + let (header1, header1_hash) = create_header(2, 1, &pair); + let (header2, header2_hash) = create_header(2, 2, &pair); + let (header3, header3_hash) = create_header(4, 2, &pair); + let (header4, header4_hash) = create_header(MAX_SLOT_CAPACITY + 4, 3, &pair); + let (header5, header5_hash) = create_header(MAX_SLOT_CAPACITY + 4, 4, &pair); + let (header6, header6_hash) = create_header(4, 3, &pair); + + type B = RawBlock>; + type P = sr25519::Pair; + + let c = Arc::new(client); + + // It's ok to sign same headers. + assert!(check_header::<_, B, P>(&c, 2, header1.clone(), header1_hash, &authorities, false).is_ok()); + assert!(check_header::<_, B, P>(&c, 3, header1, header1_hash, &authorities, false).is_ok()); + + // But not two different headers at the same slot. + assert!(check_header::<_, B, P>(&c, 4, header2, header2_hash, &authorities, false).is_err()); + + // Different slot is ok. + assert!(check_header::<_, B, P>(&c, 5, header3, header3_hash, &authorities, false).is_ok()); + + // Here we trigger pruning and save header 4. + assert!(check_header::<_, B, P>(&c, PRUNING_BOUND + 2, header4, header4_hash, &authorities, false).is_ok()); + + // This fails because header 5 is an equivocation of header 4. + assert!(check_header::<_, B, P>(&c, PRUNING_BOUND + 3, header5, header5_hash, &authorities, false).is_err()); + + // This is ok because we pruned the corresponding header. Shows that we are pruning. + assert!(check_header::<_, B, P>(&c, PRUNING_BOUND + 4, header6, header6_hash, &authorities, false).is_ok()); + } } diff --git a/core/consensus/authorities/Cargo.toml b/core/consensus/authorities/Cargo.toml index cfd73ed70940ec69fa3769d9ba03f1a11e9d2b47..c4249f39d463537db1396cbe2063e3694f7fcf59 100644 --- a/core/consensus/authorities/Cargo.toml +++ b/core/consensus/authorities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..bc557ffb564a3d8ffc4c63662bbaa26547c57f1a --- /dev/null +++ b/core/consensus/babe/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "substrate-consensus-babe" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "BABE consensus algorithm for substrate" +edition = "2018" + +[dependencies] +parity-codec = "3.4.0" +parity-codec-derive = "3.3.0" +babe_primitives = { package = "substrate-consensus-babe-primitives", path = "primitives" } +primitives = { package = "substrate-primitives", path = "../../primitives" } +runtime_support = { package = "srml-support", path = "../../../srml/support" } +runtime_version = { package = "sr-version", path = "../../sr-version" } +runtime_io = { package = "sr-io", path = "../../sr-io" } +inherents = { package = "substrate-inherents", path = "../../inherents" } +srml-consensus = { path = "../../../srml/consensus" } +substrate-telemetry = { path = "../../telemetry" } +srml-babe = { path = "../../../srml/babe" } +client = { package = "substrate-client", path = "../../client" } +consensus_common = { package = "substrate-consensus-common", path = "../common" } +authorities = { package = "substrate-consensus-authorities", path = "../authorities" } +slots = { package = "substrate-consensus-slots", path = "../slots" } +runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +futures = "0.1.26" +tokio = "0.1.18" +parking_lot = "0.7.1" +log = "0.4.6" +schnorrkel = "0.1.1" +rand = "0.6.5" +merlin = "1.0.3" + +[dev-dependencies] +keyring = { package = "substrate-keyring", path = "../../keyring" } +substrate-executor = { path = "../../executor" } +network = { package = "substrate-network", path = "../../network", features = ["test-helpers"]} +service = { package = "substrate-service", path = "../../service" } +test_client = { package = "substrate-test-client", path = "../../test-client" } +env_logger = "0.6.1" diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..67700c8ee0abe9175de61d09948ca1370ad758c2 --- /dev/null +++ b/core/consensus/babe/primitives/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "substrate-consensus-babe-primitives" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "Primitives for BABE consensus" +edition = "2018" + +[dependencies] +substrate-client = { path = "../../../client", default-features = false } +runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } +slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } +parity-codec = { version = "3.5.1", default-features = false } + +[features] +default = ["std"] +std = [ + "runtime_primitives/std", + "substrate-client/std", + "parity-codec/std", + "slots", +] diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..83ba6ccba2bbc377d0b6c35379c68fee6e9821d8 --- /dev/null +++ b/core/consensus/babe/primitives/src/lib.rs @@ -0,0 +1,73 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Primitives for BABE. +#![forbid(warnings, unsafe_code, missing_docs)] +#![cfg_attr(not(feature = "std"), no_std)] + +use runtime_primitives::ConsensusEngineId; +use substrate_client::decl_runtime_apis; + +use parity_codec::{Encode, Decode}; + +/// The `ConsensusEngineId` of BABE. +pub const BABE_ENGINE_ID: ConsensusEngineId = [b'b', b'a', b'b', b'e']; + +/// Configuration data used by the BABE consensus engine. +#[derive(Copy, Clone, Hash, PartialEq, Eq, Debug, Encode, Decode)] +pub struct BabeConfiguration { + /// The slot duration in milliseconds for BABE. Currently, only + /// the value provided by this type at genesis will be used. + /// + /// Dynamic slot duration may be supported in the future. + pub slot_duration: u64, + + /// The expected block time in milliseconds for BABE. Currently, + /// only the value provided by this type at genesis will be used. + /// + /// Dynamic expected block time may be supported in the future. + pub expected_block_time: u64, + + /// The maximum permitted VRF output, or *threshold*, for BABE. Currently, + /// only the value provided by this type at genesis will be used. + /// + /// Dynamic thresholds may be supported in the future. + pub threshold: u64, +} + +#[cfg(feature = "std")] +impl slots::SlotData for BabeConfiguration { + /// Return the slot duration in milliseconds for BABE. Currently, only + /// the value provided by this type at genesis will be used. + /// + /// Dynamic slot duration may be supported in the future. + fn slot_duration(&self) -> u64 { + self.slot_duration + } + + const SLOT_KEY: &'static [u8] = b"babe_bootstrap_data"; +} + +decl_runtime_apis! { + /// API necessary for block authorship with BABE. + pub trait BabeApi { + /// Return the configuration for BABE. Currently, + /// only the value provided by this type at genesis will be used. + /// + /// Dynamic configuration may be supported in the future. + fn startup_data() -> BabeConfiguration; + } +} diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..cccbc160c61e4efd8e0826268a46c70e2cd0784f --- /dev/null +++ b/core/consensus/babe/src/lib.rs @@ -0,0 +1,1208 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! # BABE consensus +//! +//! BABE (Blind Assignment for Blockchain Extension) consensus in substrate. +//! +//! # Stability +//! +//! This crate is highly unstable and experimental. Breaking changes may +//! happen at any point. This crate is also missing features, such as banning +//! of malicious validators, that are essential for a production network. +#![forbid(unsafe_code, missing_docs)] +#![deny(warnings)] +extern crate core; +pub use babe_primitives::*; +pub use consensus_common::SyncOracle; +use consensus_common::ExtraVerification; +use runtime_primitives::{generic, generic::BlockId, Justification}; +use runtime_primitives::traits::{ + Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, +}; +use std::{sync::Arc, u64, fmt::Debug}; +use parity_codec::{Decode, Encode, Input}; +use primitives::{ + crypto::Pair, + sr25519::{Public, Signature, LocalizedSignature, self}, +}; +use merlin::Transcript; +use inherents::{InherentDataProviders, InherentData}; +use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; +use schnorrkel::{ + keys::Keypair, + vrf::{ + VRFProof, VRFProofBatchable, VRFInOut, VRFOutput, + VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH, + }, + PUBLIC_KEY_LENGTH, SIGNATURE_LENGTH, +}; +use authorities::AuthoritiesApi; +use consensus_common::{self, Authorities, BlockImport, Environment, Proposer, + ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, +}; +use srml_babe::{ + BabeInherentData, + timestamp::{TimestampInherentData, InherentType as TimestampInherent} +}; +use consensus_common::{SelectChain, well_known_cache_keys}; +use consensus_common::import_queue::{Verifier, BasicQueue}; +use client::{ + block_builder::api::BlockBuilder as BlockBuilderApi, + blockchain::ProvideCache, + runtime_api::ApiExt, + error::Result as CResult, + backend::AuxStore, +}; +use slots::{CheckedHeader, check_equivocation}; +use futures::{Future, IntoFuture, future}; +use tokio::timer::Timeout; +use log::{error, warn, debug, info, trace}; + +use slots::{SlotWorker, SlotInfo, SlotCompatible, slot_now}; + +/// A BABE seal. It includes: +/// +/// * The public key +/// * The VRF proof +/// * The signature +/// * The slot number +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct BabeSeal { + vrf_output: VRFOutput, + proof: VRFProof, + signature: LocalizedSignature, + slot_num: u64, +} + +/// The prefix used by BABE for its VRF keys. +pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; + +macro_rules! babe_assert_eq { + ($a: expr, $b: expr) => { + { + let ref a = $a; + let ref b = $b; + if a != b { + error!( + target: "babe", + "Expected {:?} to equal {:?}, but they were not", + stringify!($a), + stringify!($b), + ); + assert_eq!(a, b); + } + } + }; +} + +type TmpDecode = ( + [u8; VRF_OUTPUT_LENGTH], + [u8; VRF_PROOF_LENGTH], + [u8; SIGNATURE_LENGTH], + [u8; PUBLIC_KEY_LENGTH], + u64, +); + +impl Encode for BabeSeal { + fn encode(&self) -> Vec { + let tmp: TmpDecode = ( + *self.vrf_output.as_bytes(), + self.proof.to_bytes(), + self.signature.signature.0, + self.signature.signer.0, + self.slot_num, + ); + let encoded = parity_codec::Encode::encode(&tmp); + if cfg!(any(test, debug_assertions)) { + debug!(target: "babe", "Checking if encoding was correct"); + let decoded_version = Self::decode(&mut &encoded[..]) + .expect("we just encoded this ourselves, so it is correct; qed"); + babe_assert_eq!(decoded_version.proof, self.proof); + babe_assert_eq!(decoded_version.vrf_output, self.vrf_output); + babe_assert_eq!(decoded_version.signature.signature, self.signature.signature); + babe_assert_eq!(decoded_version.signature.signer, self.signature.signer); + babe_assert_eq!(decoded_version.slot_num, self.slot_num); + debug!(target: "babe", "Encoding was correct") + } + encoded + } +} + +impl Decode for BabeSeal { + fn decode(i: &mut R) -> Option { + let (output, proof, sig, public_key, slot_num): TmpDecode = Decode::decode(i)?; + Some(BabeSeal { + proof: VRFProof::from_bytes(&proof).ok()?, + vrf_output: VRFOutput::from_bytes(&output).ok()?, + signature: LocalizedSignature { + signature: Signature(sig), + signer: Public(public_key), + }, + slot_num, + }) + } +} + +/// A slot duration. Create with `get_or_compute`. +// FIXME: Once Rust has higher-kinded types, the duplication between this +// and `super::aura::Config` can be eliminated. +// https://github.com/paritytech/substrate/issues/2434 +pub struct Config(slots::SlotDuration); + +impl Config { + /// Either fetch the slot duration from disk or compute it from the genesis + /// state. + pub fn get_or_compute(client: &C) -> CResult + where + C: AuxStore, C: ProvideRuntimeApi, C::Api: BabeApi, + { + trace!(target: "babe", "Getting slot duration"); + match slots::SlotDuration::get_or_compute(client, |a, b| a.startup_data(b)).map(Self) { + Ok(s) => Ok(s), + Err(s) => { + warn!(target: "babe", "Failed to get slot duration"); + Err(s) + } + } + } + + /// Get the slot duration in milliseconds. + pub fn get(&self) -> u64 { + self.0.slot_duration + } + + /// Retrieve the threshold for BABE + pub fn threshold(&self) -> u64 { + self.0.threshold + } +} + +/// A digest item which is usable with BABE consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a slot number and a signature + /// on the hash. + fn babe_seal(signature: BabeSeal) -> Self; + + /// If this item is an Babe seal, return the slot number and signature. + fn as_babe_seal(&self) -> Option; +} + +impl CompatibleDigestItem for generic::DigestItem + where T: Debug, Hash: Debug +{ + /// Construct a digest item which contains a slot number and a signature + /// on the hash. + fn babe_seal(signature: BabeSeal) -> Self { + generic::DigestItem::Consensus(BABE_ENGINE_ID, signature.encode()) + } + + /// If this item is an BABE seal, return the slot number and signature. + fn as_babe_seal(&self) -> Option { + match self { + generic::DigestItem::Consensus(BABE_ENGINE_ID, seal) => { + match Decode::decode(&mut &seal[..]) { + s @ Some(_) => s, + s @ None => { + info!(target: "babe", "Failed to decode {:?}", seal); + s + } + } + } + _ => { + info!(target: "babe", "Invalid consensus: {:?}!", self); + None + } + } + } +} + +struct BabeSlotCompatible; + +impl SlotCompatible for BabeSlotCompatible { + fn extract_timestamp_and_slot( + data: &InherentData + ) -> Result<(TimestampInherent, u64), consensus_common::Error> { + trace!(target: "babe", "extract timestamp"); + data.timestamp_inherent_data() + .and_then(|t| data.babe_inherent_data().map(|a| (t, a))) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) + } +} + +/// Parameters for BABE. +pub struct BabeParams { + + /// The configuration for BABE. Includes the slot duration, threshold, and + /// other parameters. + pub config: Config, + + /// The key of the node we are running on. + pub local_key: Arc, + + /// The client to use + pub client: Arc, + + /// The SelectChain Strategy + pub select_chain: SC, + + /// A block importer + pub block_import: Arc, + + /// The environment + pub env: Arc, + + /// A sync oracle + pub sync_oracle: SO, + + /// Exit callback. + pub on_exit: OnExit, + + /// Providers for inherent data. + pub inherent_data_providers: InherentDataProviders, + + /// Force authoring of blocks even if we are offline + pub force_authoring: bool, +} + +/// Start the babe worker. The returned future should be run in a tokio runtime. +pub fn start_babe(BabeParams { + config, + local_key, + client, + select_chain, + block_import, + env, + sync_oracle, + on_exit, + inherent_data_providers, + force_authoring, +}: BabeParams) -> Result< + impl Future, + consensus_common::Error, +> where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, + E: Environment, + E::Proposer: Proposer, + <>::Create as IntoFuture>::Future: Send + 'static, + I: BlockImport + Send + Sync + 'static, + SO: SyncOracle + Send + Sync + Clone, + SC: SelectChain, + DigestItemFor: CompatibleDigestItem + DigestItem, + Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, + OnExit: Future, +{ + let worker = BabeWorker { + client: client.clone(), + block_import, + env, + local_key, + inherent_data_providers: inherent_data_providers.clone(), + sync_oracle: sync_oracle.clone(), + force_authoring, + threshold: config.threshold(), + }; + slots::start_slot_worker::<_, _, _, _, _, BabeSlotCompatible, _>( + config.0, + select_chain, + Arc::new(worker), + sync_oracle, + on_exit, + inherent_data_providers + ) +} + +struct BabeWorker { + client: Arc, + block_import: Arc, + env: Arc, + local_key: Arc, + sync_oracle: SO, + inherent_data_providers: InherentDataProviders, + force_authoring: bool, + threshold: u64, +} + +impl SlotWorker for BabeWorker where + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, + E: Environment, + E::Proposer: Proposer, + <>::Create as IntoFuture>::Future: Send + 'static, + I: BlockImport + Send + Sync + 'static, + SO: SyncOracle + Send + Clone, + DigestItemFor: CompatibleDigestItem + DigestItem, + Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, +{ + type OnSlot = Box + Send>; + + fn on_start( + &self, + slot_duration: u64 + ) -> Result<(), consensus_common::Error> { + register_babe_inherent_data_provider(&self.inherent_data_providers, slot_duration) + } + + fn on_slot( + &self, + chain_head: B::Header, + slot_info: SlotInfo, + ) -> Self::OnSlot { + let pair = self.local_key.clone(); + let ref client = self.client; + let block_import = self.block_import.clone(); + let ref env = self.env; + + let (timestamp, slot_num, slot_duration) = + (slot_info.timestamp, slot_info.number, slot_info.duration); + + let authorities = match authorities(client.as_ref(), &BlockId::Hash(chain_head.hash())) { + Ok(authorities) => authorities, + Err(e) => { + error!( + target: "babe", + "Unable to fetch authorities at block {:?}: {:?}", + chain_head.hash(), + e + ); + telemetry!(CONSENSUS_WARN; "babe.unable_fetching_authorities"; + "slot" => ?chain_head.hash(), "err" => ?e + ); + return Box::new(future::ok(())); + } + }; + + if !self.force_authoring && self.sync_oracle.is_offline() && authorities.len() > 1 { + debug!(target: "babe", "Skipping proposal slot. Waiting for the network."); + telemetry!(CONSENSUS_DEBUG; "babe.skipping_proposal_slot"; + "authorities_len" => authorities.len() + ); + return Box::new(future::ok(())); + } + + // FIXME replace the dummy empty slices with real data + // https://github.com/paritytech/substrate/issues/2435 + // https://github.com/paritytech/substrate/issues/2436 + let authoring_result = if let Some((inout, proof, _batchable_proof)) = claim_slot( + &[0u8; 0], + slot_info.number, + &[0u8; 0], + 0, + &authorities, + &pair, + self.threshold, + ) { + debug!( + target: "babe", "Starting authorship at slot {}; timestamp = {}", + slot_num, + timestamp, + ); + telemetry!(CONSENSUS_DEBUG; "babe.starting_authorship"; + "slot_num" => slot_num, "timestamp" => timestamp + ); + + // we are the slot author. make a block and sign it. + let proposer = match env.init(&chain_head, &authorities) { + Ok(p) => p, + Err(e) => { + warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_num, e); + telemetry!(CONSENSUS_WARN; "babe.unable_authoring_block"; + "slot" => slot_num, "err" => ?e + ); + return Box::new(future::ok(())) + } + }; + + let remaining_duration = slot_info.remaining_duration(); + // deadline our production to approx. the end of the + // slot + (Timeout::new( + proposer.propose( + slot_info.inherent_data, + remaining_duration, + ).into_future(), + remaining_duration, + ), + inout.to_output(), + proof) + } else { + return Box::new(future::ok(())); + }; + + let (proposal_work, vrf_output, proof) = authoring_result; + + Box::new( + proposal_work + .map(move |b| { + // minor hack since we don't have access to the timestamp + // that is actually set by the proposer. + let slot_after_building = slot_now(slot_duration); + if slot_after_building != Some(slot_num) { + info!( + target: "babe", + "Discarding proposal for slot {}; block production took too long", + slot_num + ); + telemetry!(CONSENSUS_INFO; "babe.discarding_proposal_took_too_long"; + "slot" => slot_num + ); + return + } + + let (header, body) = b.deconstruct(); + let header_num = header.number().clone(); + let pre_hash = header.hash(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let to_sign = (slot_num, pre_hash, proof.to_bytes()).encode(); + let signature = pair.sign(&to_sign[..]); + let item = as CompatibleDigestItem>::babe_seal(BabeSeal { + proof, + signature: LocalizedSignature { + signature, + signer: pair.public(), + }, + slot_num, + vrf_output, + }); + + let import_block: ImportBlock = ImportBlock { + origin: BlockOrigin::Own, + header, + justification: None, + post_digests: vec![item], + body: Some(body), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + info!(target: "babe", + "Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + header_num, + import_block.post_header().hash(), + pre_hash + ); + telemetry!(CONSENSUS_INFO; "babe.pre_sealed_block"; + "header_num" => ?header_num, + "hash_now" => ?import_block.post_header().hash(), + "hash_previously" => ?pre_hash + ); + + if let Err(e) = block_import.import_block(import_block, Default::default()) { + warn!(target: "babe", "Error with block built on {:?}: {:?}", + parent_hash, e); + telemetry!(CONSENSUS_WARN; "babe.err_with_block_built_on"; + "hash" => ?parent_hash, "err" => ?e + ); + } + }) + .map_err(|e| { + warn!("Client import failed: {:?}", e); + consensus_common::Error::ClientImport(format!("{:?}", e)) + }) + ) + } +} + +/// check a header has been signed by the right key. If the slot is too far in +/// the future, an error will be returned. If successful, returns the pre-header +/// and the digest item containing the seal. +/// +/// This digest item will always return `Some` when used with `as_babe_seal`. +// +// FIXME #1018 needs misbehavior types +#[forbid(warnings)] +fn check_header( + client: &Arc, + slot_now: u64, + mut header: B::Header, + hash: B::Hash, + authorities: &[Public], + threshold: u64, +) -> Result>, String> + where DigestItemFor: CompatibleDigestItem, +{ + trace!(target: "babe", "Checking header"); + let digest_item = match header.digest_mut().pop() { + Some(x) => x, + None => return Err(format!("Header {:?} is unsealed", hash)), + }; + + let BabeSeal { + slot_num, + signature: LocalizedSignature { signer, signature }, + proof, + vrf_output, + } = digest_item.as_babe_seal().ok_or_else(|| { + debug!(target: "babe", "Header {:?} is unsealed", hash); + format!("Header {:?} is unsealed", hash) + })?; + + if slot_num > slot_now { + header.digest_mut().push(digest_item); + Ok(CheckedHeader::Deferred(header, slot_num)) + } else if !authorities.contains(&signer) { + debug!(target: "babe", "Slot Author not found"); + Err("Slot Author not found".to_string()) + } else { + let pre_hash = header.hash(); + let to_sign = (slot_num, pre_hash, proof.to_bytes()).encode(); + + if sr25519::Pair::verify(&signature, &to_sign[..], &signer) { + let (inout, _batchable_proof) = { + let transcript = make_transcript( + Default::default(), + slot_num, + Default::default(), + 0, + ); + schnorrkel::PublicKey::from_bytes(signer.as_slice()).and_then(|p| { + p.vrf_verify(transcript, &vrf_output, &proof) + }).map_err(|s| { + debug!(target: "babe", "VRF verification failed: {:?}", s); + format!("VRF verification failed") + })? + }; + + if check(&inout, threshold) { + match check_equivocation(&client, slot_now, slot_num, header.clone(), signer.clone()) { + Ok(Some(equivocation_proof)) => { + let log_str = format!( + "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", + signer, + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); + info!("{}", log_str); + Err(log_str) + }, + Ok(None) => { + Ok(CheckedHeader::Checked(header, digest_item)) + }, + Err(e) => { + Err(e.to_string()) + }, + } + } else { + debug!(target: "babe", "VRF verification failed: threshold {} exceeded", threshold); + Err(format!("Validator {:?} made seal when it wasn’t its turn", signer)) + } + } else { + debug!(target: "babe", "Bad signature on {:?}", hash); + Err(format!("Bad signature on {:?}", hash)) + } + } +} + +/// A verifier for Babe blocks. +pub struct BabeVerifier { + client: Arc, + extra: E, + inherent_data_providers: inherents::InherentDataProviders, + threshold: u64, +} + +impl BabeVerifier { + fn check_inherents( + &self, + block: B, + block_id: BlockId, + inherent_data: InherentData, + ) -> Result<(), String> + where C: ProvideRuntimeApi, C::Api: BlockBuilderApi + { + let inherent_res = self.client.runtime_api().check_inherents( + &block_id, + block, + inherent_data, + ).map_err(|e| format!("{:?}", e))?; + + if !inherent_res.ok() { + inherent_res + .into_errors() + .try_for_each(|(i, e)| Err(self.inherent_data_providers.error_to_string(&i, &e))) + } else { + Ok(()) + } + } +} + +/// No-op extra verification. +#[derive(Debug, Clone, Copy)] +pub struct NothingExtra; + +impl ExtraVerification for NothingExtra { + type Verified = Result<(), String>; + + fn verify(&self, _: &B::Header, _: Option<&[B::Extrinsic]>) -> Self::Verified { + Ok(()) + } +} + +impl Verifier for BabeVerifier where + C: ProvideRuntimeApi + Send + Sync + AuxStore, + C::Api: BlockBuilderApi, + DigestItemFor: CompatibleDigestItem + DigestItem, + E: ExtraVerification, + Self: Authorities, +{ + fn verify( + &self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + mut body: Option>, + ) -> Result<(ImportBlock, Option>), String> { + trace!( + target: "babe", + "Verifying origin: {:?} header: {:?} justification: {:?} body: {:?}", + origin, + header, + justification, + body, + ); + let mut inherent_data = self + .inherent_data_providers + .create_inherent_data() + .map_err(String::from)?; + let (_, slot_now) = BabeSlotCompatible::extract_timestamp_and_slot(&inherent_data) + .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; + let hash = header.hash(); + let parent_hash = *header.parent_hash(); + let authorities = self.authorities(&BlockId::Hash(parent_hash)) + .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; + + let extra_verification = self.extra.verify( + &header, + body.as_ref().map(|x| &x[..]), + ); + + // we add one to allow for some small drift. + // FIXME #1019 in the future, alter this queue to allow deferring of + // headers + let checked_header = check_header::( + &self.client, + slot_now + 1, + header, + hash, + &authorities[..], + self.threshold, + )?; + match checked_header { + CheckedHeader::Checked(pre_header, seal) => { + let BabeSeal { slot_num, .. } = seal.as_babe_seal() + .expect("check_header always returns a seal digest item; qed"); + + // if the body is passed through, we need to use the runtime + // to check that the internally-set timestamp in the inherents + // actually matches the slot set in the seal. + if let Some(inner_body) = body.take() { + inherent_data.babe_replace_inherent_data(slot_num); + let block = B::new(pre_header.clone(), inner_body); + + self.check_inherents( + block.clone(), + BlockId::Hash(parent_hash), + inherent_data, + )?; + + let (_, inner_body) = block.deconstruct(); + body = Some(inner_body); + } + + trace!(target: "babe", "Checked {:?}; importing.", pre_header); + telemetry!( + CONSENSUS_TRACE; + "babe.checked_and_importing"; + "pre_header" => ?pre_header); + + extra_verification.into_future().wait()?; + + let import_block = ImportBlock { + origin, + header: pre_header, + post_digests: vec![seal], + body, + finalized: false, + justification, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + // FIXME #1019 extract authorities + Ok((import_block, None)) + } + CheckedHeader::Deferred(a, b) => { + debug!(target: "babe", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); + telemetry!(CONSENSUS_DEBUG; "babe.header_too_far_in_future"; + "hash" => ?hash, "a" => ?a, "b" => ?b + ); + Err(format!("Header {:?} rejected: too far in the future", hash)) + } + } + } +} + +impl Authorities for BabeVerifier where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, +{ + type Error = ConsensusError; + + fn authorities(&self, at: &BlockId) -> Result>, Self::Error> { + authorities(self.client.as_ref(), at) + } +} + +fn authorities(client: &C, at: &BlockId) -> Result< + Vec>, + ConsensusError, +> where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: AuthoritiesApi, +{ + client + .cache() + .and_then(|cache| cache.get_at(&well_known_cache_keys::AUTHORITIES, at) + .and_then(|v| Decode::decode(&mut &v[..]))) + .or_else(|| { + if client.runtime_api().has_api::>(at).unwrap_or(false) { + AuthoritiesApi::authorities(&*client.runtime_api(), at).ok() + } else { + panic!("We don’t support deprecated code with new consensus algorithms, \ + therefore this is unreachable; qed") + } + }).ok_or(consensus_common::Error::InvalidAuthoritiesSet) +} + +/// The BABE import queue type. +pub type BabeImportQueue = BasicQueue; + +/// Register the babe inherent data provider, if not registered already. +fn register_babe_inherent_data_provider( + inherent_data_providers: &InherentDataProviders, + slot_duration: u64, +) -> Result<(), consensus_common::Error> { + debug!(target: "babe", "Registering"); + if !inherent_data_providers.has_provider(&srml_babe::INHERENT_IDENTIFIER) { + inherent_data_providers + .register_provider(srml_babe::InherentDataProvider::new(slot_duration)) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) + } else { + Ok(()) + } +} + +fn get_keypair(q: &sr25519::Pair) -> &Keypair { + q.as_ref() +} + +fn make_transcript( + randomness: &[u8], + slot_number: u64, + genesis_hash: &[u8], + epoch: u64, +) -> Transcript { + let mut transcript = Transcript::new(&BABE_ENGINE_ID); + transcript.commit_bytes(b"slot number", &slot_number.to_le_bytes()); + transcript.commit_bytes(b"genesis block hash", genesis_hash); + transcript.commit_bytes(b"current epoch", &epoch.to_le_bytes()); + transcript.commit_bytes(b"chain randomness", randomness); + transcript +} + +fn check(inout: &VRFInOut, threshold: u64) -> bool { + u64::from_le_bytes(inout.make_bytes::<[u8; 8]>(BABE_VRF_PREFIX)) < threshold +} + +/// Claim a slot if it is our turn. Returns `None` if it is not our turn. +/// +/// This hashes the slot number, epoch, genesis hash, and chain randomness into +/// the VRF. If the VRF produces a value less than `threshold`, it is our turn, +/// so it returns `Some(_)`. Otherwise, it returns `None`. +fn claim_slot( + randomness: &[u8], + slot_number: u64, + genesis_hash: &[u8], + epoch: u64, + authorities: &[sr25519::Public], + key: &sr25519::Pair, + threshold: u64, +) -> Option<(VRFInOut, VRFProof, VRFProofBatchable)> { + if !authorities.contains(&key.public()) { return None } + let transcript = make_transcript( + randomness, + slot_number, + genesis_hash, + epoch, + ); + + // Compute the threshold we will use. + // + // We already checked that authorities contains `key.public()`, so it can’t + // be empty. Therefore, this division is safe. + let threshold = threshold / authorities.len() as u64; + + get_keypair(key).vrf_sign_n_check(transcript, |inout| check(inout, threshold)) +} + +#[cfg(test)] +#[allow(dead_code, unused_imports, deprecated)] +// FIXME #2532: need to allow deprecated until refactor is done https://github.com/paritytech/substrate/issues/2532 + +mod tests { + use super::*; + + use client::LongestChain; + use consensus_common::NoNetwork as DummyOracle; + use network::test::*; + use network::test::{Block as TestBlock, PeersClient}; + use runtime_primitives::traits::Block as BlockT; + use network::config::ProtocolConfig; + use parking_lot::Mutex; + use tokio::runtime::current_thread; + use keyring::sr25519::Keyring; + use client::BlockchainEvents; + use test_client; + use futures::stream::Stream; + use log::debug; + use std::time::Duration; + use test_client::AuthorityKeyring; + use primitives::hash::H256; + use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest, Block as RawBlock, ExtrinsicWrapper}; + use slots::{MAX_SLOT_CAPACITY, PRUNING_BOUND}; + + type Error = client::error::Error; + + type TestClient = client::Client< + test_client::Backend, + test_client::Executor, + TestBlock, + test_client::runtime::RuntimeApi, + >; + + struct DummyFactory(Arc); + struct DummyProposer(u64, Arc); + + impl Environment for DummyFactory { + type Proposer = DummyProposer; + type Error = Error; + + fn init(&self, parent_header: &::Header, _authorities: &[Public]) + -> Result + { + Ok(DummyProposer(parent_header.number + 1, self.0.clone())) + } + } + + impl Proposer for DummyProposer { + type Error = Error; + type Create = Result; + + fn propose(&self, _: InherentData, _: Duration) -> Result { + self.1.new_block().unwrap().bake().map_err(|e| e.into()) + } + } + + const SLOT_DURATION: u64 = 1; + const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); + + pub struct BabeTestNet { + peers: Vec>>, + started: bool, + } + + impl TestNetFactory for BabeTestNet { + type Specialization = DummySpecialization; + type Verifier = BabeVerifier; + type PeerData = (); + + /// Create new test network with peers and given config. + fn from_config(_config: &ProtocolConfig) -> Self { + debug!(target: "babe", "Creating test network from config"); + BabeTestNet { + peers: Vec::new(), + started: false, + } + } + + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) + -> Arc + { + let client = client.as_full().expect("only full clients are used in test"); + trace!(target: "babe", "Creating a verifier"); + let config = Config::get_or_compute(&*client) + .expect("slot duration available"); + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, + config.get() + ).expect("Registers babe inherent data provider"); + trace!(target: "babe", "Provider registered"); + + assert_eq!(config.get(), SLOT_DURATION); + Arc::new(BabeVerifier { + client, + extra: NothingExtra, + inherent_data_providers, + threshold: config.threshold(), + }) + } + + fn uses_tokio(&self) -> bool { + true + } + + fn peer(&self, i: usize) -> &Peer { + trace!(target: "babe", "Retreiving a peer"); + &self.peers[i] + } + + fn peers(&self) -> &Vec>> { + trace!(target: "babe", "Retreiving peers"); + &self.peers + } + + fn mut_peers>>)>( + &mut self, + closure: F, + ) { + closure(&mut self.peers); + } + + fn started(&self) -> bool { + self.started + } + + fn set_started(&mut self, new: bool) { + self.started = new; + } + } + + fn create_header(slot_num: u64, number: u64, pair: &sr25519::Pair) -> (HeaderTest, H256) { + let mut header = HeaderTest { + parent_hash: Default::default(), + number, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: DigestTest { logs: vec![], }, + }; + + let transcript = make_transcript( + Default::default(), + slot_num, + Default::default(), + 0, + ); + + let (inout, proof, _batchable_proof) = get_keypair(&pair).vrf_sign_n_check(transcript, |inout| check(inout, u64::MAX)).unwrap(); + let pre_hash: H256 = header.hash(); + let to_sign = (slot_num, pre_hash, proof.to_bytes()).encode(); + let signature = pair.sign(&to_sign[..]); + let item = as CompatibleDigestItem>::babe_seal(BabeSeal { + proof, + signature: LocalizedSignature { + signature, + signer: pair.public(), + }, + slot_num, + vrf_output: inout.to_output(), + }); + + header.digest_mut().push(item); + (header, pre_hash) + } + + #[test] + fn can_serialize_block() { + drop(env_logger::try_init()); + assert!(BabeSeal::decode(&mut &b""[..]).is_none()); + } + + #[test] + fn authoring_blocks() { + drop(env_logger::try_init()); + debug!(target: "babe", "checkpoint 1"); + let mut net = BabeTestNet::new(3); + debug!(target: "babe", "checkpoint 2"); + + net.start(); + debug!(target: "babe", "checkpoint 3"); + + let peers = &[ + (0, Keyring::Alice), + (1, Keyring::Bob), + (2, Keyring::Charlie), + ]; + + let net = Arc::new(Mutex::new(net)); + let mut import_notifications = Vec::new(); + debug!(target: "babe", "checkpoint 4"); + let mut runtime = current_thread::Runtime::new().unwrap(); + for (peer_id, key) in peers { + let client = net.lock().peer(*peer_id).client().as_full().unwrap(); + let environ = Arc::new(DummyFactory(client.clone())); + import_notifications.push( + client.import_notification_stream() + .take_while(|n| Ok(!(n.origin != BlockOrigin::Own && n.header.number() < &5))) + .for_each(move |_| Ok(())) + ); + + let config = Config::get_or_compute(&*client) + .expect("slot duration available"); + + let inherent_data_providers = InherentDataProviders::new(); + register_babe_inherent_data_provider( + &inherent_data_providers, config.get() + ).expect("Registers babe inherent data provider"); + + let babe = start_babe(BabeParams { + config, + local_key: Arc::new(key.clone().into()), + block_import: client.clone(), + select_chain: LongestChain::new(client.backend().clone(), client.import_lock().clone()), + client, + env: environ.clone(), + sync_oracle: DummyOracle, + on_exit: futures::empty(), + inherent_data_providers, + force_authoring: false, + }).expect("Starts babe"); + + runtime.spawn(babe); + } + debug!(target: "babe", "checkpoint 5"); + + // wait for all finalized on each. + let wait_for = ::futures::future::join_all(import_notifications) + .map(drop) + .map_err(drop); + + let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) + .for_each(move |_| { + net.lock().send_import_notifications(); + net.lock().sync_without_disconnects(); + Ok(()) + }) + .map(drop) + .map_err(drop); + + runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap(); + } + + #[test] + #[allow(deprecated)] + #[should_panic] + fn old_seals_rejected() { + drop(env_logger::try_init()); + generic::DigestItem::::Seal(0, Signature([0; 64])).as_babe_seal().unwrap(); + } + + #[test] + fn wrong_number_rejected() { + drop(env_logger::try_init()); + let bad_seal = generic::DigestItem::::Consensus([0; 4], Signature([0; 64]).encode()); + assert!(bad_seal.as_babe_seal().is_none()) + } + + #[test] + #[should_panic] + fn bad_seal_rejected() { + drop(env_logger::try_init()); + let bad_seal = generic::DigestItem::::Consensus(BABE_ENGINE_ID, Signature([0; 64]).encode()); + bad_seal.as_babe_seal().expect("we should not decode this successfully"); + } + + #[test] + fn can_author_block() { + drop(env_logger::try_init()); + let randomness = &[]; + let pair = sr25519::Pair::generate(); + let mut i = 0; + loop { + match claim_slot(randomness, i, &[], 0, &[pair.public()], &pair, u64::MAX / 10) { + None => i += 1, + Some(s) => { + debug!(target: "babe", "Authored block {:?}", s); + break + } + } + } + } + + #[test] + fn authorities_call_works() { + drop(env_logger::try_init()); + let client = test_client::new(); + + assert_eq!(client.info().unwrap().chain.best_number, 0); + assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ + Keyring::Alice.into(), + Keyring::Bob.into(), + Keyring::Charlie.into() + ]); + } + + #[test] + fn check_header_works_with_equivocation() { + let client = test_client::new(); + let pair = sr25519::Pair::generate(); + let public = pair.public(); + let authorities = vec![public.clone(), sr25519::Pair::generate().public()]; + + let (header1, header1_hash) = create_header(2, 1, &pair); + let (header2, header2_hash) = create_header(2, 2, &pair); + let (header3, header3_hash) = create_header(4, 2, &pair); + let (header4, header4_hash) = create_header(MAX_SLOT_CAPACITY + 4, 3, &pair); + let (header5, header5_hash) = create_header(MAX_SLOT_CAPACITY + 4, 4, &pair); + let (header6, header6_hash) = create_header(4, 3, &pair); + + let c = Arc::new(client); + let max = u64::MAX; + + type B = RawBlock>; + type P = sr25519::Pair; + + // It's ok to sign same headers. + assert!(check_header::(&c, 2, header1.clone(), header1_hash, &authorities, max).is_ok()); + assert!(check_header::(&c, 3, header1, header1_hash, &authorities, max).is_ok()); + + // But not two different headers at the same slot. + assert!(check_header::(&c, 4, header2, header2_hash, &authorities, max).is_err()); + + // Different slot is ok. + assert!(check_header::(&c, 5, header3, header3_hash, &authorities, max).is_ok()); + + // Here we trigger pruning and save header 4. + assert!(check_header::(&c, PRUNING_BOUND + 2, header4, header4_hash, &authorities, max).is_ok()); + + // This fails because header 5 is an equivocation of header 4. + assert!(check_header::(&c, PRUNING_BOUND + 3, header5, header5_hash, &authorities, max).is_err()); + + // This is ok because we pruned the corresponding header. Shows that we are pruning. + assert!(check_header::(&c, PRUNING_BOUND + 4, header6, header6_hash, &authorities, max).is_ok()); + } +} diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index eb0061a133b36eb635f1497452c705b4d86b61b0..5e55d555ddaa03a22674fd8f1028461ae81b3649 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -1,22 +1,27 @@ [package] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Common utilities for substrate consensus" edition = "2018" [dependencies] +derive_more = "0.14.0" crossbeam-channel = "0.3.4" -libp2p = { version = "0.6.0", default-features = false } +libp2p = { version = "0.8.1", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } -error-chain = "0.12" futures = "0.1" +rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } -tokio = "0.1.7" +tokio-timer = "0.2" parity-codec = { version = "3.3", features = ["derive"] } [dev-dependencies] test_client = { package = "substrate-test-client", path = "../../test-client" } + +[features] +default = [] +test-helpers = [] diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 7debe1acfec7fd89d76e3026cbaf1f8979f76f49..1a6a8d1f5078dbdc99f267399a7bff259b28bc72 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -22,6 +22,8 @@ use std::borrow::Cow; use std::collections::HashMap; use crate::well_known_cache_keys; +use crate::import_queue::Verifier; + /// Block import result. #[derive(Debug, PartialEq, Eq)] pub enum ImportResult { @@ -44,6 +46,8 @@ pub struct ImportedAux { pub needs_justification: bool, /// Received a bad justification. pub bad_justification: bool, + /// Request a finality proof for the given block. + pub needs_finality_proof: bool, } impl Default for ImportedAux { @@ -52,6 +56,7 @@ impl Default for ImportedAux { clear_justification_requests: false, needs_justification: false, bad_justification: false, + needs_finality_proof: false, } } } @@ -202,3 +207,26 @@ pub trait JustificationImport { justification: Justification, ) -> Result<(), Self::Error>; } + +/// Finality proof import trait. +pub trait FinalityProofImport { + type Error: ::std::error::Error + Send + 'static; + + /// Called by the import queue when it is started. + fn on_start(&self, _link: &crate::import_queue::Link) { } + + /// Import a Block justification and finalize the given block. Returns finalized block or error. + fn import_finality_proof( + &self, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &Verifier, + ) -> Result<(B::Hash, NumberFor), Self::Error>; +} + +/// Finality proof request builder. +pub trait FinalityProofRequestBuilder: Send { + /// Build data blob, associated with the request. + fn build_request_data(&self, hash: &B::Hash) -> Vec; +} diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index 0f1914087bf8c979441dc907a2694fc80138e305..a923c5f555ff91f7833d786ee581dc67b5f77de2 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -16,94 +16,69 @@ //! Error types in Consensus use runtime_version::RuntimeVersion; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; use primitives::ed25519::{Public, Signature}; +use std::error; + +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Missing state at block with given descriptor. + #[display(fmt="State unavailable at block {}", _0)] + StateUnavailable(String), + /// I/O terminated unexpectedly + #[display(fmt="I/O terminated unexpectedly.")] + IoTerminated, + /// Unable to schedule wakeup. + #[display(fmt="Timer error: {}", _0)] + FaultyTimer(tokio_timer::Error), + /// Error while working with inherent data. + #[display(fmt="InherentData error: {}", _0)] + InherentData(String), + /// Unable to propose a block. + #[display(fmt="Unable to create block proposal.")] + CannotPropose, + /// Error checking signature + #[display(fmt="Message signature {:?} by {:?} is invalid.", _0, _1)] + InvalidSignature(Signature, Public), + /// Invalid authorities set received from the runtime. + #[display(fmt="Current state of blockchain has invalid authorities set")] + InvalidAuthoritiesSet, + /// Account is not an authority. + #[display(fmt="Message sender {:?} is not a valid authority.", _0)] + InvalidAuthority(Public), + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring for current \ + runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain)] + IncompatibleAuthoringRuntime { native: RuntimeVersion, on_chain: RuntimeVersion }, + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring for current runtime is not supported since it has no version.")] + RuntimeVersionMissing, + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring in current build is not supported since it has no runtime.")] + NativeRuntimeMissing, + /// Justification requirements not met. + #[display(fmt="Invalid justification.")] + InvalidJustification, + /// Some other error. + #[display(fmt="Other error: {}", _0)] + Other(Box), + /// Error from the client while importing + #[display(fmt="Import failed: {}", _0)] + ClientImport(String), + /// Error from the client while importing + #[display(fmt="Chain lookup failed: {}", _0)] + ChainLookup(String), +} -error_chain! { - errors { - /// Missing state at block with given descriptor. - StateUnavailable(b: String) { - description("State missing at given block."), - display("State unavailable at block {}", b), - } - - /// I/O terminated unexpectedly - IoTerminated { - description("I/O terminated unexpectedly."), - display("I/O terminated unexpectedly."), - } - - /// Unable to schedule wakeup. - FaultyTimer(e: ::tokio::timer::Error) { - description("Timer error"), - display("Timer error: {}", e), - } - - /// Error while working with inherent data. - InherentData(e: String) { - description("InherentData error"), - display("InherentData error: {}", e), - } - - /// Unable to propose a block. - CannotPropose { - description("Unable to create block proposal."), - display("Unable to create block proposal."), - } - - /// Error checking signature - InvalidSignature(s: Signature, a: Public) { - description("Message signature is invalid"), - display("Message signature {:?} by {:?} is invalid.", s, a), - } - - /// Invalid authorities set received from the runtime. - InvalidAuthoritiesSet { - description("authorities set is invalid"), - display("Current state of blockchain has invalid authorities set"), - } - - /// Account is not an authority. - InvalidAuthority(a: Public) { - description("Message sender is not a valid authority"), - display("Message sender {:?} is not a valid authority.", a), - } - - /// Authoring interface does not match the runtime. - IncompatibleAuthoringRuntime(native: RuntimeVersion, on_chain: RuntimeVersion) { - description("Authoring for current runtime is not supported"), - display("Authoring for current runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain), - } - - /// Authoring interface does not match the runtime. - RuntimeVersionMissing { - description("Current runtime has no version"), - display("Authoring for current runtime is not supported since it has no version."), - } - - /// Authoring interface does not match the runtime. - NativeRuntimeMissing { - description("This build has no native runtime"), - display("Authoring in current build is not supported since it has no runtime."), - } - - /// Justification requirements not met. - InvalidJustification { - description("Invalid justification"), - display("Invalid justification."), - } - - /// Some other error. - Other(e: Box<::std::error::Error + Send>) { - description("Other error") - display("Other error: {}", e.description()) - } - - /// Error from the client while importing - ClientImport(reason: String) { - description("Import failed"), - display("Import failed: {}", reason), +impl error::Error for Error { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + match self { + Error::FaultyTimer(ref err) => Some(err), + Error::Other(ref err) => Some(&**err), + _ => None, } } } diff --git a/core/consensus/common/src/evaluation.rs b/core/consensus/common/src/evaluation.rs index 48016b1e94c93f0b55e8806d8e28cdcc79e6a6bc..ed7515a419194c1cc8ea651a903d89650f03373e 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -19,36 +19,37 @@ use super::MAX_BLOCK_SIZE; use parity_codec::Encode; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As}; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind, bail}; - -type BlockNumber = u64; - -error_chain! { - errors { - BadProposalFormat { - description("Proposal provided not a block."), - display("Proposal provided not a block."), - } - WrongParentHash(expected: String, got: String) { - description("Proposal had wrong parent hash."), - display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), - } - WrongNumber(expected: BlockNumber, got: BlockNumber) { - description("Proposal had wrong number."), - display("Proposal had wrong number. Expected {}, got {}", expected, got), - } - ProposalTooLarge(size: usize) { - description("Proposal exceeded the maximum size."), - display( - "Proposal exceeded the maximum size of {} by {} bytes.", - MAX_BLOCK_SIZE, size.saturating_sub(MAX_BLOCK_SIZE) - ), - } - } +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; + +// This is just a best effort to encode the number. None indicated that it's too big to encode +// in a u128. +type BlockNumber = Option; + +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display)] +pub enum Error { + /// Proposal provided not a block. + #[display(fmt="Proposal provided not a block.")] + BadProposalFormat, + /// Proposal had wrong parent hash. + #[display(fmt="Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got)] + WrongParentHash { expected: String, got: String }, + /// Proposal had wrong number. + #[display(fmt="Proposal had wrong number. Expected {:?}, got {:?}", expected, got)] + WrongNumber { expected: BlockNumber, got: BlockNumber }, + /// Proposal exceeded the maximum size. + #[display( + fmt="Proposal exceeded the maximum size of {} by {} bytes.", + "MAX_BLOCK_SIZE", "_0.saturating_sub(MAX_BLOCK_SIZE)" + )] + ProposalTooLarge(usize), } +impl std::error::Error for Error {} + /// Attempt to evaluate a substrate block as a node block, returning error /// upon any initial validity checks failing. pub fn evaluate_initial( @@ -59,21 +60,24 @@ pub fn evaluate_initial( let encoded = Encode::encode(proposal); let proposal = Block::decode(&mut &encoded[..]) - .ok_or_else(|| ErrorKind::BadProposalFormat)?; + .ok_or_else(|| Error::BadProposalFormat)?; if encoded.len() > MAX_BLOCK_SIZE { - bail!(ErrorKind::ProposalTooLarge(encoded.len())) + return Err(Error::ProposalTooLarge(encoded.len())) } if *parent_hash != *proposal.header().parent_hash() { - bail!(ErrorKind::WrongParentHash( - format!("{:?}", *parent_hash), - format!("{:?}", proposal.header().parent_hash()) - )); + return Err(Error::WrongParentHash { + expected: format!("{:?}", *parent_hash), + got: format!("{:?}", proposal.header().parent_hash()) + }); } - if parent_number.as_() + 1 != proposal.header().number().as_() { - bail!(ErrorKind::WrongNumber(parent_number.as_() + 1, proposal.header().number().as_())); + if parent_number + One::one() != *proposal.header().number() { + return Err(Error::WrongNumber { + expected: parent_number.checked_into::().map(|x| x + 1), + got: (*proposal.header().number()).checked_into::(), + }); } Ok(()) diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index 7a418ae9f444986911db44b5e5b04d57a91827e0..4d64d799b18b73f0f8a009cb1b3aa15f222163b8 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -17,15 +17,17 @@ //! Import Queue primitive: something which can verify and import blocks. //! //! This serves as an intermediate and abstracted step between synchronization -//! and import. Each mode of consensus will have its own requirements for block verification. -//! Some algorithms can verify in parallel, while others only sequentially. +//! and import. Each mode of consensus will have its own requirements for block +//! verification. Some algorithms can verify in parallel, while others only +//! sequentially. //! -//! The `ImportQueue` trait allows such verification strategies to be instantiated. -//! The `BasicQueue` and `BasicVerifier` traits allow serial queues to be -//! instantiated simply. +//! The `ImportQueue` trait allows such verification strategies to be +//! instantiated. The `BasicQueue` and `BasicVerifier` traits allow serial +//! queues to be instantiated simply. use crate::block_import::{ BlockImport, BlockOrigin, ImportBlock, ImportedAux, ImportResult, JustificationImport, + FinalityProofImport, FinalityProofRequestBuilder, }; use crossbeam_channel::{self as channel, Receiver, Sender}; use parity_codec::Encode; @@ -41,12 +43,27 @@ use runtime_primitives::Justification; use crate::error::Error as ConsensusError; use parity_codec::alloc::collections::hash_map::HashMap; +/// Reputation change for peers which send us a block with an incomplete header. +const INCOMPLETE_HEADER_REPUTATION_CHANGE: i32 = -(1 << 20); +/// Reputation change for peers which send us a block which we fail to verify. +const VERIFICATION_FAIL_REPUTATION_CHANGE: i32 = -(1 << 20); +/// Reputation change for peers which send us a bad block. +const BAD_BLOCK_REPUTATION_CHANGE: i32 = -(1 << 29); +/// Reputation change for peers which send us a block with bad justifications. +const BAD_JUSTIFICATION_REPUTATION_CHANGE: i32 = -(1 << 16); + /// Shared block import struct used by the queue. pub type SharedBlockImport = Arc + Send + Sync>; /// Shared justification import struct used by the queue. pub type SharedJustificationImport = Arc + Send + Sync>; +/// Shared finality proof import struct used by the queue. +pub type SharedFinalityProofImport = Arc + Send + Sync>; + +/// Shared finality proof request builder struct used by the queue. +pub type SharedFinalityProofRequestBuilder = Arc + Send + Sync>; + /// Maps to the Origin used by the network. pub type Origin = libp2p::PeerId; @@ -66,7 +83,7 @@ pub struct IncomingBlock { } /// Verify a justification of a block -pub trait Verifier: Send + Sync + Sized { +pub trait Verifier: Send + Sync { /// Verify the given data and return the ImportBlock and an optional /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. @@ -94,6 +111,8 @@ pub trait ImportQueue: Send + Sync + ImportQueueClone { fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>); /// Import a block justification. fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification); + /// Import block finality proof. + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec); } pub trait ImportQueueClone { @@ -106,8 +125,8 @@ impl Clone for Box> { } } -/// Interface to a basic block import queue that is importing blocks sequentially in a separate thread, -/// with pluggable verification. +/// Interface to a basic block import queue that is importing blocks +/// sequentially in a separate thread, with pluggable verification. #[derive(Clone)] pub struct BasicQueue { sender: Sender>, @@ -119,36 +138,67 @@ impl ImportQueueClone for BasicQueue { } } + /// "BasicQueue" is a wrapper around a channel sender to the "BlockImporter". -/// "BasicQueue" itself does not keep any state or do any importing work, and can therefore be send to other threads. +/// "BasicQueue" itself does not keep any state or do any importing work, and +/// can therefore be send to other threads. /// -/// "BasicQueue" implements "ImportQueue" by sending messages to the "BlockImporter", which runs in it's own thread. +/// "BasicQueue" implements "ImportQueue" by sending messages to the +/// "BlockImporter", which runs in it's own thread. /// -/// The "BlockImporter" is responsible for handling incoming requests from the "BasicQueue", -/// some of these requests are handled by the "BlockImporter" itself, such as "is_importing" or "status", -/// and justifications are also imported by the "BlockImporter". +/// The "BlockImporter" is responsible for handling incoming requests from the +/// "BasicQueue". Some of these requests are handled by the "BlockImporter" +/// itself, such as "is_importing", "status", and justifications. /// -/// The "import block" work will be offloaded to a single "BlockImportWorker", running in another thread. -/// Offloading the work is done via a channel, -/// ensuring blocks in this implementation are imported sequentially and in order(as received by the "BlockImporter") +/// The "import block" work will be offloaded to a single "BlockImportWorker", +/// running in another thread. Offloading the work is done via a channel, +/// ensuring blocks in this implementation are imported sequentially and in +/// order (as received by the "BlockImporter"). /// -/// As long as the "BasicQueue" is not dropped, the "BlockImporter" will keep running. -/// The "BlockImporter" owns a sender to the "BlockImportWorker", ensuring that the worker is kept alive until that sender is dropped. +/// As long as the "BasicQueue" is not dropped, the "BlockImporter" will keep +/// running. The "BlockImporter" owns a sender to the "BlockImportWorker", +/// ensuring that the worker is kept alive until that sender is dropped. impl BasicQueue { /// Instantiate a new basic queue, with given verifier. pub fn new>( verifier: Arc, block_import: SharedBlockImport, - justification_import: Option> + justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, ) -> Self { let (result_sender, result_port) = channel::unbounded(); - let worker_sender = BlockImportWorker::new(result_sender, verifier, block_import); - let importer_sender = BlockImporter::new(result_port, worker_sender, justification_import); + let worker_sender = BlockImportWorker::new( + result_sender, + verifier.clone(), + block_import, + finality_proof_import.clone(), + ); + let importer_sender = BlockImporter::new( + result_port, + worker_sender, + verifier, + justification_import, + finality_proof_import, + finality_proof_request_builder, + ); Self { sender: importer_sender, } } + + /// Send synchronization request to the block import channel. + /// + /// The caller should wait for Link::synchronized() call to ensure that it + /// has synchronized with ImportQueue. + #[cfg(any(test, feature = "test-helpers"))] + pub fn synchronize(&self) { + self + .sender + .send(BlockImportMsg::Synchronize) + .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + } } impl ImportQueue for BasicQueue { @@ -184,23 +234,38 @@ impl ImportQueue for BasicQueue { .send(BlockImportMsg::ImportJustification(who.clone(), hash, number, justification)) .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); } + + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + let _ = self + .sender + .send(BlockImportMsg::ImportFinalityProof(who, hash, number, finality_proof)) + .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + } } pub enum BlockImportMsg { ImportBlocks(BlockOrigin, Vec>), ImportJustification(Origin, B::Hash, NumberFor, Justification), + ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), Start(Box>, Sender>), Stop, + #[cfg(any(test, feature = "test-helpers"))] + Synchronize, } +#[cfg_attr(test, derive(Debug, PartialEq))] pub enum BlockImportWorkerMsg { ImportBlocks(BlockOrigin, Vec>), - Imported( + ImportedBlocks( Vec<( Result>, BlockImportError>, B::Hash, )>, ), + ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), + ImportedFinalityProof(Origin, (B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>), + #[cfg(any(test, feature = "test-helpers"))] + Synchronize, } enum ImportMsgType { @@ -213,15 +278,22 @@ struct BlockImporter { result_port: Receiver>, worker_sender: Sender>, link: Option>>, + verifier: Arc>, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, } impl BlockImporter { fn new( result_port: Receiver>, worker_sender: Sender>, + verifier: Arc>, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, ) -> Sender> { + trace!(target: "block_import", "Creating new Block Importer!"); let (sender, port) = channel::bounded(4); let _ = thread::Builder::new() .name("ImportQueue".into()) @@ -231,7 +303,10 @@ impl BlockImporter { result_port, worker_sender, link: None, + verifier, justification_import, + finality_proof_import, + finality_proof_request_builder, }; while importer.run() { // Importing until all senders have been dropped... @@ -242,6 +317,7 @@ impl BlockImporter { } fn run(&mut self) -> bool { + trace!(target: "import_queue", "Running import queue"); let msg = select! { recv(self.port) -> msg => { match msg { @@ -271,22 +347,58 @@ impl BlockImporter { BlockImportMsg::ImportJustification(who, hash, number, justification) => { self.handle_import_justification(who, hash, number, justification) }, + BlockImportMsg::ImportFinalityProof(who, hash, number, finality_proof) => { + self.handle_import_finality_proof(who, hash, number, finality_proof) + }, BlockImportMsg::Start(link, sender) => { + if let Some(finality_proof_request_builder) = self.finality_proof_request_builder.take() { + link.set_finality_proof_request_builder(finality_proof_request_builder); + } if let Some(justification_import) = self.justification_import.as_ref() { justification_import.on_start(&*link); } + if let Some(finality_proof_import) = self.finality_proof_import.as_ref() { + finality_proof_import.on_start(&*link); + } self.link = Some(link); let _ = sender.send(Ok(())); }, BlockImportMsg::Stop => return false, + #[cfg(any(test, feature = "test-helpers"))] + BlockImportMsg::Synchronize => { + trace!(target: "sync", "Received synchronization message"); + self.worker_sender + .send(BlockImportWorkerMsg::Synchronize) + .expect("1. This is holding a sender to the worker, 2. the worker should not quit while a sender is still held; qed"); + }, } true } fn handle_worker_msg(&mut self, msg: BlockImportWorkerMsg) -> bool { + let link = match self.link.as_ref() { + Some(link) => link, + None => { + trace!(target: "sync", "Received import result while import-queue has no link"); + return true; + }, + }; + let results = match msg { - BlockImportWorkerMsg::Imported(results) => (results), - _ => unreachable!("Import Worker does not send ImportBlocks message; qed"), + BlockImportWorkerMsg::ImportedBlocks(results) => (results), + BlockImportWorkerMsg::ImportedFinalityProof(who, request_block, finalization_result) => { + link.finality_proof_imported(who, request_block, finalization_result); + return true; + }, + #[cfg(any(test, feature = "test-helpers"))] + BlockImportWorkerMsg::Synchronize => { + trace!(target: "sync", "Synchronizing link"); + link.synchronized(); + return true; + }, + BlockImportWorkerMsg::ImportBlocks(_, _) + | BlockImportWorkerMsg::ImportFinalityProof(_, _, _, _) + => unreachable!("Import Worker does not send Import* message; qed"), }; let mut has_error = false; let mut hashes = vec![]; @@ -301,14 +413,6 @@ impl BlockImporter { has_error = true; } - let link = match self.link.as_ref() { - Some(link) => link, - None => { - trace!(target: "sync", "Received import result for {} while import-queue has no link", hash); - return true; - }, - }; - match result { Ok(BlockImportResult::ImportedKnown(number)) => link.block_imported(&hash, number), Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => { @@ -326,23 +430,35 @@ impl BlockImporter { if aux.bad_justification { if let Some(peer) = who { - link.useless_peer(peer, "Sent block with bad justification to import"); + info!("Sent block with bad justification to import"); + link.report_peer(peer, BAD_JUSTIFICATION_REPUTATION_CHANGE); } } + + if aux.needs_finality_proof { + trace!(target: "sync", "Block imported but requires finality proof {}: {:?}", number, hash); + link.request_finality_proof(&hash, number); + } }, Err(BlockImportError::IncompleteHeader(who)) => { if let Some(peer) = who { - link.note_useless_and_restart_sync(peer, "Sent block with incomplete header to import"); + info!("Peer sent block with incomplete header to import"); + link.report_peer(peer, INCOMPLETE_HEADER_REPUTATION_CHANGE); + link.restart(); } }, Err(BlockImportError::VerificationFailed(who, e)) => { if let Some(peer) = who { - link.note_useless_and_restart_sync(peer, &format!("Verification failed: {}", e)); + info!("Verification failed from peer: {}", e); + link.report_peer(peer, VERIFICATION_FAIL_REPUTATION_CHANGE); + link.restart(); } }, Err(BlockImportError::BadBlock(who)) => { if let Some(peer) = who { - link.note_useless_and_restart_sync(peer, "Sent us a bad block"); + info!("Bad block"); + link.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE); + link.restart(); } }, Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => { @@ -370,6 +486,13 @@ impl BlockImporter { } } + fn handle_import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + trace!(target: "sync", "Scheduling finality proof of {}/{} for import", number, hash); + self.worker_sender + .send(BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof)) + .expect("1. This is holding a sender to the worker, 2. the worker should not quit while a sender is still held; qed"); + } + fn handle_import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { trace!(target: "sync", "Scheduling {} blocks for import", blocks.len()); self.worker_sender @@ -381,6 +504,7 @@ impl BlockImporter { struct BlockImportWorker> { result_sender: Sender>, block_import: SharedBlockImport, + finality_proof_import: Option>, verifier: Arc, } @@ -389,6 +513,7 @@ impl> BlockImportWorker { result_sender: Sender>, verifier: Arc, block_import: SharedBlockImport, + finality_proof_import: Option>, ) -> Sender> { let (sender, port) = channel::bounded(4); let _ = thread::Builder::new() @@ -398,14 +523,25 @@ impl> BlockImportWorker { result_sender, verifier, block_import, + finality_proof_import, }; for msg in port.iter() { // Working until all senders have been dropped... match msg { BlockImportWorkerMsg::ImportBlocks(origin, blocks) => { - worker.import_a_batch_of_blocks(origin, blocks) - } - _ => unreachable!("Import Worker does not receive the Imported message; qed"), + worker.import_a_batch_of_blocks(origin, blocks); + }, + BlockImportWorkerMsg::ImportFinalityProof(who, hash, number, proof) => { + worker.import_finality_proof(who, hash, number, proof); + }, + #[cfg(any(test, feature = "test-helpers"))] + BlockImportWorkerMsg::Synchronize => { + trace!(target: "sync", "Sending sync message"); + let _ = worker.result_sender.send(BlockImportWorkerMsg::Synchronize); + }, + BlockImportWorkerMsg::ImportedBlocks(_) + | BlockImportWorkerMsg::ImportedFinalityProof(_, _, _) + => unreachable!("Import Worker does not receive the Imported* messages; qed"), } } }) @@ -455,10 +591,31 @@ impl> BlockImportWorker { let _ = self .result_sender - .send(BlockImportWorkerMsg::Imported(results)); + .send(BlockImportWorkerMsg::ImportedBlocks(results)); trace!(target: "sync", "Imported {} of {}", imported, count); } + + fn import_finality_proof(&self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + let result = self.finality_proof_import.as_ref().map(|finality_proof_import| { + finality_proof_import.import_finality_proof(hash, number, finality_proof, &*self.verifier) + .map_err(|e| { + debug!( + "Finality proof import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", + e, + hash, + number, + who, + ); + }) + }).unwrap_or(Err(())); + + let _ = self + .result_sender + .send(BlockImportWorkerMsg::ImportedFinalityProof(who, (hash, number), result)); + + trace!(target: "sync", "Imported finality proof for {}/{}", number, hash); + } } /// Hooks that the verification queue can use to influence the synchronization @@ -474,12 +631,28 @@ pub trait Link: Send { fn clear_justification_requests(&self) {} /// Request a justification for the given block. fn request_justification(&self, _hash: &B::Hash, _number: NumberFor) {} - /// Disconnect from peer. - fn useless_peer(&self, _who: Origin, _reason: &str) {} - /// Disconnect from peer and restart sync. - fn note_useless_and_restart_sync(&self, _who: Origin, _reason: &str) {} + /// Finality proof import result. + /// + /// Even though we have asked for finality proof of block A, provider could return proof of + /// some earlier block B, if the proof for A was too large. The sync module should continue + /// asking for proof of A in this case. + fn finality_proof_imported( + &self, + _who: Origin, + _request_block: (B::Hash, NumberFor), + _finalization_result: Result<(B::Hash, NumberFor), ()>, + ) {} + /// Request a finality proof for the given block. + fn request_finality_proof(&self, _hash: &B::Hash, _number: NumberFor) {} + /// Remember finality proof request builder on start. + fn set_finality_proof_request_builder(&self, _request_builder: SharedFinalityProofRequestBuilder) {} + /// Adjusts the reputation of the given peer. + fn report_peer(&self, _who: Origin, _reputation_change: i32) {} /// Restart sync. fn restart(&self) {} + /// Synchronization request has been processed. + #[cfg(any(test, feature = "test-helpers"))] + fn synchronized(&self) {} } /// Block import successful result. @@ -555,7 +728,7 @@ pub fn import_single_block>( match import_error(import_handle.check_block(hash, parent))? { BlockImportResult::ImportedUnknown { .. } => (), - r @ _ => return Ok(r), // Any other successfull result means that the block is already imported. + r => return Ok(r), // Any other successful result means that the block is already imported. } let (import_block, new_authorities) = verifier.verify(block_origin, header, justification, block.body) @@ -579,12 +752,14 @@ pub fn import_single_block>( #[cfg(test)] mod tests { use super::*; + use crate::block_import::ForkChoiceStrategy; use libp2p::PeerId; use test_client::runtime::{Block, Hash}; #[derive(Debug, PartialEq)] enum LinkMsg { BlockImported, + FinalityProofImported, Disconnected, Restarted, } @@ -606,24 +781,49 @@ mod tests { fn block_imported(&self, _hash: &Hash, _number: NumberFor) { let _ = self.sender.send(LinkMsg::BlockImported); } - fn useless_peer(&self, _: Origin, _: &str) { - let _ = self.sender.send(LinkMsg::Disconnected); + fn finality_proof_imported( + &self, + _: Origin, + _: (Hash, NumberFor), + _: Result<(Hash, NumberFor), ()>, + ) { + let _ = self.sender.send(LinkMsg::FinalityProofImported); } - fn note_useless_and_restart_sync(&self, id: Origin, r: &str) { - self.useless_peer(id, r); - self.restart(); + fn report_peer(&self, _: Origin, _: i32) { + let _ = self.sender.send(LinkMsg::Disconnected); } fn restart(&self) { let _ = self.sender.send(LinkMsg::Restarted); } } + impl Verifier for () { + fn verify( + &self, + origin: BlockOrigin, + header: B::Header, + justification: Option, + body: Option>, + ) -> Result<(ImportBlock, Option>>), String> { + Ok((ImportBlock { + origin, + header, + body, + finalized: false, + justification, + post_digests: vec![], + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }, None)) + } + } + #[test] fn process_import_result_works() { let (result_sender, result_port) = channel::unbounded(); let (worker_sender, _) = channel::unbounded(); let (link_sender, link_port) = channel::unbounded(); - let importer_sender = BlockImporter::::new(result_port, worker_sender, None); + let importer_sender = BlockImporter::::new(result_port, worker_sender, Arc::new(()), None, None, None); let link = TestLink::new(link_sender); let (ack_sender, start_ack_port) = channel::bounded(4); let _ = importer_sender.send(BlockImportMsg::Start(Box::new(link.clone()), ack_sender)); @@ -633,52 +833,101 @@ mod tests { // Send a known let results = vec![(Ok(BlockImportResult::ImportedKnown(Default::default())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); // Send a second known let results = vec![(Ok(BlockImportResult::ImportedKnown(Default::default())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); // Send an unknown let results = vec![(Ok(BlockImportResult::ImportedUnknown(Default::default(), Default::default(), None)), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); // Send an unknown with peer and bad justification let peer_id = PeerId::random(); let results = vec![(Ok(BlockImportResult::ImportedUnknown(Default::default(), - ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: true }, + ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: true, + needs_finality_proof: false, + }, Some(peer_id.clone()))), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); // Send an incomplete header let results = vec![(Err(BlockImportError::IncompleteHeader(Some(peer_id.clone()))), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Send an unknown parent let results = vec![(Err(BlockImportError::UnknownParent), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Send a verification failed let results = vec![(Err(BlockImportError::VerificationFailed(Some(peer_id.clone()), String::new())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Send an error let results = vec![(Err(BlockImportError::Error), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); + let _ = result_sender.send(BlockImportWorkerMsg::ImportedBlocks(results)).ok().unwrap(); assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); // Drop the importer sender first, ensuring graceful shutdown. drop(importer_sender); } + + #[test] + fn process_finality_proof_import_result_works() { + let (result_sender, result_port) = channel::unbounded(); + let (worker_sender, worker_receiver) = channel::unbounded(); + let (link_sender, link_port) = channel::unbounded(); + let importer_sender = BlockImporter::::new(result_port, worker_sender, Arc::new(()), None, None, None); + let link = TestLink::new(link_sender); + let (ack_sender, start_ack_port) = channel::bounded(4); + let _ = importer_sender.send(BlockImportMsg::Start(Box::new(link.clone()), ack_sender)); + let who = Origin::random(); + + // Ensure the importer handles Start before any result messages. + start_ack_port.recv().unwrap().unwrap(); + + // Send finality proof import request to BlockImporter + importer_sender.send(BlockImportMsg::ImportFinalityProof( + who.clone(), + Default::default(), + 1, + vec![42], + )).unwrap(); + + // Wait until this request is redirected to the BlockImportWorker + assert_eq!(worker_receiver.recv(), Ok(BlockImportWorkerMsg::ImportFinalityProof( + who.clone(), + Default::default(), + 1, + vec![42], + ))); + + // Send ack of proof import from BlockImportWorker to BlockImporter + result_sender.send(BlockImportWorkerMsg::ImportedFinalityProof( + who.clone(), + (Default::default(), 0), + Ok((Default::default(), 0)), + )).unwrap(); + + // Wait for finality proof import result + assert_eq!(link_port.recv(), Ok(LinkMsg::FinalityProofImported)); + + // Drop the importer sender first, ensuring graceful shutdown. + drop(importer_sender); + } } diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index 134a34454edf1f57a348afa949b16a67ede7d5ba..d28864a0ccfba2ba0c4a0dd7e8ce0751dddc0dcf 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -40,16 +40,19 @@ pub use inherents::InherentData; pub mod offline_tracker; pub mod error; mod block_import; +mod select_chain; pub mod import_queue; pub mod evaluation; // block size limit. const MAX_BLOCK_SIZE: usize = 4 * 1024 * 1024 + 512; -pub use self::error::{Error, ErrorKind}; +pub use self::error::Error; pub use block_import::{ - BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, JustificationImport, + BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, + JustificationImport, FinalityProofImport, FinalityProofRequestBuilder, }; +pub use select_chain::SelectChain; /// Trait for getting the authorities at a given block. pub trait Authorities { @@ -118,6 +121,20 @@ impl SyncOracle for Arc { } } +/// Extra verification for blocks. +pub trait ExtraVerification: Send + Sync { + /// Future that resolves when the block is verified, or fails with error if + /// not. + type Verified: IntoFuture; + + /// Do additional verification for this block. + fn verify( + &self, + header: &B::Header, + body: Option<&[B::Extrinsic]>, + ) -> Self::Verified; +} + /// A list of all well known keys in the cache. pub mod well_known_cache_keys { /// The type representing cache keys. diff --git a/core/consensus/common/src/select_chain.rs b/core/consensus/common/src/select_chain.rs new file mode 100644 index 0000000000000000000000000000000000000000..47c65d1fe78e530837648160c8d8ba30fd03300e --- /dev/null +++ b/core/consensus/common/src/select_chain.rs @@ -0,0 +1,54 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate Consensus Common. + +// Substrate Demo 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 Consensus Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Consensus Common. If not, see . + +use crate::error::Error; +use runtime_primitives::traits::{Block as BlockT, NumberFor}; + + +/// The SelectChain trait defines the strategy upon which the head is chosen +/// if multiple forks are present for an opaque definition of "best" in the +/// specific chain build. +/// +/// The Strategy can be customised for the two use cases of authoring new blocks +/// upon the best chain or which fork to finalise. Unless implemented differently +/// by default finalisation methods fall back to use authoring, so as a minimum +/// `_authoring`-functions must be implemented. +/// +/// Any particular user must make explicit, however, whether they intend to finalise +/// or author through the using the right function call, as these might differ in +/// some implementations. +/// +/// Non-deterministicly finalising chains may only use the `_authoring` functions. +pub trait SelectChain: Sync + Send + Clone { + + /// Get all leaves of the chain: block hashes that have no children currently. + /// Leaves that can never be finalized will not be returned. + fn leaves(&self) -> Result::Hash>, Error>; + + /// Among those `leaves` deterministically pick one chain as the generally + /// best chain to author new blocks upon and probably finalize. + fn best_chain(&self) -> Result<::Header, Error>; + + /// Get the best ancestor of `target_hash` that we should attempt + /// to finalize next. + fn finality_target( + &self, + target_hash: ::Hash, + _maybe_max_number: Option> + ) -> Result::Hash>, Error> { + Ok(Some(target_hash)) + } +} \ No newline at end of file diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 354a608d22a979e363ab58601f67bd1371d69e0d..3f0a79a863985ae373a8bc81847e9a4191d0c3e8 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -1,11 +1,12 @@ [package] name = "substrate-consensus-rhd" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Rhododendron Round-Based consensus-algorithm for substrate" edition = "2018" [dependencies] +derive_more = "0.14.0" futures = "0.1.17" codec = { package = "parity-codec", version = "3.2", features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../primitives" } @@ -20,7 +21,6 @@ runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } tokio = "0.1.7" parking_lot = "0.7.1" -error-chain = "0.12" log = "0.4" rhododendron = { version = "0.5.0", features = ["codec"] } exit-future = "0.1" diff --git a/core/consensus/rhd/src/error.rs b/core/consensus/rhd/src/error.rs index 38081109754555b73c02c48f2c51bb1404425cf7..601cf1c963a586d883de92527818c2721fb644f5 100644 --- a/core/consensus/rhd/src/error.rs +++ b/core/consensus/rhd/src/error.rs @@ -15,45 +15,36 @@ // along with Substrate. If not, see . //! Error types in the rhododendron Consensus service. -use consensus::error::{Error as CommonError, ErrorKind as CommonErrorKind}; +use consensus::error::{Error as CommonError}; use primitives::AuthorityId; use client; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; -error_chain! { - links { - Client(client::error::Error, client::error::ErrorKind); - Common(CommonError, CommonErrorKind); - } - errors { - NotValidator(id: AuthorityId) { - description("Local account ID not a validator at this block."), - display("Local account ID ({:?}) not a validator at this block.", id), - } - PrematureDestruction { - description("Proposer destroyed before finishing proposing or evaluating"), - display("Proposer destroyed before finishing proposing or evaluating"), - } - Timer(e: ::tokio::timer::Error) { - description("Failed to register or resolve async timer."), - display("Timer failed: {}", e), - } - Executor(e: ::futures::future::ExecuteErrorKind) { - description("Unable to dispatch agreement future"), - display("Unable to dispatch agreement future: {:?}", e), - } - } +/// A result alias. +pub type Result = std::result::Result; + +/// A RHD error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Consensus error. + Common(CommonError), + /// Local account ID not a validator at this block. + #[display(fmt="Local account ID ({:?}) not a validator at this block.", _0)] + NotValidator(AuthorityId), + /// Proposer destroyed before finishing proposing or evaluating + #[display(fmt="Proposer destroyed before finishing proposing or evaluating")] + PrematureDestruction, + /// Failed to register or resolve async timer. + #[display(fmt="Timer failed: {}", _0)] + Timer(tokio::timer::Error), + /// Unable to dispatch agreement future + #[display(fmt="Unable to dispatch agreement future: {:?}", _0)] + Executor(futures::future::ExecuteErrorKind), } impl From<::rhododendron::InputStreamConcluded> for Error { fn from(_: ::rhododendron::InputStreamConcluded) -> Self { - CommonErrorKind::IoTerminated.into() - } -} - -impl From for Error { - fn from(e: CommonErrorKind) -> Self { - CommonError::from(e).into() + CommonError::IoTerminated.into() } } diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index cbdf95d987578ff5a574d6cdbaefe4bcbd7c199b..ca4b9120eb58bb6709f86ed3b92615d899ea98f0 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -45,7 +45,10 @@ use client::{Client as SubstrateClient, CallExecutor}; use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, OldTxQueue, BlockBuilderError}; use runtime_primitives::generic::{BlockId, Era, ImportResult, ImportBlock, BlockOrigin}; use runtime_primitives::traits::{Block, Header}; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, As, BlockNumberToHash}; +use runtime_primitives::traits::{ + Block as BlockT, Hash as HashT, Header as HeaderT, + BlockNumberToHash, SaturatedConversion +}; use runtime_primitives::Justification; use primitives::{AuthorityId, ed25519, Blake2Hasher, ed25519::LocalizedSignature}; use srml_system::Trait as SystemT; @@ -613,7 +616,7 @@ impl BftService .map_or(true, |x| self.can_build_on_inner(header, x)) } - /// Get a reference to the underyling client. + /// Get a reference to the underlying client. pub fn client(&self) -> &I { &*self.client } fn can_build_on_inner(&self, header: &B::Header, live: &(B::Header, AgreementHandle)) -> bool { @@ -1246,7 +1249,7 @@ impl LocalProposer<::Block> for Proposer where for (target, misbehavior) in misbehavior { let report = MisbehaviorReport { parent_hash: self.parent_hash.into(), - parent_number: self.parent_number.as_(), + parent_number: self.parent_number.saturated_into::(), target, misbehavior: match misbehavior { GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, diff --git a/core/consensus/rhd/src/service.rs b/core/consensus/rhd/src/service.rs index e2858f767a8c08d3977803a68ce6bab46188cb60..f59393c530356dad7564e3247f8ed065c45d367c 100644 --- a/core/consensus/rhd/src/service.rs +++ b/core/consensus/rhd/src/service.rs @@ -22,7 +22,7 @@ use std::thread; use std::time::{Duration, Instant}; use std::sync::Arc; -use client::{BlockchainEvents, ChainHead, BlockBody}; +use client::{BlockchainEvents, BlockBody}; use futures::prelude::*; use transaction_pool::txpool::{Pool as TransactionPool, ChainApi as PoolChainApi}; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, BlockNumberToHash}; @@ -33,7 +33,7 @@ use tokio::runtime::current_thread::Runtime as LocalRuntime; use tokio::timer::Interval; use parking_lot::RwLock; -use consensus::offline_tracker::OfflineTracker; +use consensus::{self, offline_tracker::OfflineTracker}; use super::{Network, ProposerFactory, AuthoringApi}; use {consensus, primitives, ed25519, error, BftService, LocalProposer}; @@ -87,9 +87,9 @@ impl Service { A: AuthoringApi + BlockNumberToHash + 'static, P: PoolChainApi::Block> + 'static, C: BlockchainEvents<::Block> - + ChainHead<::Block> - + BlockBody<::Block>, - C: consensus::BlockImport<::Block> + + BlockBody<::Block> + + consensus::SelectChain<::Block> + + consensus::BlockImport<::Block> + consensus::Authorities<::Block> + Send + Sync + 'static, primitives::H256: From<<::Block as BlockT>::Hash>, <::Block as BlockT>::Hash: PartialEq + PartialEq, diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ee3571bcdcfe86a98f8403343909f301da03e919 --- /dev/null +++ b/core/consensus/slots/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "substrate-consensus-slots" +version = "2.0.0" +authors = ["Parity Technologies "] +description = "Generic slots-based utilities for consensus" +edition = "2018" + +[dependencies] +codec = { package = "parity-codec", version = "3.2" } +client = { package = "substrate-client", path = "../../client" } +primitives = { package = "substrate-primitives", path = "../../primitives" } +runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +consensus_common = { package = "substrate-consensus-common", path = "../common" } +inherents = { package = "substrate-inherents", path = "../../inherents" } +futures = "0.1.17" +tokio = "0.1.7" +parking_lot = "0.7.1" +log = "0.4" diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs new file mode 100644 index 0000000000000000000000000000000000000000..44f4ca59839ed27eb6493c73a2acad96bba5eae7 --- /dev/null +++ b/core/consensus/slots/src/aux_schema.rs @@ -0,0 +1,151 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Schema for slots in the aux-db. + +use std::sync::Arc; +use codec::{Encode, Decode}; +use client::backend::AuxStore; +use client::error::{Result as ClientResult, Error as ClientError}; +use runtime_primitives::traits::Header; + +const SLOT_HEADER_MAP_KEY: &[u8] = b"slot_header_map"; +const SLOT_HEADER_START: &[u8] = b"slot_header_start"; + +/// We keep at least this number of slots in database. +pub const MAX_SLOT_CAPACITY: u64 = 1000; +/// We prune slots when they reach this number. +pub const PRUNING_BOUND: u64 = 2 * MAX_SLOT_CAPACITY; + +fn load_decode(backend: Arc, key: &[u8]) -> ClientResult> + where + C: AuxStore, + T: Decode, +{ + match backend.get_aux(key)? { + None => Ok(None), + Some(t) => T::decode(&mut &t[..]) + .ok_or_else( + || ClientError::Backend(format!("Slots DB is corrupted.")).into(), + ) + .map(Some) + } +} + +/// Represents an equivocation proof. +#[derive(Debug, Clone)] +pub struct EquivocationProof { + slot: u64, + fst_header: H, + snd_header: H, +} + +impl EquivocationProof { + /// Get the slot number where the equivocation happened. + pub fn slot(&self) -> u64 { + self.slot + } + + /// Get the first header involved in the equivocation. + pub fn fst_header(&self) -> &H { + &self.fst_header + } + + /// Get the second header involved in the equivocation. + pub fn snd_header(&self) -> &H { + &self.snd_header + } +} + +/// Checks if the header is an equivocation and returns the proof in that case. +/// +/// Note: it detects equivocations only when slot_now - slot <= MAX_SLOT_CAPACITY. +pub fn check_equivocation( + backend: &Arc, + slot_now: u64, + slot: u64, + header: H, + signer: P, +) -> ClientResult>> + where + H: Header, + C: AuxStore, + P: Encode + Decode + PartialEq, +{ + // We don't check equivocations for old headers out of our capacity. + if slot_now - slot > MAX_SLOT_CAPACITY { + return Ok(None) + } + + // Key for this slot. + let mut curr_slot_key = SLOT_HEADER_MAP_KEY.to_vec(); + slot.using_encoded(|s| curr_slot_key.extend(s)); + + // Get headers of this slot. + let mut headers_with_sig = load_decode::<_, Vec<(H, P)>>(backend.clone(), &curr_slot_key[..])? + .unwrap_or_else(Vec::new); + + // Get first slot saved. + let slot_header_start = SLOT_HEADER_START.to_vec(); + let first_saved_slot = load_decode::<_, u64>(backend.clone(), &slot_header_start[..])? + .unwrap_or(slot); + + for (prev_header, prev_signer) in headers_with_sig.iter() { + // A proof of equivocation consists of two headers: + // 1) signed by the same voter, + if *prev_signer == signer { + // 2) with different hash + if header.hash() != prev_header.hash() { + return Ok(Some(EquivocationProof { + slot, // 3) and mentioning the same slot. + fst_header: prev_header.clone(), + snd_header: header.clone(), + })); + } else { + // We don't need to continue in case of duplicated header, + // since it's already saved and a possible equivocation + // would have been detected before. + return Ok(None) + } + } + } + + let mut keys_to_delete = vec![]; + let mut new_first_saved_slot = first_saved_slot; + + if slot_now - first_saved_slot >= PRUNING_BOUND { + let prefix = SLOT_HEADER_MAP_KEY.to_vec(); + new_first_saved_slot = slot_now.saturating_sub(MAX_SLOT_CAPACITY); + + for s in first_saved_slot..new_first_saved_slot { + let mut p = prefix.clone(); + s.using_encoded(|s| p.extend(s)); + keys_to_delete.push(p); + } + } + + headers_with_sig.push((header, signer)); + + backend.insert_aux( + &[ + (&curr_slot_key[..], headers_with_sig.encode().as_slice()), + (&slot_header_start[..], new_first_saved_slot.encode().as_slice()), + ], + &keys_to_delete.iter().map(|k| &k[..]).collect::>()[..], + )?; + + Ok(None) +} diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..783cb018b9e93c4cd8e2bdae59045bc8ad2a0d94 --- /dev/null +++ b/core/consensus/slots/src/lib.rs @@ -0,0 +1,305 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Slots functionality for Substrate. +//! +//! Some consensus algorithms have a concept of *slots*, which are intervals in +//! time during which certain events can and/or must occur. This crate +//! provides generic functionality for slots. + +#![forbid(warnings, unsafe_code, missing_docs)] + +mod slots; +mod aux_schema; + +pub use slots::{slot_now, SlotInfo, Slots}; +pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; + +use codec::{Decode, Encode}; +use consensus_common::{SyncOracle, SelectChain}; +use futures::prelude::*; +use futures::{ + future::{self, Either}, + Future, IntoFuture, +}; +use inherents::{InherentData, InherentDataProviders}; +use log::{debug, error, info, warn}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{ApiRef, Block, ProvideRuntimeApi}; +use std::fmt::Debug; +use std::ops::Deref; +use std::sync::{mpsc, Arc}; +use std::thread; + +/// A worker that should be invoked at every new slot. +pub trait SlotWorker { + /// The type of the future that will be returned when a new slot is + /// triggered. + type OnSlot: IntoFuture; + + /// Called when the proposer starts. + fn on_start(&self, slot_duration: u64) -> Result<(), consensus_common::Error>; + + /// Called when a new slot is triggered. + fn on_slot(&self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; +} + +/// Slot compatible inherent data. +pub trait SlotCompatible { + /// Extract timestamp and slot from inherent data. + fn extract_timestamp_and_slot( + inherent: &InherentData, + ) -> Result<(u64, u64), consensus_common::Error>; +} + +/// Start a new slot worker in a separate thread. +#[deprecated(since = "1.1", note = "Please spawn a thread manually")] +pub fn start_slot_worker_thread( + slot_duration: SlotDuration, + select_chain: C, + worker: Arc, + sync_oracle: SO, + on_exit: OnExit, + inherent_data_providers: InherentDataProviders, +) -> Result<(), consensus_common::Error> +where + B: Block + 'static, + C: SelectChain + Clone + 'static, + W: SlotWorker + Send + Sync + 'static, + SO: SyncOracle + Send + Clone + 'static, + SC: SlotCompatible + 'static, + OnExit: Future + Send + 'static, + T: SlotData + Send + Clone + 'static, +{ + use tokio::runtime::current_thread::Runtime; + + let (result_sender, result_recv) = mpsc::channel(); + + thread::spawn(move || { + let mut runtime = match Runtime::new() { + Ok(r) => r, + Err(e) => { + warn!(target: "slots", "Unable to start authorship: {:?}", e); + return; + } + }; + + let slot_worker_future = match start_slot_worker::<_, _, _, T, _, SC, _>( + slot_duration.clone(), + select_chain, + worker, + sync_oracle, + on_exit, + inherent_data_providers, + ) { + Ok(slot_worker_future) => { + result_sender + .send(Ok(())) + .expect("Receive is not dropped before receiving a result; qed"); + slot_worker_future + } + Err(e) => { + result_sender + .send(Err(e)) + .expect("Receive is not dropped before receiving a result; qed"); + return; + } + }; + + let _ = runtime.block_on(slot_worker_future); + }); + + result_recv + .recv() + .expect("Slots start thread result sender dropped") +} + +/// Start a new slot worker. +pub fn start_slot_worker( + slot_duration: SlotDuration, + client: C, + worker: Arc, + sync_oracle: SO, + on_exit: OnExit, + inherent_data_providers: InherentDataProviders, +) -> Result, consensus_common::Error> +where + B: Block, + C: SelectChain + Clone, + W: SlotWorker, + SO: SyncOracle + Send + Clone, + SC: SlotCompatible, + OnExit: Future, + T: SlotData + Clone, +{ + worker.on_start(slot_duration.slot_duration())?; + + let make_authorship = move || { + let client = client.clone(); + let worker = worker.clone(); + let sync_oracle = sync_oracle.clone(); + let SlotDuration(slot_duration) = slot_duration.clone(); + let inherent_data_providers = inherent_data_providers.clone(); + + // rather than use a timer interval, we schedule our waits ourselves + Slots::::new(slot_duration.slot_duration(), inherent_data_providers) + .map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) + .for_each(move |slot_info| { + let client = client.clone(); + let worker = worker.clone(); + let sync_oracle = sync_oracle.clone(); + + // only propose when we are not syncing. + if sync_oracle.is_major_syncing() { + debug!(target: "slots", "Skipping proposal slot due to sync."); + return Either::B(future::ok(())); + } + + let slot_num = slot_info.number; + let chain_head = match client.best_chain() { + Ok(x) => x, + Err(e) => { + warn!(target: "slots", "Unable to author block in slot {}. \ + no best block header: {:?}", slot_num, e); + return Either::B(future::ok(())); + } + }; + + Either::A(worker.on_slot(chain_head, slot_info).into_future().map_err( + |e| warn!(target: "slots", "Encountered consensus error: {:?}", e), + )) + }) + }; + + let work = future::loop_fn((), move |()| { + let authorship_task = ::std::panic::AssertUnwindSafe(make_authorship()); + authorship_task.catch_unwind().then(|res| { + match res { + Ok(Ok(())) => (), + Ok(Err(())) => warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), + Err(e) => { + if let Some(s) = e.downcast_ref::<&'static str>() { + warn!(target: "slots", "Authorship task panicked at {:?}", s); + } + + warn!(target: "slots", "Restarting authorship task"); + } + } + + Ok(future::Loop::Continue(())) + }) + }); + + Ok(work.select(on_exit).then(|_| Ok(()))) +} + +/// A header which has been checked +pub enum CheckedHeader { + /// A header which has slot in the future. this is the full header (not stripped) + /// and the slot in which it should be processed. + Deferred(H, u64), + /// A header which is fully checked, including signature. This is the pre-header + /// accompanied by the seal components. + /// + /// Includes the digest item that encoded the seal. + Checked(H, S), +} + +/// A type from which a slot duration can be obtained. +pub trait SlotData { + /// Gets the slot duration. + fn slot_duration(&self) -> u64; + + /// The static slot key + const SLOT_KEY: &'static [u8]; +} + +impl SlotData for u64 { + fn slot_duration(&self) -> u64 { + *self + } + + const SLOT_KEY: &'static [u8] = b"aura_slot_duration"; +} + +/// A slot duration. Create with `get_or_compute`. +// The internal member should stay private here. +#[derive(Clone, Copy, Debug, Encode, Decode, Hash, PartialOrd, Ord, PartialEq, Eq)] +pub struct SlotDuration(T); + +impl Deref for SlotDuration { + type Target = T; + fn deref(&self) -> &T { + &self.0 + } +} + +impl SlotData for SlotDuration { + /// Get the slot duration in milliseconds. + fn slot_duration(&self) -> u64 + where T: SlotData, + { + self.0.slot_duration() + } + + const SLOT_KEY: &'static [u8] = T::SLOT_KEY; +} + +impl SlotDuration { + /// Either fetch the slot duration from disk or compute it from the + /// genesis state. + /// + /// `slot_key` is marked as `'static`, as it should really be a + /// compile-time constant. + pub fn get_or_compute(client: &C, cb: CB) -> ::client::error::Result where + C: client::backend::AuxStore, + C: ProvideRuntimeApi, + CB: FnOnce(ApiRef, &BlockId) -> ::client::error::Result, + T: SlotData + Encode + Decode + Debug, + { + match client.get_aux(T::SLOT_KEY)? { + Some(v) => ::decode(&mut &v[..]) + .map(SlotDuration) + .ok_or_else(|| { + ::client::error::Error::Backend({ + error!(target: "slots", "slot duration kept in invalid format"); + format!("slot duration kept in invalid format") + }) + .into() + }), + None => { + use runtime_primitives::traits::Zero; + let genesis_slot_duration = + cb(client.runtime_api(), &BlockId::number(Zero::zero()))?; + + info!( + "Loaded block-time = {:?} seconds from genesis on first-launch", + genesis_slot_duration + ); + + genesis_slot_duration + .using_encoded(|s| client.insert_aux(&[(T::SLOT_KEY, &s[..])], &[]))?; + + Ok(SlotDuration(genesis_slot_duration)) + } + } + } + + /// Returns slot data value. + pub fn get(&self) -> T { + self.0.clone() + } +} diff --git a/core/consensus/aura/slots/src/slots.rs b/core/consensus/slots/src/slots.rs similarity index 78% rename from core/consensus/aura/slots/src/slots.rs rename to core/consensus/slots/src/slots.rs index 9b665ce0d25d6fa7f89384178cdedc96059365b2..964eeaff29cc599fb45fee23980581564be96469 100644 --- a/core/consensus/aura/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -18,24 +18,34 @@ //! //! This is used instead of `tokio_timer::Interval` because it was unreliable. -use std::time::{Instant, Duration}; -use std::marker::PhantomData; -use tokio::timer::Delay; +use super::SlotCompatible; +use consensus_common::Error; use futures::prelude::*; use futures::try_ready; +use inherents::{InherentData, InherentDataProviders}; use log::warn; -use inherents::{InherentDataProviders, InherentData}; -use consensus_common::{Error, ErrorKind}; -use crate::SlotCompatible; +use std::marker::PhantomData; +use std::time::{Duration, Instant}; +use tokio::timer::Delay; /// Returns current duration since unix epoch. pub fn duration_now() -> Option { use std::time::SystemTime; let now = SystemTime::now(); - now.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| { - warn!("Current time {:?} is before unix epoch. Something is wrong: {:?}", now, e); - }).ok() + now.duration_since(SystemTime::UNIX_EPOCH) + .map_err(|e| { + warn!( + "Current time {:?} is before unix epoch. Something is wrong: {:?}", + now, e + ); + }) + .ok() +} + +/// Get the slot for now. +pub fn slot_now(slot_duration: u64) -> Option { + duration_now().map(|s| s.as_secs() / slot_duration) } /// Returns the duration until the next slot, based on current duration since @@ -113,34 +123,35 @@ impl Stream for Slots { }; if let Some(ref mut inner_delay) = self.inner_delay { - try_ready!(inner_delay.poll().map_err(|e| Error::from(ErrorKind::FaultyTimer(e)))); + try_ready!(inner_delay + .poll() + .map_err(Error::FaultyTimer)); } // timeout has fired. - let inherent_data = self.inherent_data_providers.create_inherent_data() - .map_err(crate::inherent_to_common_error)?; + let inherent_data = self + .inherent_data_providers + .create_inherent_data() + .map_err(|s| consensus_common::Error::InherentData(s.into_owned()))?; let (timestamp, slot_num) = SC::extract_timestamp_and_slot(&inherent_data)?; // reschedule delay for next slot. - let ends_at = Instant::now() + time_until_next(Duration::from_secs(timestamp), slot_duration); + let ends_at = + Instant::now() + time_until_next(Duration::from_secs(timestamp), slot_duration); self.inner_delay = Some(Delay::new(ends_at)); // never yield the same slot twice. if slot_num > self.last_slot { self.last_slot = slot_num; - Ok( - Async::Ready( - Some(SlotInfo { - number: slot_num, - duration: self.slot_duration, - timestamp, - ends_at, - inherent_data, - }) - ) - ) + Ok(Async::Ready(Some(SlotInfo { + number: slot_num, + duration: self.slot_duration, + timestamp, + ends_at, + inherent_data, + }))) } else { // re-poll until we get a new slot. self.poll() diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index baa4e3546d536e00e9390853e5a0047cd2917433..8f39d35c79e696e4a7141edcc9e070ce9e90437a 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" parity-codec = "3.3" runtime_io = { package = "sr-io", path = "../sr-io" } primitives = { package = "substrate-primitives", path = "../primitives" } @@ -14,8 +14,6 @@ serializer = { package = "substrate-serializer", path = "../serializer" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } runtime_version = { package = "sr-version", path = "../sr-version" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } -serde = "1.0" -serde_derive = "1.0" wasmi = { version = "0.4.3" } byteorder = "1.1" lazy_static = "1.0" @@ -27,7 +25,7 @@ tiny-keccak = "1.4.2" [dev-dependencies] assert_matches = "1.1" wabt = "~0.7.4" -hex-literal = "0.1.0" +hex-literal = "0.2.0" [features] default = [] diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs index b27ccf01bf4cef520c3e22d0d9ce8923f7456f5c..fdcb6cbc0e30786f1d271c4651858fe3eff05315 100644 --- a/core/executor/src/error.rs +++ b/core/executor/src/error.rs @@ -16,72 +16,57 @@ //! Rust executor possible errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use state_machine; use serializer; use wasmi; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind -}; - -error_chain! { - foreign_links { - InvalidData(serializer::Error) #[doc = "Unserializable Data"]; - Trap(wasmi::Trap) #[doc = "Trap occured during execution"]; - Wasmi(wasmi::Error) #[doc = "Wasmi loading/instantiating error"]; - } - - errors { - /// Method is not found - MethodNotFound(t: String) { - description("method not found"), - display("Method not found: '{}'", t), - } - - /// Code is invalid (expected single byte) - InvalidCode(c: Vec) { - description("invalid code"), - display("Invalid Code: {:?}", c), - } - - /// Could not get runtime version. - VersionInvalid { - description("Runtime version error"), - display("On-chain runtime does not specify version"), - } - /// Externalities have failed. - Externalities { - description("externalities failure"), - display("Externalities error"), - } - - /// Invalid index. - InvalidIndex { - description("index given was not in range"), - display("Invalid index provided"), - } - - /// Invalid return type. - InvalidReturn { - description("u64 was not returned"), - display("Invalid type returned (should be u64)"), - } - - /// Runtime failed. - Runtime { - description("runtime failure"), - display("Runtime error"), - } +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Unserializable Data + InvalidData(serializer::Error), + /// Trap occured during execution + Trap(wasmi::Trap), + /// Wasmi loading/instantiating error + Wasmi(wasmi::Error), + /// Error in the API. Parameter is an error message. + ApiError(String), + /// Method is not found + #[display(fmt="Method not found: '{}'", _0)] + MethodNotFound(String), + /// Code is invalid (expected single byte) + #[display(fmt="Invalid Code: {:?}", _0)] + InvalidCode(Vec), + /// Could not get runtime version. + #[display(fmt="On-chain runtime does not specify version")] + VersionInvalid, + /// Externalities have failed. + #[display(fmt="Externalities error")] + Externalities, + /// Invalid index. + #[display(fmt="Invalid index provided")] + InvalidIndex, + /// Invalid return type. + #[display(fmt="Invalid type returned (should be u64)")] + InvalidReturn, + /// Runtime failed. + #[display(fmt="Runtime error")] + Runtime, + /// Runtime failed. + #[display(fmt="Invalid memory reference")] + InvalidMemoryReference, +} - /// Runtime failed. - InvalidMemoryReference { - description("invalid memory reference"), - display("Invalid memory reference"), +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::InvalidData(ref err) => Some(err), + Error::Trap(ref err) => Some(err), + Error::Wasmi(ref err) => Some(err), + _ => None, } } } diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index 586073c0d2369285f905908cb001424e526d10f2..0a6f50d0017a5304d33e74e5ddc27a895ea4a571 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use std::{borrow::BorrowMut, result, cell::{RefMut, RefCell}}; -use crate::error::{Error, ErrorKind, Result}; +use crate::error::{Error, Result}; use state_machine::{CodeExecutor, Externalities}; use crate::wasm_executor::WasmExecutor; use wasmi::{Module as WasmModule, ModuleRef as WasmModuleInstanceRef}; @@ -53,11 +53,11 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( ext: &mut E, default_heap_pages: Option, ) -> Result<(&'a WasmModuleInstanceRef, &'a Option)> { - let code_hash = match ext.original_storage_hash(well_known_keys::CODE) { Some(code_hash) => code_hash, - None => return Err(ErrorKind::InvalidCode(vec![]).into()), + None => return Err(Error::InvalidCode(vec![])), }; + let maybe_runtime_preproc = cache.borrow_mut().entry(code_hash.into()) .or_insert_with(|| { let code = match ext.original_storage(well_known_keys::CODE) { @@ -69,7 +69,7 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( .or(default_heap_pages) .unwrap_or(DEFAULT_HEAP_PAGES); match WasmModule::from_buffer(code) - .map_err(|_| ErrorKind::InvalidCode(vec![]).into()) + .map_err(|_| Error::InvalidCode(vec![])) .and_then(|module| wasm_executor.prepare_module(ext, heap_pages as usize, &module)) { Ok(module) => { @@ -84,10 +84,11 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( } } }); + match maybe_runtime_preproc { RuntimePreproc::InvalidCode => { let code = ext.original_storage(well_known_keys::CODE).unwrap_or(vec![]); - Err(ErrorKind::InvalidCode(code).into()) + Err(Error::InvalidCode(code)) }, RuntimePreproc::ValidCode(m, v) => { Ok((m, v)) @@ -100,7 +101,7 @@ fn safe_call(f: F) -> Result { // Substrate uses custom panic hook that terminates process on panic. Disable termination for the native call. let _guard = panic_handler::AbortGuard::new(false); - ::std::panic::catch_unwind(f).map_err(|_| ErrorKind::Runtime.into()) + ::std::panic::catch_unwind(f).map_err(|_| Error::Runtime) } /// Set up the externalities and safe calling environment to execute calls to a native runtime. @@ -247,7 +248,7 @@ impl CodeExecutor for NativeExecutor, method: &str, data: &[u8]) -> $crate::error::Result> { $crate::with_native_environment(ext, move || $dispatcher(method, data))? - .ok_or_else(|| $crate::error::ErrorKind::MethodNotFound(method.to_owned()).into()) + .ok_or_else(|| $crate::error::Error::MethodNotFound(method.to_owned())) } fn native_version() -> $crate::NativeVersion { diff --git a/core/executor/src/sandbox.rs b/core/executor/src/sandbox.rs index cc21d762bec11fd13645a5a971640e5ddedd155b..24c8ad66ea375ec8d9a8139ab41d14e2d6aba90b 100644 --- a/core/executor/src/sandbox.rs +++ b/core/executor/src/sandbox.rs @@ -643,9 +643,8 @@ mod tests { let res = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_exhaust_heap", &code); assert_eq!(res.is_err(), true); if let Err(err) = res { - let inner_err = err.iter().next().unwrap(); assert_eq!( - format!("{}", inner_err), + format!("{}", err), format!("{}", wasmi::Error::Trap(trap(allocator::OUT_OF_SPACE))) ); } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 42af29e9bae033b3210f987403fcde2cf6d51ffe..988b6ddcf3b8ba207f78dc9388a6f31e494e991a 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -25,10 +25,10 @@ use wasmi::{ }; use wasmi::RuntimeValue::{I32, I64, self}; use wasmi::memory_units::{Pages}; -use state_machine::Externalities; -use crate::error::{Error, ErrorKind, Result}; +use state_machine::{Externalities, ChildStorageKey}; +use crate::error::{Error, Result}; use crate::wasm_utils::UserError; -use primitives::{blake2_256, twox_128, twox_256, ed25519, sr25519, Pair}; +use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; use primitives::hexdisplay::HexDisplay; use primitives::sandbox as sandbox_primitives; use primitives::{H256, Blake2Hasher}; @@ -174,6 +174,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, HexDisplay::from(&key) ); } + let storage_key = ChildStorageKey::from_vec(storage_key) + .ok_or_else(|| + UserError("ext_set_child_storage: child storage key is invalid") + )?; this.ext.set_child_storage(storage_key, key, value); Ok(()) }, @@ -189,8 +193,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) } else { format!(" {}", ::primitives::hexdisplay::ascii_format(&key)) - }, HexDisplay::from(&key)); - this.ext.clear_child_storage(&storage_key, &key); + }, HexDisplay::from(&key) + ); + let storage_key = ChildStorageKey::from_vec(storage_key) + .ok_or_else(|| + UserError("ext_clear_child_storage: child storage key is not valid") + )?; + this.ext.clear_child_storage(storage_key, &key); Ok(()) }, ext_clear_storage(key_data: *const u8, key_len: u32) => { @@ -214,7 +223,11 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, storage_key_len as usize ).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_exists_child_storage"))?; let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_exists_child_storage"))?; - Ok(if this.ext.exists_child_storage(&storage_key, &key) { 1 } else { 0 }) + let storage_key = ChildStorageKey::from_vec(storage_key) + .ok_or_else(|| + UserError("ext_exists_child_storage: child storage key is not valid") + )?; + Ok(if this.ext.exists_child_storage(storage_key, &key) { 1 } else { 0 }) }, ext_clear_prefix(prefix_data: *const u8, prefix_len: u32) => { let prefix = this.memory.get(prefix_data, prefix_len as usize).map_err(|_| UserError("Invalid attempt to determine prefix in ext_clear_prefix"))?; @@ -226,7 +239,11 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, storage_key_data, storage_key_len as usize ).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_kill_child_storage"))?; - this.ext.kill_child_storage(&storage_key); + let storage_key = ChildStorageKey::from_vec(storage_key) + .ok_or_else(|| + UserError("ext_exists_child_storage: child storage key is not valid") + )?; + this.ext.kill_child_storage(storage_key); Ok(()) }, // return 0 and place u32::max_value() into written_out if no value exists for the key. @@ -273,7 +290,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, key_data, key_len as usize ).map_err(|_| UserError("Invalid attempt to determine key in ext_get_allocated_child_storage"))?; - let maybe_value = this.ext.child_storage(&storage_key, &key); + + let maybe_value = { + let storage_key = ChildStorageKey::from_slice(&storage_key) + .ok_or_else(|| + UserError("ext_get_allocated_child_storage: child storage key is not valid") + )?; + this.ext.child_storage(storage_key, &key) + }; debug_trace!(target: "wasm-trace", "*** Getting child storage: {} -> {} == {} [k={}]", ::primitives::hexdisplay::ascii_format(&storage_key), @@ -339,7 +363,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, key_data, key_len as usize ).map_err(|_| UserError("Invalid attempt to get key in ext_get_child_storage_into"))?; - let maybe_value = this.ext.child_storage(&storage_key, &key); + + let maybe_value = { + let storage_key = ChildStorageKey::from_slice(&*storage_key) + .ok_or_else(|| + UserError("ext_get_child_storage_into: child storage key is not valid") + )?; + this.ext.child_storage(storage_key, &key) + }; debug_trace!(target: "wasm-trace", "*** Getting storage: {} -> {} == {} [k={}]", ::primitives::hexdisplay::ascii_format(&storage_key), if let Some(_preimage) = this.hash_lookup.get(&key) { @@ -371,18 +402,17 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8 => { let storage_key = this.memory.get(storage_key_data, storage_key_len as usize).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_child_storage_root"))?; - let r = this.ext.child_storage_root(&storage_key); - if let Some(value) = r { - let offset = this.heap.allocate(value.len() as u32)? as u32; - this.memory.set(offset, &value).map_err(|_| UserError("Invalid attempt to set memory in ext_child_storage_root"))?; - this.memory.write_primitive(written_out, value.len() as u32) - .map_err(|_| UserError("Invalid attempt to write written_out in ext_child_storage_root"))?; - Ok(offset) - } else { - this.memory.write_primitive(written_out, u32::max_value()) - .map_err(|_| UserError("Invalid attempt to write failed written_out in ext_child_storage_root"))?; - Ok(0) - } + let storage_key = ChildStorageKey::from_slice(&*storage_key) + .ok_or_else(|| + UserError("ext_child_storage_root: child storage key is not valid") + )?; + let value = this.ext.child_storage_root(storage_key); + + let offset = this.heap.allocate(value.len() as u32)? as u32; + this.memory.set(offset, &value).map_err(|_| UserError("Invalid attempt to set memory in ext_child_storage_root"))?; + this.memory.write_primitive(written_out, value.len() as u32) + .map_err(|_| UserError("Invalid attempt to write written_out in ext_child_storage_root"))?; + Ok(offset) }, ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_number: u64, result: *mut u8) -> u32 => { let mut parent_hash = H256::default(); @@ -418,6 +448,30 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, ext_chain_id() -> u64 => { Ok(this.ext.chain_id()) }, + ext_twox_64(data: *const u8, len: u32, out: *mut u8) => { + let result: [u8; 8] = if len == 0 { + let hashed = twox_64(&[0u8; 0]); + debug_trace!(target: "xxhash", "XXhash: '' -> {}", HexDisplay::from(&hashed)); + this.hash_lookup.insert(hashed.to_vec(), vec![]); + hashed + } else { + let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_twox_64"))?; + let hashed_key = twox_64(&key); + debug_trace!(target: "xxhash", "XXhash: {} -> {}", + if let Ok(_skey) = ::std::str::from_utf8(&key) { + _skey + } else { + &format!("{}", HexDisplay::from(&key)) + }, + HexDisplay::from(&hashed_key) + ); + this.hash_lookup.insert(hashed_key.to_vec(), key); + hashed_key + }; + + this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_64"))?; + Ok(()) + }, ext_twox_128(data: *const u8, len: u32, out: *mut u8) => { let result: [u8; 16] = if len == 0 { let hashed = twox_128(&[0u8; 0]); @@ -451,6 +505,21 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_256"))?; Ok(()) }, + ext_blake2_128(data: *const u8, len: u32, out: *mut u8) => { + let result: [u8; 16] = if len == 0 { + let hashed = blake2_128(&[0u8; 0]); + this.hash_lookup.insert(hashed.to_vec(), vec![]); + hashed + } else { + let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_blake2_128"))?; + let hashed_key = blake2_128(&key); + this.hash_lookup.insert(hashed_key.to_vec(), key); + hashed_key + }; + + this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_blake2_128"))?; + Ok(()) + }, ext_blake2_256(data: *const u8, len: u32, out: *mut u8) => { let result: [u8; 32] = if len == 0 { blake2_256(&[0u8; 0]) @@ -700,9 +769,9 @@ impl WasmExecutor { fn get_mem_instance(module: &ModuleRef) -> Result { Ok(module .export_by_name("memory") - .ok_or_else(|| Error::from(ErrorKind::InvalidMemoryReference))? + .ok_or_else(|| Error::InvalidMemoryReference)? .as_memory() - .ok_or_else(|| Error::from(ErrorKind::InvalidMemoryReference))? + .ok_or_else(|| Error::InvalidMemoryReference)? .clone()) } @@ -726,7 +795,7 @@ impl WasmExecutor { if let Some(I64(r)) = res { let offset = r as u32; let length = (r as u64 >> 32) as usize; - memory.get(offset, length).map_err(|_| ErrorKind::Runtime.into()).map(Some) + memory.get(offset, length).map_err(|_| Error::Runtime).map(Some) } else { Ok(None) } @@ -759,7 +828,7 @@ impl WasmExecutor { let used_mem = memory.used_size(); let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; let parameters = create_parameters(&mut |data: &[u8]| { - let offset = fec.heap.allocate(data.len() as u32).map_err(|_| ErrorKind::Runtime)?; + let offset = fec.heap.allocate(data.len() as u32).map_err(|_| Error::Runtime)?; memory.set(offset, &data)?; Ok(offset) })?; @@ -772,7 +841,7 @@ impl WasmExecutor { let result = match result { Ok(val) => match filter_result(val, &memory)? { Some(val) => Ok(val), - None => Err(ErrorKind::InvalidReturn.into()), + None => Err(Error::InvalidReturn), }, Err(e) => { trace!(target: "wasm-executor", "Failed to execute code with {} pages", memory.current_size().0); @@ -808,7 +877,7 @@ impl WasmExecutor { // extract a reference to a linear memory, optional reference to a table // and then initialize FunctionExecutor. let memory = Self::get_mem_instance(intermediate_instance.not_started_instance())?; - memory.grow(Pages(heap_pages)).map_err(|_| Error::from(ErrorKind::Runtime))?; + memory.grow(Pages(heap_pages)).map_err(|_| Error::Runtime)?; let table: Option = intermediate_instance .not_started_instance() .export_by_name("__indirect_function_table") @@ -828,7 +897,7 @@ mod tests { use parity_codec::Encode; use state_machine::TestExternalities; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use primitives::map; #[test] @@ -910,6 +979,20 @@ mod tests { ); } + #[test] + fn blake2_128_should_work() { + let mut ext = TestExternalities::default(); + let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); + assert_eq!( + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_blake2_128", &[]).unwrap(), + blake2_128(&b""[..]).encode() + ); + assert_eq!( + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_blake2_128", b"Hello world!").unwrap(), + blake2_128(&b"Hello world!"[..]).encode() + ); + } + #[test] fn twox_256_should_work() { let mut ext = TestExternalities::default(); diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index dcde35579c34b9b7891a9683a2826200f69b4083..b65d8e08694a0021989a33d819649f0230ee844c 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -10,7 +10,7 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.6" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -44,7 +44,7 @@ name = "impl-codec" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -54,16 +54,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "parity-codec" -version = "3.3.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec-derive 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-codec-derive" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -108,11 +108,11 @@ dependencies = [ [[package]] name = "runtime-test" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-io 1.0.0", - "sr-sandbox 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-sandbox 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -148,28 +148,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -181,15 +181,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "sr-std 2.0.0", ] [[package]] @@ -215,7 +215,7 @@ name = "uint" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -227,15 +227,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781" +"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" "checksum hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07463834729d0ce8d475e7dd6d302e407093ad9a9c02d77eb07fb74b5373829d" "checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" -"checksum parity-codec 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0333b2a2973e75c3b4a9bc2a7b28dceacb56e3949907b4ce113ff3a53bcc6713" -"checksum parity-codec-derive 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be90eb3f1b4c02a478ccee3e0e64e5152692e7871c7258d2aa8e356359325aa7" +"checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" +"checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" "checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" "checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" "checksum proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" diff --git a/core/executor/wasm/Cargo.toml b/core/executor/wasm/Cargo.toml index be60dfa1c9401912295017fb00e4221b8fb7d196..e9f829746d49f0952c7da8d73e1f90bfbe17c516 100644 --- a/core/executor/wasm/Cargo.toml +++ b/core/executor/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "runtime-test" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/executor/wasm/src/lib.rs b/core/executor/wasm/src/lib.rs index dda9c617333a835e35169b6c1f1888e4018c9c91..193ff5c9c0d3cbe9d39122f28126c6b052de55a5 100644 --- a/core/executor/wasm/src/lib.rs +++ b/core/executor/wasm/src/lib.rs @@ -1,13 +1,12 @@ #![no_std] #![cfg_attr(feature = "strict", deny(warnings))] -#![feature(alloc)] extern crate alloc; use alloc::vec::Vec; use alloc::slice; use runtime_io::{ - set_storage, storage, clear_prefix, print, blake2_256, + set_storage, storage, clear_prefix, print, blake2_128, blake2_256, twox_128, twox_256, ed25519_verify, sr25519_verify, enumerated_trie_root }; @@ -68,6 +67,7 @@ impl_stubs!( input.to_vec() }, test_blake2_256 => |input| blake2_256(input).to_vec(), + test_blake2_128 => |input| blake2_128(input).to_vec(), test_twox_256 => |input| twox_256(input).to_vec(), test_twox_128 => |input| twox_128(input).to_vec(), test_ed25519_verify => |input: &[u8]| { @@ -91,7 +91,7 @@ impl_stubs!( [sr25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() }, test_enumerated_trie_root => |_| { - enumerated_trie_root::(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).to_vec() + enumerated_trie_root::(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).as_ref().to_vec() }, test_sandbox => |code: &[u8]| { let ok = execute_sandboxed(code, &[]).is_ok(); diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index 4dcf199e1ea406aece1578c354b2b48353ecde5b..9d44c8ee3eb051fee246c7f2381479c11d557bf6 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-finality-grandpa" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -16,15 +16,17 @@ runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } substrate-primitives = { path = "../primitives" } substrate-telemetry = { path = "../telemetry" } +serde_json = "1.0" client = { package = "substrate-client", path = "../client" } inherents = { package = "substrate-inherents", path = "../../core/inherents" } network = { package = "substrate-network", path = "../network" } service = { package = "substrate-service", path = "../service", optional = true } srml-finality-tracker = { path = "../../srml/finality-tracker" } fg_primitives = { package = "substrate-finality-grandpa-primitives", path = "primitives" } -grandpa = { package = "finality-grandpa", version = "0.7.1", features = ["derive-codec"] } +grandpa = { package = "finality-grandpa", version = "0.7.2", features = ["derive-codec"] } [dev-dependencies] +consensus_common = { package = "substrate-consensus-common", path = "../consensus/common", features = ["test-helpers"] } network = { package = "substrate-network", path = "../network", features = ["test-helpers"] } keyring = { package = "substrate-keyring", path = "../keyring" } test_client = { package = "substrate-test-client", path = "../test-client"} diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index 0f915b586527881b677c0c1f8911bb020c246c1e..e51ed754eb85fb46cd526ab6143dc929e4e36457 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-finality-grandpa-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index 7016a708bd62b8c0f1bc05726d193dd2dc986d1e..869b5e68fd6af5f744d4f9ed34ca77af7545f822 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -17,7 +17,6 @@ //! Primitives for GRANDPA integration, suitable for WASM compilation. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] #[cfg(not(feature = "std"))] extern crate alloc; diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 104284538c25b24cab2f88be60bf4c945dda1d2b..4dd6e75dd946f595a6e1d3a82bc28d9a67a42f4f 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -20,11 +20,12 @@ use std::fmt::Debug; use std::sync::Arc; use parity_codec::{Encode, Decode}; use client::backend::AuxStore; -use client::error::{Result as ClientResult, Error as ClientError, ErrorKind as ClientErrorKind}; +use client::error::{Result as ClientResult, Error as ClientError}; use fork_tree::ForkTree; use grandpa::round::State as RoundState; use runtime_primitives::traits::{Block as BlockT, NumberFor}; use log::{info, warn}; +use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, PendingChange, DelayKind}; use crate::consensus_changes::{SharedConsensusChanges, ConsensusChanges}; @@ -104,12 +105,12 @@ where H: Clone + Debug + PartialEq, } } -fn load_decode(backend: &B, key: &[u8]) -> ClientResult> { +pub(crate) fn load_decode(backend: &B, key: &[u8]) -> ClientResult> { match backend.get_aux(key)? { None => Ok(None), Some(t) => T::decode(&mut &t[..]) .ok_or_else( - || ClientErrorKind::Backend(format!("GRANDPA DB is corrupted.")).into(), + || ClientError::Backend(format!("GRANDPA DB is corrupted.")), ) .map(Some) } @@ -314,8 +315,8 @@ pub(crate) fn load_persistent( set_state: set_state.into(), }); } - }, - Some(other) => return Err(ClientErrorKind::Backend( + } + Some(other) => return Err(ClientError::Backend( format!("Unsupported GRANDPA DB version: {:?}", other) ).into()), } @@ -365,6 +366,17 @@ pub(crate) fn update_authority_set( let encoded_set = set.encode(); if let Some(new_set) = new_set { + telemetry!(CONSENSUS_INFO; "afg.authority_set"; + "hash" => ?new_set.canon_hash, + "number" => ?new_set.canon_number, + "authority_set_id" => ?new_set.set_id, + "authorities" => { + let authorities: Vec = + new_set.authorities.iter().map(|(id, _)| format!("{}", id)).collect(); + format!("{:?}", authorities) + } + ); + // we also overwrite the "last completed round" entry with a blank slate // because from the perspective of the finality gadget, the chain has // reset. diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index 720c083db7925ad94821b6b5909783ae8df51854..79f98e5bdb33adbd43660a93aecc55c9ccb8cf52 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -73,10 +73,12 @@ use network::{config::Roles, PeerId}; use parity_codec::{Encode, Decode}; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG}; -use log::{trace, debug}; +use log::{trace, debug, warn}; +use futures::prelude::*; +use futures::sync::mpsc; use crate::{CompactCommit, SignedMessage}; -use super::{Round, SetId, Network}; +use super::{cost, benefit, Round, SetId}; use std::collections::{HashMap, VecDeque}; use std::time::{Duration, Instant}; @@ -227,6 +229,12 @@ pub(super) enum GossipMessage { Neighbor(VersionedNeighborPacket>), } +impl From>> for GossipMessage { + fn from(neighbor: NeighborPacket>) -> Self { + GossipMessage::Neighbor(VersionedNeighborPacket::V1(neighbor)) + } +} + /// Network level message with topic information. #[derive(Debug, Encode, Decode)] pub(super) struct VoteOrPrecommitMessage { @@ -273,32 +281,12 @@ impl VersionedNeighborPacket { } } -// cost scalars for reporting peers. -mod cost { - pub(super) const PAST_REJECTION: i32 = -50; - pub(super) const BAD_SIGNATURE: i32 = -100; - pub(super) const MALFORMED_COMMIT: i32 = -1000; - pub(super) const FUTURE_MESSAGE: i32 = -500; - - pub(super) const INVALID_VIEW_CHANGE: i32 = -500; - pub(super) const PER_UNDECODABLE_BYTE: i32 = -5; - pub(super) const PER_SIGNATURE_CHECKED: i32 = -25; - pub(super) const PER_BLOCK_LOADED: i32 = -10; -} - -// benefit scalars for reporting peers. -mod benefit { - pub(super) const ROUND_MESSAGE: i32 = 100; - pub(super) const BASIC_VALIDATED_COMMIT: i32 = 100; - pub(super) const PER_EQUIVOCATION: i32 = 10; -} - /// Misbehavior that peers can perform. /// /// `cost` gives a cost that can be used to perform cost/benefit analysis of a /// peer. #[derive(Clone, Copy, Debug, PartialEq)] -enum Misbehavior { +pub(super) enum Misbehavior { // invalid neighbor message, considering the last one. InvalidViewChange, // could not decode neighbor message. bytes-length of the packet. @@ -315,7 +303,7 @@ enum Misbehavior { } impl Misbehavior { - fn cost(&self) -> i32 { + pub(super) fn cost(&self) -> i32 { use Misbehavior::*; match *self { @@ -402,9 +390,13 @@ impl Peers { Some(p) => p, }; - if peer.view.last_commit.as_ref() >= Some(&new_height) { + // this doesn't allow a peer to send us unlimited commits with the + // same height, because there is still a misbehavior condition based on + // sending commits that are <= the best we are aware of. + if peer.view.last_commit.as_ref() > Some(&new_height) { return Err(Misbehavior::InvalidViewChange); } + peer.view.last_commit = Some(new_height); Ok(()) @@ -416,7 +408,7 @@ impl Peers { } #[derive(Debug)] -enum Action { +pub(super) enum Action { // repropagate under given topic, to the given peers, applying cost/benefit to originator. Keep(H, i32), // discard and process. @@ -433,6 +425,8 @@ struct Inner { next_rebroadcast: Instant, } +type MaybeMessage = Option<(Vec, NeighborPacket>)>; + impl Inner { fn new(config: crate::Config) -> Self { Inner { @@ -445,9 +439,9 @@ impl Inner { } /// Note a round in a set has started. - fn note_round>(&mut self, round: Round, set_id: SetId, net: &N) { + fn note_round(&mut self, round: Round, set_id: SetId) -> MaybeMessage { if self.local_view.round == round && self.local_view.set_id == set_id { - return + return None; } debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.", @@ -457,24 +451,28 @@ impl Inner { self.local_view.set_id = set_id; self.live_topics.push(round, set_id); - self.multicast_neighbor_packet(net); + self.multicast_neighbor_packet() } /// Note that a voter set with given ID has started. Does nothing if the last /// call to the function was with the same `set_id`. - fn note_set>(&mut self, set_id: SetId, net: &N) { - if self.local_view.set_id == set_id { return } + fn note_set(&mut self, set_id: SetId) -> MaybeMessage { + if self.local_view.set_id == set_id { + return None; + } self.local_view.update_set(set_id); self.live_topics.push(Round(0), set_id); - self.multicast_neighbor_packet(net); + self.multicast_neighbor_packet() } /// Note that we've imported a commit finalizing a given block. - fn note_commit_finalized>(&mut self, finalized: NumberFor, net: &N) { + fn note_commit_finalized(&mut self, finalized: NumberFor) -> MaybeMessage { if self.local_view.last_commit.as_ref() < Some(&finalized) { self.local_view.last_commit = Some(finalized); - self.multicast_neighbor_packet(net) + self.multicast_neighbor_packet() + } else { + None } } @@ -520,7 +518,6 @@ impl Inner { fn validate_commit_message(&mut self, who: &PeerId, full: &FullCommitMessage) -> Action { - use grandpa::Message as GrandpaMessage; if let Err(misbehavior) = self.peers.update_commit_height(who, full.message.target_number) { return Action::Discard(misbehavior.cost()); @@ -543,28 +540,6 @@ impl Inner { return Action::Discard(cost::MALFORMED_COMMIT); } - // check signatures on all contained precommits. - for (i, (precommit, &(ref sig, ref id))) in full.message.precommits.iter() - .zip(&full.message.auth_data) - .enumerate() - { - if let Err(()) = super::check_message_sig::( - &GrandpaMessage::Precommit(precommit.clone()), - id, - sig, - full.round.0, - full.set_id.0, - ) { - debug!(target: "afg", "Bad commit message signature {}", id); - telemetry!(CONSENSUS_DEBUG; "afg.bad_commit_msg_signature"; "id" => ?id); - return Action::Discard(Misbehavior::BadCommitMessage { - signatures_checked: i as i32, - blocks_loaded: 0, - equivocations_caught: 0, - }.cost()); - } - } - // always discard commits initially and rebroadcast after doing full // checking. let topic = super::global_topic::(full.set_id.0); @@ -585,65 +560,81 @@ impl Inner { (neighbor_topics, Action::Discard(cb)) } - fn construct_neighbor_packet(&self) -> GossipMessage { + fn multicast_neighbor_packet(&self) -> MaybeMessage { let packet = NeighborPacket { round: self.local_view.round, set_id: self.local_view.set_id, commit_finalized_height: self.local_view.last_commit.unwrap_or(Zero::zero()), }; - GossipMessage::Neighbor(VersionedNeighborPacket::V1(packet)) - } - - fn multicast_neighbor_packet>(&self, net: &N) { - let packet = self.construct_neighbor_packet(); let peers = self.peers.inner.keys().cloned().collect(); - net.send_message(peers, packet.encode()); + Some((peers, packet)) } } /// A validator for GRANDPA gossip messages. pub(super) struct GossipValidator { inner: parking_lot::RwLock>, + report_sender: mpsc::UnboundedSender, } impl GossipValidator { /// Create a new gossip-validator. - pub(super) fn new(config: crate::Config) -> GossipValidator { - GossipValidator { inner: parking_lot::RwLock::new(Inner::new(config)) } + pub(super) fn new(config: crate::Config) -> (GossipValidator, ReportStream) { + let (tx, rx) = mpsc::unbounded(); + let val = GossipValidator { + inner: parking_lot::RwLock::new(Inner::new(config)), + report_sender: tx, + }; + + (val, ReportStream { reports: rx }) } /// Note a round in a set has started. - pub(super) fn note_round>(&self, round: Round, set_id: SetId, net: &N) { - self.inner.write().note_round(round, set_id, net); + pub(super) fn note_round(&self, round: Round, set_id: SetId, send_neighbor: F) + where F: FnOnce(Vec, NeighborPacket>) + { + let maybe_msg = self.inner.write().note_round(round, set_id); + if let Some((to, msg)) = maybe_msg { + send_neighbor(to, msg); + } } /// Note that a voter set with given ID has started. - pub(super) fn note_set>(&self, set_id: SetId, net: &N) { - self.inner.write().note_set(set_id, net); + pub(super) fn note_set(&self, set_id: SetId, send_neighbor: F) + where F: FnOnce(Vec, NeighborPacket>) + { + let maybe_msg = self.inner.write().note_set(set_id); + if let Some((to, msg)) = maybe_msg { + send_neighbor(to, msg); + } } /// Note that we've imported a commit finalizing a given block. - pub(super) fn note_commit_finalized>(&self, finalized: NumberFor, net: &N) { - self.inner.write().note_commit_finalized(finalized, net); + pub(super) fn note_commit_finalized(&self, finalized: NumberFor, send_neighbor: F) + where F: FnOnce(Vec, NeighborPacket>) + { + let maybe_msg = self.inner.write().note_commit_finalized(finalized); + if let Some((to, msg)) = maybe_msg { + send_neighbor(to, msg); + } } - fn report(&self, _who: &PeerId, _cost_benefit: i32) { - // report + fn report(&self, who: PeerId, cost_benefit: i32) { + let _ = self.report_sender.unbounded_send(PeerReport { who, cost_benefit }); } - fn do_validate(&self, who: &PeerId, mut data: &[u8]) + pub(super) fn do_validate(&self, who: &PeerId, mut data: &[u8]) -> (Action, Vec) { let mut broadcast_topics = Vec::new(); let action = { - let mut inner = self.inner.write(); match GossipMessage::::decode(&mut data) { Some(GossipMessage::VoteOrPrecommit(ref message)) - => inner.validate_round_message(who, message), - Some(GossipMessage::Commit(ref message)) => inner.validate_commit_message(who, message), + => self.inner.write().validate_round_message(who, message), + Some(GossipMessage::Commit(ref message)) => self.inner.write().validate_commit_message(who, message), Some(GossipMessage::Neighbor(update)) => { - let (topics, action) = inner.import_neighbor_message( + let (topics, action) = self.inner.write().import_neighbor_message( who, update.into_neighbor_packet(), ); @@ -670,7 +661,14 @@ impl network_gossip::Validator for GossipValidator let packet_data = { let mut inner = self.inner.write(); inner.peers.new_peer(who.clone()); - inner.construct_neighbor_packet().encode() + + let packet = NeighborPacket { + round: inner.local_view.round, + set_id: inner.local_view.set_id, + commit_finalized_height: inner.local_view.last_commit.unwrap_or(Zero::zero()), + }; + + GossipMessage::::from(packet).encode() }; context.send_message(who, packet_data); } @@ -691,15 +689,16 @@ impl network_gossip::Validator for GossipValidator match action { Action::Keep(topic, cb) => { - self.report(who, cb); + self.report(who.clone(), cb); + context.broadcast_message(topic, data.to_vec(), false); network_gossip::ValidationResult::ProcessAndKeep(topic) } Action::ProcessAndDiscard(topic, cb) => { - self.report(who, cb); + self.report(who.clone(), cb); network_gossip::ValidationResult::ProcessAndDiscard(topic) } Action::Discard(cb) => { - self.report(who, cb); + self.report(who.clone(), cb); network_gossip::ValidationResult::Discard } } @@ -788,6 +787,62 @@ impl network_gossip::Validator for GossipValidator } } +struct PeerReport { + who: PeerId, + cost_benefit: i32, +} + +// wrapper around a stream of reports. +#[must_use = "The report stream must be consumed"] +pub(super) struct ReportStream { + reports: mpsc::UnboundedReceiver, +} + +impl ReportStream { + /// Consume the report stream, converting it into a future that + /// handles all reports. + pub(super) fn consume(self, net: N) + -> impl Future + Send + 'static + where + B: BlockT, + N: super::Network + Send + 'static, + { + ReportingTask { + reports: self.reports, + net, + _marker: Default::default(), + } + } +} + +/// A future for reporting peers. +#[must_use = "Futures do nothing unless polled"] +struct ReportingTask { + reports: mpsc::UnboundedReceiver, + net: N, + _marker: std::marker::PhantomData, +} + +impl> Future for ReportingTask { + type Item = (); + type Error = (); + + fn poll(&mut self) -> Poll<(), ()> { + loop { + match self.reports.poll() { + Err(_) => { + warn!(target: "afg", "Report stream terminated unexpectedly"); + return Ok(Async::Ready(())) + } + Ok(Async::Ready(None)) => return Ok(Async::Ready(())), + Ok(Async::Ready(Some(PeerReport { who, cost_benefit }))) => + self.net.report(who, cost_benefit), + Ok(Async::NotReady) => return Ok(Async::NotReady), + } + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -804,36 +859,6 @@ mod tests { } } - #[derive(Clone)] - struct StubNetwork; - - impl super::Network for StubNetwork { - type In = futures::stream::Empty; - - fn messages_for(&self, _topic: Block::Hash) -> Self::In { - futures::stream::empty() - } - - fn register_validator( - &self, - _validator: std::sync::Arc>, - ) { - - } - - fn gossip_message(&self, _topic: Block::Hash, _data: Vec, _force: bool) { - - } - - fn send_message(&self, _who: Vec, _data: Vec) { - - } - - fn announce(&self, _block: Block::Hash) { - - } - } - #[test] fn view_vote_rules() { let view = View { round: Round(100), set_id: SetId(1), last_commit: Some(1000u64) }; @@ -975,12 +1000,12 @@ mod tests { #[test] fn messages_not_expired_immediately() { - let val = GossipValidator::::new(config()); + let (val, _) = GossipValidator::::new(config()); let set_id = 1; for round_num in 1u64..10 { - val.note_round(Round(round_num), SetId(set_id), &StubNetwork); + val.note_round(Round(round_num), SetId(set_id), |_, _| {}); } { @@ -989,14 +1014,12 @@ mod tests { // messages from old rounds are expired. for round_num in 1u64..last_kept_round { - println!("{} should be expired?", round_num); let topic = crate::communication::round_topic::(round_num, 1); assert!(is_expired(topic, &[1, 2, 3])); } // messages from not-too-old rounds are not expired. for round_num in last_kept_round..10 { - println!("{} should not be expired?", round_num); let topic = crate::communication::round_topic::(round_num, 1); assert!(!is_expired(topic, &[1, 2, 3])); } diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 1770d41adfd9cd09ba1437af9e6c66c26257ef65..395f8202548cc3b186bc8d62984b565b71667487 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -38,8 +38,8 @@ use parity_codec::{Encode, Decode}; use substrate_primitives::{ed25519, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; use runtime_primitives::ConsensusEngineId; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, NumberFor}; -use network::{consensus_gossip as network_gossip, Service as NetworkService,}; +use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; +use network::{consensus_gossip as network_gossip, Service as NetworkService}; use network_gossip::ConsensusMessage; use crate::{Error, Message, SignedMessage, Commit, CompactCommit}; @@ -50,15 +50,40 @@ use gossip::{ use substrate_primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; pub mod gossip; +mod periodic; + +#[cfg(test)] +mod tests; /// The consensus engine ID of GRANDPA. pub const GRANDPA_ENGINE_ID: ConsensusEngineId = [b'a', b'f', b'g', b'1']; +// cost scalars for reporting peers. +mod cost { + pub(super) const PAST_REJECTION: i32 = -50; + pub(super) const BAD_SIGNATURE: i32 = -100; + pub(super) const MALFORMED_COMMIT: i32 = -1000; + pub(super) const FUTURE_MESSAGE: i32 = -500; + + pub(super) const INVALID_VIEW_CHANGE: i32 = -500; + pub(super) const PER_UNDECODABLE_BYTE: i32 = -5; + pub(super) const PER_SIGNATURE_CHECKED: i32 = -25; + pub(super) const PER_BLOCK_LOADED: i32 = -10; + pub(super) const INVALID_COMMIT: i32 = -5000; +} + +// benefit scalars for reporting peers. +mod benefit { + pub(super) const ROUND_MESSAGE: i32 = 100; + pub(super) const BASIC_VALIDATED_COMMIT: i32 = 100; + pub(super) const PER_EQUIVOCATION: i32 = 10; +} + /// A handle to the network. This is generally implemented by providing some /// handle to a gossip service or similar. /// /// Intended to be a lightweight handle such as an `Arc`. -pub trait Network: Clone { +pub trait Network: Clone + Send + 'static { /// A stream of input messages for a topic. type In: Stream; @@ -77,6 +102,9 @@ pub trait Network: Clone { /// Send a message to a bunch of specific peers, even if they've seen it already. fn send_message(&self, who: Vec, data: Vec); + /// Report a peer's cost or benefit after some action. + fn report(&self, who: network::PeerId, cost_benefit: i32); + /// Inform peers that a block with given hash should be downloaded. fn announce(&self, block: Block::Hash); } @@ -133,6 +161,10 @@ impl Network for Arc> where }) } + fn report(&self, who: network::PeerId, cost_benefit: i32) { + self.report_peer(who, cost_benefit) + } + fn announce(&self, block: B::Hash) { self.announce_block(block) } @@ -164,18 +196,49 @@ impl Stream for NetworkStream { } } +/// The result of processing a commit. +pub(crate) enum CommitProcessingOutcome { + Good, + Bad, +} + /// Bridge between the underlying network service, gossiping consensus messages and Grandpa pub(crate) struct NetworkBridge> { service: N, validator: Arc>, + neighbor_sender: periodic::NeighborPacketSender, } impl> NetworkBridge { - /// Create a new NetworkBridge to the given NetworkService - pub(crate) fn new(service: N, config: crate::Config) -> Self { - let validator = Arc::new(GossipValidator::new(config)); + /// Create a new NetworkBridge to the given NetworkService. Returns the service + /// handle and a future that must be polled to completion to finish startup. + pub(crate) fn new( + service: N, + config: crate::Config, + on_exit: impl Future + Clone + Send + 'static, + ) -> ( + Self, + impl futures::Future + Send + 'static, + ) { + + let (validator, report_stream) = GossipValidator::new(config); + let validator = Arc::new(validator); service.register_validator(validator.clone()); - NetworkBridge { service, validator: validator } + + let (rebroadcast_job, neighbor_sender) = periodic::neighbor_packet_worker(service.clone()); + let reporting_job = report_stream.consume(service.clone()); + + let bridge = NetworkBridge { service, validator, neighbor_sender }; + + let startup_work = futures::future::lazy(move || { + // lazily spawn these jobs onto their own tasks. the lazy future has access + // to tokio globals, which aren't available outside. + tokio::spawn(rebroadcast_job.select(on_exit.clone()).then(|_| Ok(()))); + tokio::spawn(reporting_job.select(on_exit.clone()).then(|_| Ok(()))); + Ok(()) + }); + + (bridge, startup_work) } /// Get the round messages for a round in a given set ID. These are signature-checked. @@ -190,7 +253,14 @@ impl> NetworkBridge { impl Stream,Error=Error>, impl Sink,SinkError=Error>, ) { - self.validator.note_round(round, set_id, &self.service); + self.validator.note_round( + round, + set_id, + |to, neighbor| self.service.send_message( + to, + GossipMessage::::from(neighbor).encode() + ), + ); let locals = local_key.and_then(|pair| { let public = pair.public(); @@ -275,61 +345,113 @@ impl> NetworkBridge { } /// Set up the global communication streams. - pub(crate) fn global_communication(&self, + pub(crate) fn global_communication( + &self, set_id: SetId, voters: Arc>, - is_voter: bool + is_voter: bool, ) -> ( - impl Stream), Error = Error>, + impl Stream, impl FnMut(CommitProcessingOutcome)), Error = Error>, impl Sink), SinkError = Error>, ) { - self.validator.note_set(set_id, &self.service); + self.validator.note_set( + set_id, + |to, neighbor| self.service.send_message(to, GossipMessage::::from(neighbor).encode()), + ); + let service = self.service.clone(); let topic = global_topic::(set_id.0); - let incoming = self.service.messages_for(topic) - .filter_map(|notification| { - // this could be optimized by decoding piecewise. - let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); - if decoded.is_none() { - trace!(target: "afg", "Skipping malformed commit message {:?}", notification); - } - decoded - }) - .filter_map(move |msg| { - match msg { - GossipMessage::Commit(msg) => { - let round = msg.round; - let precommits_signed_by: Vec = - msg.message.auth_data.iter().map(move |(_, a)| { - format!("{}", a) - }).collect(); - telemetry!(CONSENSUS_INFO; "afg.received_commit"; - "contains_precommits_signed_by" => ?precommits_signed_by, - "target_number" => ?msg.message.target_number, - "target_hash" => ?msg.message.target_hash, - ); - check_compact_commit::(msg.message, &*voters).map(move |c| (round.0, c)) - }, - _ => { - debug!(target: "afg", "Skipping unknown message type"); - return None; - } - } - }) - .map_err(|()| Error::Network(format!("Failed to receive message on unbounded stream"))); + let incoming = incoming_global(service, topic, voters, self.validator.clone()); let outgoing = CommitsOut::::new( self.service.clone(), set_id.0, is_voter, + self.validator.clone(), ); (incoming, outgoing) } +} - pub(crate) fn note_commit_finalized(&self, number: NumberFor) { - self.validator.note_commit_finalized(number, &self.service); - } +fn incoming_global>( + service: N, + topic: B::Hash, + voters: Arc>, + gossip_validator: Arc>, +) -> impl Stream, impl FnMut(CommitProcessingOutcome)), Error = Error> { + service.messages_for(topic) + .filter_map(|notification| { + // this could be optimized by decoding piecewise. + let decoded = GossipMessage::::decode(&mut ¬ification.message[..]); + if decoded.is_none() { + trace!(target: "afg", "Skipping malformed commit message {:?}", notification); + } + decoded.map(move |d| (notification, d)) + }) + .filter_map(move |(notification, msg)| { + match msg { + GossipMessage::Commit(msg) => { + let precommits_signed_by: Vec = + msg.message.auth_data.iter().map(move |(_, a)| { + format!("{}", a) + }).collect(); + telemetry!(CONSENSUS_INFO; "afg.received_commit"; + "contains_precommits_signed_by" => ?precommits_signed_by, + "target_number" => ?msg.message.target_number.clone(), + "target_hash" => ?msg.message.target_hash.clone(), + ); + if let Err(cost) = check_compact_commit::( + &msg.message, + &*voters, + msg.round, + msg.set_id, + ) { + if let Some(who) = notification.sender { + service.report(who, cost); + } + None + } else { + Some((msg, notification, service.clone())) + } + }, + _ => { + debug!(target: "afg", "Skipping unknown message type"); + return None; + } + } + }) + .map(move |(msg, mut notification, service)| { + let round = msg.round.0; + let commit = msg.message; + let finalized_number = commit.target_number; + let gossip_validator = gossip_validator.clone(); + let cb = move |outcome| match outcome { + CommitProcessingOutcome::Good => { + // if it checks out, gossip it. not accounting for + // any discrepancy between the actual ghost and the claimed + // finalized number. + gossip_validator.note_commit_finalized( + finalized_number, + |to, neighbor_msg| service.send_message( + to, + GossipMessage::::from(neighbor_msg).encode(), + ), + ); + + service.gossip_message(topic, notification.message.clone(), false); + } + CommitProcessingOutcome::Bad => { + // report peer and do not gossip. + if let Some(who) = notification.sender.take() { + service.report(who, cost::INVALID_COMMIT); + } + } + }; + + (round, commit, cb) + }) + .map_err(|()| Error::Network(format!("Failed to receive message on unbounded stream"))) } impl> Clone for NetworkBridge { @@ -337,6 +459,7 @@ impl> Clone for NetworkBridge { NetworkBridge { service: self.service.clone(), validator: Arc::clone(&self.validator), + neighbor_sender: self.neighbor_sender.clone(), } } } @@ -462,41 +585,86 @@ impl> Sink for OutgoingMessages } } +// checks a compact commit. returns `None` if it was bad and fn check_compact_commit( - msg: CompactCommit, + msg: &CompactCommit, voters: &VoterSet, -) -> Option> { - if msg.precommits.len() != msg.auth_data.len() || msg.precommits.is_empty() { - debug!(target: "afg", "Skipping malformed compact commit"); - return None; - } + round: Round, + set_id: SetId, +) -> Result<(), i32> { + // 4f + 1 = equivocations from f voters. + let f = voters.total_weight() - voters.threshold(); + let full_threshold = voters.total_weight() + f; - // check signatures on all contained precommits. + // check total weight is not too high. + let mut total_weight = 0; for (_, ref id) in &msg.auth_data { - if !voters.contains_key(id) { + if let Some(weight) = voters.info(id).map(|info| info.weight()) { + total_weight += weight; + if total_weight > full_threshold { + return Err(cost::MALFORMED_COMMIT); + } + } else { debug!(target: "afg", "Skipping commit containing unknown voter {}", id); - return None; + return Err(cost::MALFORMED_COMMIT); + } + } + + if total_weight < voters.threshold() { + return Err(cost::MALFORMED_COMMIT); + } + + // check signatures on all contained precommits. + for (i, (precommit, &(ref sig, ref id))) in msg.precommits.iter() + .zip(&msg.auth_data) + .enumerate() + { + use crate::communication::gossip::Misbehavior; + use grandpa::Message as GrandpaMessage; + + if let Err(()) = check_message_sig::( + &GrandpaMessage::Precommit(precommit.clone()), + id, + sig, + round.0, + set_id.0, + ) { + debug!(target: "afg", "Bad commit message signature {}", id); + telemetry!(CONSENSUS_DEBUG; "afg.bad_commit_msg_signature"; "id" => ?id); + let cost = Misbehavior::BadCommitMessage { + signatures_checked: i as i32, + blocks_loaded: 0, + equivocations_caught: 0, + }.cost(); + + return Err(cost); } } - Some(msg) + Ok(()) } + /// An output sink for commit messages. struct CommitsOut> { network: N, set_id: SetId, is_voter: bool, - _marker: ::std::marker::PhantomData, + gossip_validator: Arc>, } impl> CommitsOut { /// Create a new commit output stream. - pub(crate) fn new(network: N, set_id: u64, is_voter: bool) -> Self { + pub(crate) fn new( + network: N, + set_id: u64, + is_voter: bool, + gossip_validator: Arc>, + ) -> Self { CommitsOut { network, set_id: SetId(set_id), is_voter, - _marker: Default::default(), + gossip_validator, } } } @@ -513,7 +681,7 @@ impl> Sink for CommitsOut { let (round, commit) = input; let round = Round(round); - telemetry!(CONSENSUS_INFO; "afg.commit_issued"; + telemetry!(CONSENSUS_DEBUG; "afg.commit_issued"; "target_number" => ?commit.target_number, "target_hash" => ?commit.target_hash, ); let (precommits, auth_data) = commit.precommits.into_iter() @@ -534,6 +702,16 @@ impl> Sink for CommitsOut { }); let topic = global_topic::(self.set_id.0); + + // the gossip validator needs to be made aware of the best commit-height we know of + // before gossiping + self.gossip_validator.note_commit_finalized( + commit.target_number, + |to, neighbor| self.network.send_message( + to, + GossipMessage::::from(neighbor).encode(), + ), + ); self.network.gossip_message(topic, message.encode(), false); Ok(AsyncSink::Ready) diff --git a/core/finality-grandpa/src/communication/periodic.rs b/core/finality-grandpa/src/communication/periodic.rs new file mode 100644 index 0000000000000000000000000000000000000000..c6121370421bccefffb524e5afb3c9929a36e6f6 --- /dev/null +++ b/core/finality-grandpa/src/communication/periodic.rs @@ -0,0 +1,93 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Periodic rebroadcast of neighbor packets. + +use super::{gossip::{NeighborPacket, GossipMessage}, Network}; +use futures::prelude::*; +use futures::sync::mpsc; +use runtime_primitives::traits::{NumberFor, Block as BlockT}; +use network::PeerId; +use tokio::timer::Delay; +use log::warn; +use parity_codec::Encode; + +use std::time::{Instant, Duration}; + +// how often to rebroadcast, if no other +const REBROADCAST_AFTER: Duration = Duration::from_secs(2 * 60); + +fn rebroadcast_instant() -> Instant { + Instant::now() + REBROADCAST_AFTER +} + +/// A sender used to send neighbor packets to a background job. +pub(super) type NeighborPacketSender = mpsc::UnboundedSender<(Vec, NeighborPacket>)>; + +/// Does the work of sending neighbor packets, asynchronously. +/// +/// It may rebroadcast the last neighbor packet periodically when no +/// progress is made. +pub(super) fn neighbor_packet_worker(net: N) -> ( + impl Future + Send + 'static, + NeighborPacketSender, +) where + B: BlockT, + N: Network, +{ + let mut last = None; + let (tx, mut rx) = mpsc::unbounded::<(Vec, NeighborPacket>)>(); + let mut delay = Delay::new(rebroadcast_instant()); + + let work = futures::future::poll_fn(move || { + loop { + match rx.poll().expect("unbounded receivers do not error; qed") { + Async::Ready(None) => return Ok(Async::Ready(())), + Async::Ready(Some((to, packet))) => { + // send to peers. + net.send_message(to.clone(), GossipMessage::::from(packet.clone()).encode()); + + // rebroadcasting network. + delay.reset(rebroadcast_instant()); + last = Some((to, packet)); + } + Async::NotReady => break, + } + } + + // has to be done in a loop because it needs to be polled after + // re-scheduling. + loop { + match delay.poll() { + Err(e) => { + warn!(target: "afg", "Could not rebroadcast neighbor packets: {:?}", e); + delay.reset(rebroadcast_instant()); + } + Ok(Async::Ready(())) => { + delay.reset(rebroadcast_instant()); + + if let Some((ref to, ref packet)) = last { + // send to peers. + net.send_message(to.clone(), GossipMessage::::from(packet.clone()).encode()); + } + } + Ok(Async::NotReady) => return Ok(Async::NotReady), + } + } + }); + + (work, tx) +} diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..2ef6d280646a4214f8564cff99806ce6c50f1db0 --- /dev/null +++ b/core/finality-grandpa/src/communication/tests.rs @@ -0,0 +1,385 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Tests for the communication portion of the GRANDPA crate. + +use futures::sync::mpsc; +use futures::prelude::*; +use network::consensus_gossip as network_gossip; +use network::test::{Block, Hash}; +use network_gossip::Validator; +use tokio::runtime::current_thread; +use std::sync::Arc; +use keyring::AuthorityKeyring; +use parity_codec::Encode; + +use super::gossip::{self, GossipValidator}; +use super::{AuthorityId, VoterSet, Round, SetId}; + +enum Event { + MessagesFor(Hash, mpsc::UnboundedSender), + RegisterValidator(Arc>), + GossipMessage(Hash, Vec, bool), + SendMessage(Vec, Vec), + Report(network::PeerId, i32), + Announce(Hash), +} + +#[derive(Clone)] +struct TestNetwork { + sender: mpsc::UnboundedSender, +} + +impl super::Network for TestNetwork { + type In = mpsc::UnboundedReceiver; + + /// Get a stream of messages for a specific gossip topic. + fn messages_for(&self, topic: Hash) -> Self::In { + let (tx, rx) = mpsc::unbounded(); + let _ = self.sender.unbounded_send(Event::MessagesFor(topic, tx)); + + rx + } + + /// Register a gossip validator. + fn register_validator(&self, validator: Arc>) { + let _ = self.sender.unbounded_send(Event::RegisterValidator(validator)); + } + + /// Gossip a message out to all connected peers. + /// + /// Force causes it to be sent to all peers, even if they've seen it already. + /// Only should be used in case of consensus stall. + fn gossip_message(&self, topic: Hash, data: Vec, force: bool) { + let _ = self.sender.unbounded_send(Event::GossipMessage(topic, data, force)); + } + + /// Send a message to a bunch of specific peers, even if they've seen it already. + fn send_message(&self, who: Vec, data: Vec) { + let _ = self.sender.unbounded_send(Event::SendMessage(who, data)); + } + + /// Report a peer's cost or benefit after some action. + fn report(&self, who: network::PeerId, cost_benefit: i32) { + let _ = self.sender.unbounded_send(Event::Report(who, cost_benefit)); + } + + /// Inform peers that a block with given hash should be downloaded. + fn announce(&self, block: Hash) { + let _ = self.sender.unbounded_send(Event::Announce(block)); + } +} + +struct Tester { + net_handle: super::NetworkBridge, + gossip_validator: Arc>, + events: mpsc::UnboundedReceiver, +} + +impl Tester { + fn filter_network_events(self, mut pred: F) -> impl Future + where F: FnMut(Event) -> bool + { + let mut s = Some(self); + futures::future::poll_fn(move || loop { + match s.as_mut().unwrap().events.poll().expect("concluded early") { + Async::Ready(None) => panic!("concluded early"), + Async::Ready(Some(item)) => if pred(item) { + return Ok(Async::Ready(s.take().unwrap())) + }, + Async::NotReady => return Ok(Async::NotReady), + } + }) + } +} + +// some random config (not really needed) +fn config() -> crate::Config { + crate::Config { + gossip_duration: std::time::Duration::from_millis(10), + justification_period: 256, + local_key: None, + name: None, + } +} + +// needs to run in a tokio runtime. +fn make_test_network() -> impl Future { + let (tx, rx) = mpsc::unbounded(); + let net = TestNetwork { sender: tx }; + + #[derive(Clone)] + struct Exit; + + impl Future for Exit { + type Item = (); + type Error = (); + + fn poll(&mut self) -> Poll<(), ()> { + Ok(Async::NotReady) + } + } + + let (bridge, startup_work) = super::NetworkBridge::new( + net.clone(), + config(), + Exit, + ); + + startup_work.map(move |()| Tester { + gossip_validator: bridge.validator.clone(), + net_handle: bridge, + events: rx, + }) +} + +fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(AuthorityId, u64)> { + keys.iter() + .map(|key| AuthorityId(key.to_raw_public())) + .map(|id| (id, 1)) + .collect() +} + +struct NoopContext; + +impl network_gossip::ValidatorContext for NoopContext { + fn broadcast_topic(&mut self, _: Hash, _: bool) { } + fn broadcast_message(&mut self, _: Hash, _: Vec, _: bool) { } + fn send_message(&mut self, _: &network::PeerId, _: Vec) { } + fn send_topic(&mut self, _: &network::PeerId, _: Hash, _: bool) { } +} + +#[test] +fn good_commit_leads_to_relay() { + let private = [AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let public = make_ids(&private[..]); + let voter_set = Arc::new(public.iter().cloned().collect::>()); + + let round = 0; + let set_id = 1; + + let commit = { + let target_hash: Hash = [1; 32].into(); + let target_number = 500; + + let precommit = grandpa::Precommit { target_hash: target_hash.clone(), target_number }; + let payload = super::localized_payload( + round, set_id, &grandpa::Message::Precommit(precommit.clone()) + ); + + let mut precommits = Vec::new(); + let mut auth_data = Vec::new(); + + for (i, key) in private.iter().enumerate() { + precommits.push(precommit.clone()); + + let signature = key.sign(&payload[..]); + auth_data.push((signature, public[i].0.clone())) + } + + grandpa::CompactCommit { + target_hash, + target_number, + precommits, + auth_data, + } + }; + + let encoded_commit = gossip::GossipMessage::::Commit(gossip::FullCommitMessage { + round: Round(round), + set_id: SetId(set_id), + message: commit, + }).encode(); + + let id = network::PeerId::random(); + let global_topic = super::global_topic::(set_id); + + let test = make_test_network() + .and_then(move |tester| { + // register a peer. + tester.gossip_validator.new_peer(&mut NoopContext, &id, network::config::Roles::FULL); + Ok((tester, id)) + }) + .and_then(move |(tester, id)| { + // start round, dispatch commit, and wait for broadcast. + let (commits_in, _) = tester.net_handle.global_communication(SetId(1), voter_set, false); + + { + let (action, _) = tester.gossip_validator.do_validate(&id, &encoded_commit[..]); + match action { + gossip::Action::ProcessAndDiscard(t, _) => assert_eq!(t, global_topic), + _ => panic!("wrong expected outcome from initial commit validation"), + } + } + + let commit_to_send = encoded_commit.clone(); + + // asking for global communication will cause the test network + // to send us an event asking us for a stream. use it to + // send a message. + let sender_id = id.clone(); + let send_message = tester.filter_network_events(move |event| match event { + Event::MessagesFor(topic, sender) => { + if topic != global_topic { return false } + let _ = sender.unbounded_send(network_gossip::TopicNotification { + message: commit_to_send.clone(), + sender: Some(sender_id.clone()), + }); + + true + } + _ => false, + }); + + // when the commit comes in, we'll tell the callback it was good. + let handle_commit = commits_in.into_future() + .map(|(item, _)| { + let (_, _, mut callback) = item.unwrap(); + (callback)(super::CommitProcessingOutcome::Good); + }) + .map_err(|_| panic!("could not process commit")); + + // once the message is sent and commit is "handled" we should have + // a repropagation event coming from the network. + send_message.join(handle_commit).and_then(move |(tester, ())| { + tester.filter_network_events(move |event| match event { + Event::GossipMessage(topic, data, false) => { + if topic == global_topic && data == encoded_commit { + true + } else { + panic!("Trying to gossip something strange") + } + } + _ => false, + }) + }) + .map_err(|_| panic!("could not watch for gossip message")) + .map(|_| ()) + }); + + current_thread::block_on_all(test).unwrap(); +} + +#[test] +fn bad_commit_leads_to_report() { + let private = [AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let public = make_ids(&private[..]); + let voter_set = Arc::new(public.iter().cloned().collect::>()); + + let round = 0; + let set_id = 1; + + let commit = { + let target_hash: Hash = [1; 32].into(); + let target_number = 500; + + let precommit = grandpa::Precommit { target_hash: target_hash.clone(), target_number }; + let payload = super::localized_payload( + round, set_id, &grandpa::Message::Precommit(precommit.clone()) + ); + + let mut precommits = Vec::new(); + let mut auth_data = Vec::new(); + + for (i, key) in private.iter().enumerate() { + precommits.push(precommit.clone()); + + let signature = key.sign(&payload[..]); + auth_data.push((signature, public[i].0.clone())) + } + + grandpa::CompactCommit { + target_hash, + target_number, + precommits, + auth_data, + } + }; + + let encoded_commit = gossip::GossipMessage::::Commit(gossip::FullCommitMessage { + round: Round(round), + set_id: SetId(set_id), + message: commit, + }).encode(); + + let id = network::PeerId::random(); + let global_topic = super::global_topic::(set_id); + + let test = make_test_network() + .and_then(move |tester| { + // register a peer. + tester.gossip_validator.new_peer(&mut NoopContext, &id, network::config::Roles::FULL); + Ok((tester, id)) + }) + .and_then(move |(tester, id)| { + // start round, dispatch commit, and wait for broadcast. + let (commits_in, _) = tester.net_handle.global_communication(SetId(1), voter_set, false); + + { + let (action, _) = tester.gossip_validator.do_validate(&id, &encoded_commit[..]); + match action { + gossip::Action::ProcessAndDiscard(t, _) => assert_eq!(t, global_topic), + _ => panic!("wrong expected outcome from initial commit validation"), + } + } + + let commit_to_send = encoded_commit.clone(); + + // asking for global communication will cause the test network + // to send us an event asking us for a stream. use it to + // send a message. + let sender_id = id.clone(); + let send_message = tester.filter_network_events(move |event| match event { + Event::MessagesFor(topic, sender) => { + if topic != global_topic { return false } + let _ = sender.unbounded_send(network_gossip::TopicNotification { + message: commit_to_send.clone(), + sender: Some(sender_id.clone()), + }); + + true + } + _ => false, + }); + + // when the commit comes in, we'll tell the callback it was good. + let handle_commit = commits_in.into_future() + .map(|(item, _)| { + let (_, _, mut callback) = item.unwrap(); + (callback)(super::CommitProcessingOutcome::Bad); + }) + .map_err(|_| panic!("could not process commit")); + + // once the message is sent and commit is "handled" we should have + // a report event coming from the network. + send_message.join(handle_commit).and_then(move |(tester, ())| { + tester.filter_network_events(move |event| match event { + Event::Report(who, cost_benefit) => { + if who == id && cost_benefit == super::cost::INVALID_COMMIT { + true + } else { + panic!("reported unknown peer or unexpected cost"); + } + } + _ => false, + }) + }) + .map_err(|_| panic!("could not watch for peer report")) + .map(|_| ()) + }); + + current_thread::block_on_all(test).unwrap(); +} diff --git a/core/finality-grandpa/src/consensus_changes.rs b/core/finality-grandpa/src/consensus_changes.rs index cbd7b30f8e7a5ebcb2883baf4ea0be20683357d6..02ac95124151d70a42368f0917430a0c0e6d449b 100644 --- a/core/finality-grandpa/src/consensus_changes.rs +++ b/core/finality-grandpa/src/consensus_changes.rs @@ -32,6 +32,11 @@ impl ConsensusChanges { impl ConsensusChanges { + /// Returns reference to all pending changes. + pub fn pending_changes(&self) -> &[(N, H)] { + &self.pending_changes + } + /// Note unfinalized change of consensus-related data. pub(crate) fn note_change(&mut self, at: (N, H)) { let idx = self.pending_changes diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 2912cd5808975d0f4c2a04f76cc5f8901411a894..564b7630c402313f82858ad047b975ad684342c9 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -34,7 +34,7 @@ use grandpa::{ }; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - As, Block as BlockT, Header as HeaderT, NumberFor, One, Zero, + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, }; use substrate_primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; @@ -44,6 +44,8 @@ use crate::{ PrimaryPropose, SignedMessage, NewAuthoritySet, VoterCommand, }; +use consensus_common::SelectChain; + use crate::authorities::SharedAuthoritySet; use crate::consensus_changes::SharedConsensusChanges; use crate::justification::GrandpaJustification; @@ -262,8 +264,9 @@ impl SharedVoterSetState { } /// The environment we run GRANDPA in. -pub(crate) struct Environment, RA> { +pub(crate) struct Environment, RA, SC> { pub(crate) inner: Arc>, + pub(crate) select_chain: SC, pub(crate) voters: Arc>, pub(crate) config: Config, pub(crate) authority_set: SharedAuthoritySet>, @@ -273,7 +276,7 @@ pub(crate) struct Environment, RA> { pub(crate) voter_set_state: SharedVoterSetState, } -impl, RA> Environment { +impl, RA, SC> Environment { /// Updates the voter set state using the given closure. The write lock is /// held during evaluation of the closure and the environment's voter set /// state is set to its result if successful. @@ -289,40 +292,20 @@ impl, RA> Environment } } -impl, B, E, N, RA> grandpa::Chain> for Environment where +impl, B, E, N, RA, SC> + grandpa::Chain> +for Environment +where Block: 'static, B: Backend + 'static, E: CallExecutor + 'static, N: Network + 'static, N::In: 'static, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, { fn ancestry(&self, base: Block::Hash, block: Block::Hash) -> Result, GrandpaError> { - if base == block { return Err(GrandpaError::NotDescendent) } - - let tree_route_res = ::client::blockchain::tree_route( - self.inner.backend().blockchain(), - BlockId::Hash(block), - BlockId::Hash(base), - ); - - let tree_route = match tree_route_res { - Ok(tree_route) => tree_route, - Err(e) => { - debug!(target: "afg", "Encountered error computing ancestry between block {:?} and base {:?}: {:?}", - block, base, e); - - return Err(GrandpaError::NotDescendent); - } - }; - - if tree_route.common_block().hash != base { - return Err(GrandpaError::NotDescendent); - } - - // skip one because our ancestry is meant to start from the parent of `block`, - // and `tree_route` includes it. - Ok(tree_route.retracted().iter().skip(1).map(|e| e.hash).collect()) + ancestry(&self.inner, base, block) } fn best_chain_containing(&self, block: Block::Hash) -> Option<(Block::Hash, NumberFor)> { @@ -341,7 +324,7 @@ impl, B, E, N, RA> grandpa::Chain { let base_header = self.inner.header(&BlockId::Hash(block)).ok()? .expect("Header known to exist after `best_containing` call; qed"); @@ -400,13 +383,53 @@ impl, B, E, N, RA> grandpa::Chain, N, RA> voter::Environment> for Environment where + +pub(crate) fn ancestry, E, RA>( + client: &Client, + base: Block::Hash, + block: Block::Hash, +) -> Result, GrandpaError> where + B: Backend, + E: CallExecutor, +{ + if base == block { return Err(GrandpaError::NotDescendent) } + + let tree_route_res = ::client::blockchain::tree_route( + client.backend().blockchain(), + BlockId::Hash(block), + BlockId::Hash(base), + ); + + let tree_route = match tree_route_res { + Ok(tree_route) => tree_route, + Err(e) => { + debug!(target: "afg", "Encountered error computing ancestry between block {:?} and base {:?}: {:?}", + block, base, e); + + return Err(GrandpaError::NotDescendent); + } + }; + + if tree_route.common_block().hash != base { + return Err(GrandpaError::NotDescendent); + } + + // skip one because our ancestry is meant to start from the parent of `block`, + // and `tree_route` includes it. + Ok(tree_route.retracted().iter().skip(1).map(|e| e.hash).collect()) +} + +impl, N, RA, SC> + voter::Environment> +for Environment +where Block: 'static, B: Backend + 'static, E: CallExecutor + 'static + Send + Sync, N: Network + 'static + Send, N::In: 'static + Send, RA: 'static + Send + Sync, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, { type Timer = Box + Send>; @@ -642,21 +665,15 @@ impl, N, RA> voter::Environment Self::Timer { @@ -886,8 +903,6 @@ pub(crate) fn canonical_at_height, RA>( B: Backend, E: CallExecutor + Send + Sync, { - use runtime_primitives::traits::{One, Zero, BlockNumberToHash}; - if height > base.1 { return Ok(None); } diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index 2a28cca3a84d3293c2f551563458ea84c96f00f3..4cffe0dd981c13ed8ea6aab82a638cf8aaad9066 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -17,254 +17,612 @@ //! GRANDPA block finality proof generation and check. //! //! Finality of block B is proved by providing: -//! 1) valid headers sub-chain from the block B to the block F; -//! 2) valid (with respect to proved authorities) GRANDPA justification of the block F; -//! 3) proof-of-execution of the `grandpa_authorities` call at the block F. +//! 1) the justification for the descendant block F; +//! 2) headers sub-chain (B; F] if B != F; +//! 3) proof of GRANDPA::authorities() if the set changes at block F. //! //! Since earliest possible justification is returned, the GRANDPA authorities set //! at the block F is guaranteed to be the same as in the block B (this is because block //! that enacts new GRANDPA authorities set always comes with justification). It also //! means that the `set_id` is the same at blocks B and F. //! -//! The caller should track the `set_id`. The most straightforward way is to fetch finality -//! proofs ONLY for blocks on the tip of the chain and track the latest known `set_id`. +//! Let U be the last finalized block known to caller. If authorities set has changed several +//! times in the (U; F] interval, multiple finality proof fragments are returned (one for each +//! authority set change) and they must be verified in-order. +//! +//! Finality proof provider can choose how to provide finality proof on its own. The incomplete +//! finality proof (that finalizes some block C that is ancestor of the B and descendant +//! of the U) could be returned. -use grandpa::voter_set::VoterSet; +use std::sync::Arc; +use log::{trace, warn}; use client::{ - blockchain::Backend as BlockchainBackend, - error::{Error as ClientError, ErrorKind as ClientErrorKind, Result as ClientResult}, - light::fetcher::RemoteCallRequest, + backend::Backend, blockchain::Backend as BlockchainBackend, CallExecutor, Client, + error::{Error as ClientError, Result as ClientResult}, + light::fetcher::{FetchChecker, RemoteCallRequest}, + ExecutionStrategy, NeverOffchainExt, }; use parity_codec::{Encode, Decode}; use grandpa::BlockNumberOps; -use runtime_primitives::generic::BlockId; +use runtime_primitives::{Justification, generic::BlockId}; use runtime_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, One, }; -use substrate_primitives::{ed25519, H256}; +use substrate_primitives::{ed25519, H256, Blake2Hasher}; use ed25519::Public as AuthorityId; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; use crate::justification::GrandpaJustification; -/// Prepare proof-of-finality for the given block. +/// Maximum number of fragments that we want to return in a single prove_finality call. +const MAX_FRAGMENTS_IN_PROOF: usize = 8; + +/// GRANDPA authority set related methods for the finality proof provider. +pub trait AuthoritySetForFinalityProver: Send + Sync { + /// Call GrandpaApi::grandpa_authorities at given block. + fn authorities(&self, block: &BlockId) -> ClientResult>; + /// Prove call of GrandpaApi::grandpa_authorities at given block. + fn prove_authorities(&self, block: &BlockId) -> ClientResult>>; +} + +/// Client-based implementation of AuthoritySetForFinalityProver. +impl, RA> AuthoritySetForFinalityProver for Client + where + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + fn authorities(&self, block: &BlockId) -> ClientResult> { + self.executor().call( + block, + "GrandpaApi_grandpa_authorities", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new(), + ).and_then(|call_result| Decode::decode(&mut &call_result[..]) + .ok_or_else(|| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), + ))) + } + + fn prove_authorities(&self, block: &BlockId) -> ClientResult>> { + self.execution_proof(block, "GrandpaApi_grandpa_authorities",&[]).map(|(_, proof)| proof) + } +} + +/// GRANDPA authority set related methods for the finality proof checker. +pub trait AuthoritySetForFinalityChecker: Send + Sync { + /// Check execution proof of Grandpa::grandpa_authorities at given block. + fn check_authorities_proof( + &self, + hash: Block::Hash, + header: Block::Header, + proof: Vec>, + ) -> ClientResult>; +} + +/// FetchChecker-based implementation of AuthoritySetForFinalityChecker. +impl AuthoritySetForFinalityChecker for Arc> { + fn check_authorities_proof( + &self, + hash: Block::Hash, + header: Block::Header, + proof: Vec>, + ) -> ClientResult> { + let request = RemoteCallRequest { + block: hash, + header, + method: "GrandpaApi_grandpa_authorities".into(), + call_data: vec![], + retry_count: None, + }; + + self.check_execution_proof(&request, proof) + .and_then(|authorities| { + let authorities: Vec<(AuthorityId, u64)> = Decode::decode(&mut &authorities[..]) + .ok_or_else(|| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), + ))?; + Ok(authorities.into_iter().collect()) + }) + } +} + +/// Finality proof provider for serving network requests. +pub struct FinalityProofProvider, RA> { + client: Arc>, + authority_provider: Arc>, +} + +impl, RA> FinalityProofProvider + where + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + /// Create new finality proof provider using: + /// + /// - client for accessing blockchain data; + /// - authority_provider for calling and proving runtime methods. + pub fn new( + client: Arc>, + authority_provider: Arc>, + ) -> Self { + FinalityProofProvider { client, authority_provider } + } +} + +impl network::FinalityProofProvider for FinalityProofProvider + where + Block: BlockT, + NumberFor: BlockNumberOps, + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + fn prove_finality( + &self, + for_block: Block::Hash, + request: &[u8], + ) -> Result>, ClientError> { + let request: FinalityProofRequest = Decode::decode(&mut &request[..]) + .ok_or_else(|| { + warn!(target: "finality", "Unable to decode finality proof request."); + ClientError::Backend(format!("Invalid finality proof request")) + })?; + match request { + FinalityProofRequest::Original(request) => prove_finality::<_, _, GrandpaJustification>( + &*self.client.backend().blockchain(), + &*self.authority_provider, + request.authorities_set_id, + request.last_finalized, + for_block, + ), + } + } +} + +/// The effects of block finality. +#[derive(Debug, PartialEq)] +pub struct FinalityEffects { + /// The (ordered) set of headers that could be imported. + pub headers_to_import: Vec

, + /// The hash of the block that could be finalized. + pub block: Header::Hash, + /// The justification for the block. + pub justification: Vec, + /// New authorities set id that should be applied starting from block. + pub new_set_id: u64, + /// New authorities set that should be applied starting from block. + pub new_authorities: Vec<(AuthorityId, u64)>, +} + +/// Single fragment of proof-of-finality. +/// +/// Finality for block B is proved by providing: +/// 1) the justification for the descendant block F; +/// 2) headers sub-chain (B; F] if B != F; +/// 3) proof of GRANDPA::authorities() if the set changes at block F. +#[derive(Debug, PartialEq, Encode, Decode)] +struct FinalityProofFragment { + /// The hash of block F for which justification is provided. + pub block: Header::Hash, + /// Justification of the block F. + pub justification: Vec, + /// The set of headers in the range (U; F] that we believe are unknown to the caller. Ordered. + pub unknown_headers: Vec
, + /// Optional proof of execution of GRANDPA::authorities(). + pub authorities_proof: Option>>, +} + +/// Proof of finality is the ordered set of finality fragments, where: +/// - last fragment provides justification for the best possible block from the requested range; +/// - all other fragments provide justifications for GRANDPA authorities set changes within requested range. +type FinalityProof
= Vec>; + +/// Finality proof request data. +#[derive(Debug, Encode, Decode)] +enum FinalityProofRequest { + /// Original version of the request. + Original(OriginalFinalityProofRequest), +} + +/// Original version of finality proof request. +#[derive(Debug, Encode, Decode)] +struct OriginalFinalityProofRequest { + /// The authorities set id we are waiting proof from. + /// + /// The first justification in the proof must be signed by this authority set. + pub authorities_set_id: u64, + /// Hash of the last known finalized block. + pub last_finalized: H, +} + +/// Prepare data blob associated with finality proof request. +pub(crate) fn make_finality_proof_request(last_finalized: H, authorities_set_id: u64) -> Vec { + FinalityProofRequest::Original(OriginalFinalityProofRequest { + authorities_set_id, + last_finalized, + }).encode() +} + +/// Prepare proof-of-finality for the best possible block in the range: (begin; end]. +/// +/// It is assumed that the caller already have a proof-of-finality for the block 'begin'. +/// It is assumed that the caller already knows all blocks in the range (begin; end]. /// -/// The proof is the serialized `FinalityProof` constructed using earliest known -/// justification of the block. None is returned if there's no known justification atm. -pub fn prove_finality( +/// Returns None if there are no finalized blocks unknown to the caller. +pub(crate) fn prove_finality, B: BlockchainBackend, J>( blockchain: &B, - generate_execution_proof: G, - block: Block::Hash, + authorities_provider: &AuthoritySetForFinalityProver, + authorities_set_id: u64, + begin: Block::Hash, + end: Block::Hash, ) -> ::client::error::Result>> where - B: BlockchainBackend, - G: Fn(&BlockId, &str, &[u8]) -> ClientResult>>, + J: ProvableJustification, { - let block_id = BlockId::Hash(block); - let mut block_number = blockchain.expect_block_number_from_id(&block_id)?; + let begin_id = BlockId::Hash(begin); + let begin_number = blockchain.expect_block_number_from_id(&begin_id)?; - // early-return if we sure that the block isn't finalized yet + // early-return if we sure that there are no blocks finalized AFTER begin block let info = blockchain.info()?; - if info.finalized_number < block_number { + if info.finalized_number <= begin_number { + trace!( + target: "finality", + "Requested finality proof for descendant of #{} while we only have finalized #{}. Returning empty proof.", + begin_number, + info.finalized_number, + ); + return Ok(None); } + // check if blocks range is valid. It is the caller responsibility to ensure + // that it only asks peers that know about whole blocks range + let end_number = blockchain.expect_block_number_from_id(&BlockId::Hash(end))?; + if begin_number + One::one() > end_number { + return Err(ClientError::Backend( + format!("Cannot generate finality proof for invalid range: {}..{}", begin_number, end_number), + )); + } + // early-return if we sure that the block is NOT a part of canonical chain - let canonical_block = blockchain.expect_block_hash_from_id(&BlockId::Number(block_number))?; - if block != canonical_block { - return Err(ClientErrorKind::Backend( - "Cannot generate finality proof for non-canonical block".into() - ).into()); - } - - // now that we know that the block is finalized, we can generate finalization proof - - // we need to prove grandpa authorities set that has generated justification - // BUT since `GrandpaApi::grandpa_authorities` call returns the set that becames actual - // at the next block, the proof-of execution is generated using parent block' state - // (this will fail if we're trying to prove genesis finality, but such the call itself is redundant) - let mut current_header = blockchain.expect_header(BlockId::Hash(block))?; - let parent_block_id = BlockId::Hash(*current_header.parent_hash()); - let authorities_proof = generate_execution_proof( - &parent_block_id, - "GrandpaApi_grandpa_authorities", - &[], - )?; - - // search for earliest post-block (inclusive) justification - let mut finalization_path = Vec::new(); + let canonical_begin = blockchain.expect_block_hash_from_id(&BlockId::Number(begin_number))?; + if begin != canonical_begin { + return Err(ClientError::Backend( + format!("Cannot generate finality proof for non-canonical block: {}", begin), + )); + } + + // iterate justifications && try to prove finality + let mut fragment_index = 0; + let mut current_authorities = authorities_provider.authorities(&begin_id)?; + let mut current_number = begin_number + One::one(); + let mut finality_proof = Vec::new(); + let mut unknown_headers = Vec::new(); + let mut latest_proof_fragment = None; loop { - finalization_path.push(current_header); + let current_id = BlockId::Number(current_number); - match blockchain.justification(BlockId::Number(block_number))? { - Some(justification) => return Ok(Some(FinalityProof { - finalization_path, + // check if header is unknown to the caller + if current_number > end_number { + let unknown_header = blockchain.expect_header(current_id)?; + unknown_headers.push(unknown_header); + } + + if let Some(justification) = blockchain.justification(current_id)? { + // check if the current block enacts new GRANDPA authorities set + let parent_id = BlockId::Number(current_number - One::one()); + let new_authorities = authorities_provider.authorities(&parent_id)?; + let new_authorities_proof = if current_authorities != new_authorities { + current_authorities = new_authorities; + Some(authorities_provider.prove_authorities(&parent_id)?) + } else { + None + }; + + // prepare finality proof for the current block + let current = blockchain.expect_block_hash_from_id(&BlockId::Number(current_number))?; + let proof_fragment = FinalityProofFragment { + block: current, justification, - authorities_proof, - }.encode())), - None if block_number == info.finalized_number => break, - None => { - block_number = block_number + One::one(); - current_header = blockchain.expect_header(BlockId::Number(block_number))?; - }, + unknown_headers: ::std::mem::replace(&mut unknown_headers, Vec::new()), + authorities_proof: new_authorities_proof, + }; + + // append justification to finality proof if required + let justifies_end_block = current_number >= end_number; + let justifies_authority_set_change = proof_fragment.authorities_proof.is_some(); + if justifies_end_block || justifies_authority_set_change { + // check if the proof is generated by the requested authority set + if finality_proof.is_empty() { + let justification_check_result = J::decode_and_verify( + &proof_fragment.justification, + authorities_set_id, + ¤t_authorities, + ); + if justification_check_result.is_err() { + trace!( + target: "finality", + "Can not provide finality proof with requested set id #{}\ + (possible forced change?). Returning empty proof.", + authorities_set_id, + ); + + return Ok(None); + } + } + + finality_proof.push(proof_fragment); + latest_proof_fragment = None; + } else { + latest_proof_fragment = Some(proof_fragment); + } + + // we don't need to provide more justifications + if justifies_end_block { + break; + } } + + // we can't provide more justifications + if current_number == info.finalized_number { + // append last justification - even if we can't generate finality proof for + // the end block, we try to generate it for the latest possible block + if let Some(latest_proof_fragment) = latest_proof_fragment.take() { + finality_proof.push(latest_proof_fragment); + + fragment_index += 1; + if fragment_index == MAX_FRAGMENTS_IN_PROOF { + break; + } + } + break; + } + + // else search for the next justification + current_number = current_number + One::one(); } - Err(ClientErrorKind::Backend( - "cannot find justification for finalized block".into() - ).into()) + if finality_proof.is_empty() { + trace!( + target: "finality", + "No justifications found when making finality proof for {}. Returning empty proof.", + end, + ); + + Ok(None) + } else { + trace!( + target: "finality", + "Built finality proof for {} of {} fragments. Last fragment for {}.", + end, + finality_proof.len(), + finality_proof.last().expect("checked that !finality_proof.is_empty(); qed").block, + ); + + Ok(Some(finality_proof.encode())) + } } -/// Check proof-of-finality for the given block. +/// Check GRANDPA proof-of-finality for the given block. /// -/// Returns the vector of headers (including `block` header, ordered by ASC block number) that MUST be -/// validated + imported at once (i.e. within single db transaction). If at least one of those headers -/// is invalid, all other MUST be considered invalid. -pub fn check_finality_proof, C>( - check_execution_proof: C, - parent_header: Block::Header, - block: (NumberFor, Block::Hash), - set_id: u64, +/// Returns the vector of headers that MUST be validated + imported +/// AND if at least one of those headers is invalid, all other MUST be considered invalid. +pub(crate) fn check_finality_proof, B>( + blockchain: &B, + current_set_id: u64, + current_authorities: Vec<(AuthorityId, u64)>, + authorities_provider: &AuthoritySetForFinalityChecker, remote_proof: Vec, -) -> ClientResult> +) -> ClientResult> where - NumberFor: grandpa::BlockNumberOps, - C: Fn(&RemoteCallRequest) -> ClientResult>, + NumberFor: BlockNumberOps, + B: BlockchainBackend, { - do_check_finality_proof::>( - check_execution_proof, - parent_header, - block, - set_id, - remote_proof, - ) + do_check_finality_proof::<_, _, GrandpaJustification>( + blockchain, + current_set_id, + current_authorities, + authorities_provider, + remote_proof) } -/// Check proof-of-finality using given justification type. -fn do_check_finality_proof, C, J>( - check_execution_proof: C, - parent_header: Block::Header, - block: (NumberFor, Block::Hash), - set_id: u64, +fn do_check_finality_proof, B, J>( + blockchain: &B, + current_set_id: u64, + current_authorities: Vec<(AuthorityId, u64)>, + authorities_provider: &AuthoritySetForFinalityChecker, remote_proof: Vec, -) -> ClientResult> +) -> ClientResult> where - NumberFor: grandpa::BlockNumberOps, - C: Fn(&RemoteCallRequest) -> ClientResult>, + NumberFor: BlockNumberOps, + B: BlockchainBackend, J: ProvableJustification, { // decode finality proof - let proof = FinalityProof::::decode(&mut &remote_proof[..]) - .ok_or_else(|| ClientErrorKind::BadJustification("failed to decode finality proof".into()))?; + let proof = FinalityProof::::decode(&mut &remote_proof[..]) + .ok_or_else(|| ClientError::BadJustification("failed to decode finality proof".into()))?; - // check that the first header in finalization path is the block itself - { - let finalized_header = proof.finalization_path.first() - .ok_or_else(|| ClientError::from(ClientErrorKind::BadJustification( - "finality proof: finalized path is empty".into() - )))?; - if *finalized_header.number() != block.0 || finalized_header.hash() != block.1 { - return Err(ClientErrorKind::BadJustification( - "finality proof: block is not a part of finalized path".into() - ).into()); - } + // empty proof can't prove anything + if proof.is_empty() { + return Err(ClientError::BadJustification("empty proof of finality".into())); } - // check that the last header in finalization path is the justification target block - let just_block = proof.justification.target_block(); - { - let finalized_header = proof.finalization_path.last() - .expect("checked above that proof.finalization_path is not empty; qed"); - if *finalized_header.number() != just_block.0 || finalized_header.hash() != just_block.1 { - return Err(ClientErrorKind::BadJustification( - "finality proof: target justification block is not a part of finalized path".into() - ).into()); + // iterate and verify proof fragments + let last_fragment_index = proof.len() - 1; + let mut authorities = AuthoritiesOrEffects::Authorities(current_set_id, current_authorities); + for (proof_fragment_index, proof_fragment) in proof.into_iter().enumerate() { + // check that proof is non-redundant. The proof still can be valid, but + // we do not want peer to spam us with redundant data + if proof_fragment_index != last_fragment_index { + let has_unknown_headers = !proof_fragment.unknown_headers.is_empty(); + let has_new_authorities = proof_fragment.authorities_proof.is_some(); + if has_unknown_headers || !has_new_authorities { + return Err(ClientError::BadJustification("redundant proof of finality".into())); + } } - } - // check authorities set proof && get grandpa authorities that should have signed justification - let grandpa_authorities = check_execution_proof(&RemoteCallRequest { - block: just_block.1, - header: parent_header, - method: "GrandpaApi_grandpa_authorities".into(), - call_data: vec![], - retry_count: None, - })?; - let grandpa_authorities: Vec<(AuthorityId, u64)> = Decode::decode(&mut &grandpa_authorities[..]) - .ok_or_else(|| ClientErrorKind::BadJustification("failed to decode GRANDPA authorities set proof".into()))?; + authorities = check_finality_proof_fragment::<_, _, J>( + blockchain, + authorities, + authorities_provider, + proof_fragment)?; + } - // and now check justification - proof.justification.verify(set_id, &grandpa_authorities.into_iter().collect())?; + let effects = authorities.extract_effects().expect("at least one loop iteration is guaranteed + because proof is not empty;\ + check_finality_proof_fragment is called on every iteration;\ + check_finality_proof_fragment always returns FinalityEffects;\ + qed"); telemetry!(CONSENSUS_INFO; "afg.finality_proof_ok"; - "set_id" => ?set_id, "finalized_header_hash" => ?block.1); - Ok(proof.finalization_path) + "set_id" => ?effects.new_set_id, "finalized_header_hash" => ?effects.block); + + Ok(effects) } -/// Proof of finality. -/// -/// Finality of block B is proved by providing: -/// 1) valid headers sub-chain from the block B to the block F; -/// 2) proof of `GrandpaApi::grandpa_authorities()` call at the block F; -/// 3) valid (with respect to proved authorities) GRANDPA justification of the block F. -#[derive(Debug, PartialEq, Encode, Decode)] -struct FinalityProof { - /// Headers-path (ordered by block number, ascending) from the block we're gathering proof for - /// (inclusive) to the target block of the justification (inclusive). - pub finalization_path: Vec
, - /// Justification (finalization) of the last block from the `finalization_path`. - pub justification: Justification, - /// Proof of `GrandpaApi::grandpa_authorities` call execution at the - /// justification' target block. - pub authorities_proof: Vec>, +/// Check finality proof for the single block. +fn check_finality_proof_fragment, B, J>( + blockchain: &B, + authority_set: AuthoritiesOrEffects, + authorities_provider: &AuthoritySetForFinalityChecker, + proof_fragment: FinalityProofFragment, +) -> ClientResult> + where + NumberFor: BlockNumberOps, + B: BlockchainBackend, + J: Decode + ProvableJustification, +{ + // verify justification using previous authorities set + let (mut current_set_id, mut current_authorities) = authority_set.extract_authorities(); + let justification: J = Decode::decode(&mut &proof_fragment.justification[..]) + .ok_or_else(|| ClientError::JustificationDecode)?; + justification.verify(current_set_id, ¤t_authorities)?; + + // and now verify new authorities proof (if provided) + if let Some(new_authorities_proof) = proof_fragment.authorities_proof { + // it is safe to query header here, because its non-finality proves that it can't be pruned + let header = blockchain.expect_header(BlockId::Hash(proof_fragment.block))?; + let parent_hash = *header.parent_hash(); + let parent_header = blockchain.expect_header(BlockId::Hash(parent_hash))?; + current_authorities = authorities_provider.check_authorities_proof( + parent_hash, + parent_header, + new_authorities_proof, + )?; + + current_set_id = current_set_id + 1; + } + + Ok(AuthoritiesOrEffects::Effects(FinalityEffects { + headers_to_import: proof_fragment.unknown_headers, + block: proof_fragment.block, + justification: proof_fragment.justification, + new_set_id: current_set_id, + new_authorities: current_authorities, + })) } -/// Justification used to prove block finality. -trait ProvableJustification: Encode + Decode { - /// Get target block of this justification. - fn target_block(&self) -> (Header::Number, Header::Hash); +/// Authorities set from initial authorities set or finality effects. +enum AuthoritiesOrEffects { + Authorities(u64, Vec<(AuthorityId, u64)>), + Effects(FinalityEffects
), +} +impl AuthoritiesOrEffects
{ + pub fn extract_authorities(self) -> (u64, Vec<(AuthorityId, u64)>) { + match self { + AuthoritiesOrEffects::Authorities(set_id, authorities) => (set_id, authorities), + AuthoritiesOrEffects::Effects(effects) => (effects.new_set_id, effects.new_authorities), + } + } + + pub fn extract_effects(self) -> Option> { + match self { + AuthoritiesOrEffects::Authorities(_, _) => None, + AuthoritiesOrEffects::Effects(effects) => Some(effects), + } + } +} + +/// Justification used to prove block finality. +pub(crate) trait ProvableJustification: Encode + Decode { /// Verify justification with respect to authorities set and authorities set id. - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()>; + fn verify(&self, set_id: u64, authorities: &[(AuthorityId, u64)]) -> ClientResult<()>; + + /// Decode and verify justification. + fn decode_and_verify( + justification: &Justification, + set_id: u64, + authorities: &[(AuthorityId, u64)], + ) -> ClientResult { + let justification = Self::decode(&mut &**justification).ok_or(ClientError::JustificationDecode)?; + justification.verify(set_id, authorities)?; + Ok(justification) + } } impl> ProvableJustification for GrandpaJustification where NumberFor: BlockNumberOps, { - fn target_block(&self) -> (NumberFor, Block::Hash) { - (self.commit.target_number, self.commit.target_hash) - } - - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { - GrandpaJustification::verify(self, set_id, authorities) + fn verify(&self, set_id: u64, authorities: &[(AuthorityId, u64)]) -> ClientResult<()> { + GrandpaJustification::verify(self, set_id, &authorities.iter().cloned().collect()) } } #[cfg(test)] -mod tests { - use test_client::runtime::{Block, Header}; - use test_client::client::backend::NewBlockState; +pub(crate) mod tests { + use test_client::runtime::{Block, Header, H256}; + use test_client::client::{backend::NewBlockState}; use test_client::client::in_mem::Blockchain as InMemoryBlockchain; use super::*; - type FinalityProof = super::FinalityProof>; + type FinalityProof = super::FinalityProof
; + + impl AuthoritySetForFinalityProver for (GetAuthorities, ProveAuthorities) + where + GetAuthorities: Send + Sync + Fn(BlockId) -> ClientResult>, + ProveAuthorities: Send + Sync + Fn(BlockId) -> ClientResult>>, + { + fn authorities(&self, block: &BlockId) -> ClientResult> { + self.0(*block) + } - #[derive(Encode, Decode)] - struct ValidFinalityProof(Vec); + fn prove_authorities(&self, block: &BlockId) -> ClientResult>> { + self.1(*block) + } + } - impl ProvableJustification
for ValidFinalityProof { - fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + struct ClosureAuthoritySetForFinalityChecker(pub Closure); - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { - assert_eq!(set_id, 1); - assert_eq!(authorities, &vec![ - (AuthorityId([1u8; 32]), 1), - (AuthorityId([2u8; 32]), 2), - (AuthorityId([3u8; 32]), 3), - ].into_iter().collect()); - Ok(()) + impl AuthoritySetForFinalityChecker for ClosureAuthoritySetForFinalityChecker + where + Closure: Send + Sync + Fn(H256, Header, Vec>) -> ClientResult>, + { + fn check_authorities_proof( + &self, + hash: H256, + header: Header, + proof: Vec>, + ) -> ClientResult> { + self.0(hash, header, proof) + } + } + + #[derive(Debug, PartialEq, Encode, Decode)] + pub struct TestJustification(pub bool, pub Vec); + + impl ProvableJustification
for TestJustification { + fn verify(&self, _set_id: u64, _authorities: &[(AuthorityId, u64)]) -> ClientResult<()> { + if self.0 { + Ok(()) + } else { + Err(ClientError::BadJustification("test".into())) + } } } @@ -277,7 +635,23 @@ mod tests { } fn side_header(number: u64) -> Header { - Header::new(number, H256::from_low_u64_be(0), H256::from_low_u64_be(1), header(number - 1).hash(), Default::default()) + Header::new( + number, + H256::from_low_u64_be(0), + H256::from_low_u64_be(1), + header(number - 1).hash(), + Default::default(), + ) + } + + fn second_side_header(number: u64) -> Header { + Header::new( + number, + H256::from_low_u64_be(0), + H256::from_low_u64_be(1), + side_header(number - 1).hash(), + Default::default(), + ) } fn test_blockchain() -> InMemoryBlockchain { @@ -290,13 +664,42 @@ mod tests { } #[test] - fn finality_proof_is_not_generated_for_non_final_block() { + fn finality_prove_fails_with_invalid_range() { + let blockchain = test_blockchain(); + + // their last finalized is: 2 + // they request for proof-of-finality of: 2 + // => range is invalid + prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(2).hash(), + header(2).hash(), + ).unwrap_err(); + } + + #[test] + fn finality_proof_is_none_if_no_more_last_finalized_blocks() { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); - // when asking for finality of block 4, None is returned - let proof_of_4 = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(4).hash()) - .unwrap(); + // our last finalized is: 3 + // their last finalized is: 3 + // => we can't provide any additional justifications + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); assert_eq!(proof_of_4, None); } @@ -305,128 +708,279 @@ mod tests { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); blockchain.insert(side_header(4).hash(), side_header(4), None, None, NewBlockState::Best).unwrap(); + blockchain.insert(second_side_header(5).hash(), second_side_header(5), None, None, NewBlockState::Best) + .unwrap(); blockchain.insert(header(5).hash(), header(5), Some(vec![5]), None, NewBlockState::Final).unwrap(); - // when asking for finality of side-block 42, None is returned - let proof_of_side_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), H256::from_low_u64_be(42)).is_err(); - assert_eq!(proof_of_side_4_fails, true); + // chain is 1 -> 2 -> 3 -> 4 -> 5 + // \> 4' -> 5' + // and the best finalized is 5 + // => when requesting for (4'; 5'], error is returned + prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + side_header(4).hash(), + second_side_header(5).hash(), + ).unwrap_err(); } #[test] - fn finality_proof_fails_if_no_justification_known() { + fn finality_proof_is_none_if_no_justification_known() { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Final).unwrap(); - // when asking for finality of block 4, search for justification failing - let proof_of_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), H256::from_low_u64_be(42)).is_err(); - assert_eq!(proof_of_4_fails, true); + // block 4 is finalized without justification + // => we can't prove finality + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("authorities didn't change => ProveAuthorities won't be called"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); + assert_eq!(proof_of_4, None); } #[test] - fn prove_finality_is_generated() { + fn finality_proof_works_without_authorities_change() { let blockchain = test_blockchain(); + let just4 = TestJustification(true, vec![4]).encode(); + let just5 = TestJustification(true, vec![5]).encode(); + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), Some(just5.clone()), None, NewBlockState::Final).unwrap(); + + // blocks 4 && 5 are finalized with justification + // => since authorities are the same, we only need justification for 5 + let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(5).hash(), + ).unwrap().unwrap()[..]).unwrap(); + assert_eq!(proof_of_5, vec![FinalityProofFragment { + block: header(5).hash(), + justification: just5, + unknown_headers: Vec::new(), + authorities_proof: None, + }]); + } - // when asking for finality of block 2, justification of 3 is returned - let proof_of_2: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(2).hash()) - .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - assert_eq!(proof_of_2, FinalityProof { - finalization_path: vec![header(2), header(3)], - justification: vec![3], - authorities_proof: vec![vec![42]], - }); + #[test] + fn finality_proof_finalized_earlier_block_if_no_justification_for_target_is_known() { + let blockchain = test_blockchain(); + blockchain.insert(header(4).hash(), header(4), Some(vec![4]), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), None, None, NewBlockState::Final).unwrap(); + + // block 4 is finalized with justification + we request for finality of 5 + // => we can't prove finality of 5, but providing finality for 4 is still useful for requester + let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(5).hash(), + ).unwrap().unwrap()[..]).unwrap(); + assert_eq!(proof_of_5, vec![FinalityProofFragment { + block: header(4).hash(), + justification: vec![4], + unknown_headers: Vec::new(), + authorities_proof: None, + }]); + } - // when asking for finality of block 3, justification of 3 is returned - let proof_of_3: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(3).hash()) - .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - assert_eq!(proof_of_3, FinalityProof { - finalization_path: vec![header(3)], - justification: vec![3], - authorities_proof: vec![vec![42]], - }); + #[test] + fn finality_proof_works_with_authorities_change() { + let blockchain = test_blockchain(); + let just4 = TestJustification(true, vec![4]).encode(); + let just5 = TestJustification(true, vec![5]).encode(); + let just7 = TestJustification(true, vec![7]).encode(); + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), Some(just5.clone()), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(6).hash(), header(6), None, None, NewBlockState::Final).unwrap(); + blockchain.insert(header(7).hash(), header(7), Some(just7.clone()), None, NewBlockState::Final).unwrap(); + + // when querying for finality of 6, we assume that the #6 is the last block known to the requester + // => since we only have justification for #7, we provide #7 + let proof_of_6: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |block_id| match block_id { + BlockId::Hash(h) if h == header(3).hash() => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), + BlockId::Number(3) => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), + BlockId::Number(4) => Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)]), + BlockId::Number(6) => Ok(vec![(AuthorityId::from_raw([6u8; 32]), 1u64)]), + _ => unreachable!("no other authorities should be fetched: {:?}", block_id), + }, + |block_id| match block_id { + BlockId::Number(4) => Ok(vec![vec![40]]), + BlockId::Number(6) => Ok(vec![vec![60]]), + _ => unreachable!("no other authorities should be proved: {:?}", block_id), + }, + ), + 0, + header(3).hash(), + header(6).hash(), + ).unwrap().unwrap()[..]).unwrap(); + // initial authorities set (which start acting from #4) is [3; 32] + assert_eq!(proof_of_6, vec![ + // new authorities set starts acting from #5 => we do not provide fragment for #4 + // first fragment provides justification for #5 && authorities set that starts acting from #5 + FinalityProofFragment { + block: header(5).hash(), + justification: just5, + unknown_headers: Vec::new(), + authorities_proof: Some(vec![vec![40]]), + }, + // last fragment provides justification for #7 && unknown#7 + FinalityProofFragment { + block: header(7).hash(), + justification: just7, + unknown_headers: vec![header(7)], + authorities_proof: Some(vec![vec![60]]), + }, + ]); } #[test] - fn finality_proof_check_fails_when_block_is_not_included() { - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(0); - - // block for which we're trying to request finality proof is missing from finalization_path - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + fn finality_proof_check_fails_when_proof_decode_fails() { + let blockchain = test_blockchain(); + + // when we can't decode proof from Vec + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![42], + ).unwrap_err(); } #[test] - fn finality_proof_check_fails_when_justified_block_is_not_included() { - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(1); - - // justified block is missing from finalization_path - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + fn finality_proof_check_fails_when_proof_is_empty() { + let blockchain = test_blockchain(); + + // when decoded proof has zero length + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + Vec::::new().encode(), + ).unwrap_err(); } #[test] - fn finality_proof_check_fails_when_justification_verification_fails() { - #[derive(Encode, Decode)] - struct InvalidFinalityProof(Vec); + fn finality_proof_check_fails_when_intemediate_fragment_has_unknown_headers() { + let blockchain = test_blockchain(); - impl ProvableJustification
for InvalidFinalityProof { - fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + // when intermediate (#0) fragment has non-empty unknown headers + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, + 1, + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: vec![header(4)], + authorities_proof: Some(vec![vec![42]]), + }, FinalityProofFragment { + block: header(5).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(5)], + authorities_proof: None, + }].encode(), + ).unwrap_err(); + } - fn verify(&self, _set_id: u64, _authorities: &VoterSet) -> ClientResult<()> { - Err(ClientErrorKind::Backend("test error".into()).into()) - } - } + #[test] + fn finality_proof_check_fails_when_intemediate_fragment_has_no_authorities_proof() { + let blockchain = test_blockchain(); - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(1); - - // justification is not valid - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + // when intermediate (#0) fragment has empty authorities proof + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: Vec::new(), + authorities_proof: None, + }, FinalityProofFragment { + block: header(5).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(5)], + authorities_proof: None, + }].encode(), + ).unwrap_err(); } #[test] fn finality_proof_check_works() { - let proof_of_2 = prove_finality(&test_blockchain(), |_, _, _| Ok(vec![vec![42]]), header(2).hash()) - .unwrap().unwrap(); - assert_eq!(do_check_finality_proof::( - |_| Ok(vec![ - (AuthorityId([1u8; 32]), 1u64), - (AuthorityId([2u8; 32]), 2u64), - (AuthorityId([3u8; 32]), 3u64), - ].encode()), - header(1), - (2, header(2).hash()), + let blockchain = test_blockchain(); + + let effects = do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2, - ).unwrap(), vec![header(2), header(3)]); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)])), + vec![FinalityProofFragment { + block: header(2).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: Vec::new(), + authorities_proof: Some(vec![vec![42]]), + }, FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(4)], + authorities_proof: None, + }].encode(), + ).unwrap(); + assert_eq!(effects, FinalityEffects { + headers_to_import: vec![header(4)], + block: header(4).hash(), + justification: TestJustification(true, vec![8]).encode(), + new_set_id: 2, + new_authorities: vec![(AuthorityId::from_raw([4u8; 32]), 1u64)], + }); + } + + #[test] + fn finality_proof_is_none_if_first_justification_is_generated_by_unknown_set() { + // this is the case for forced change: set_id has been forcibly increased on full node + // and ligh node missed that + // => justification verification will fail on light node anyways, so we do not return + // finality proof at all + let blockchain = test_blockchain(); + let just4 = TestJustification(false, vec![4]).encode(); // false makes verification fail + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); + assert!(proof_of_4.is_none()); } } diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 34e266ddd3490b4a441bf25f4f80e2110e6c5fb6..1966913c725dc6e8350929c4be015c199eac9c3b 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -26,17 +26,18 @@ use client::blockchain::HeaderBackend; use client::backend::Backend; use client::runtime_api::ApiExt; use consensus_common::{ - BlockImport, Error as ConsensusError, ErrorKind as ConsensusErrorKind, + BlockImport, Error as ConsensusError, ImportBlock, ImportResult, JustificationImport, well_known_cache_keys, + SelectChain, }; use fg_primitives::GrandpaApi; use runtime_primitives::Justification; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - Block as BlockT, DigestFor, DigestItemFor, DigestItem, + Block as BlockT, DigestFor, Header as HeaderT, NumberFor, ProvideRuntimeApi, }; -use substrate_primitives::{H256, ed25519, Blake2Hasher}; +use substrate_primitives::{H256, Blake2Hasher}; use crate::{Error, CommandOrError, NewAuthoritySet, VoterCommand}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, DelayKind, PendingChange}; @@ -44,8 +45,6 @@ use crate::consensus_changes::SharedConsensusChanges; use crate::environment::{finalize_block, is_descendent_of}; use crate::justification::GrandpaJustification; -use ed25519::Public as AuthorityId; - /// A block-import handler for GRANDPA. /// /// This scans each imported block for signals of changing authority set. @@ -55,24 +54,25 @@ use ed25519::Public as AuthorityId; /// /// When using GRANDPA, the block import worker should be using this block import /// object. -pub struct GrandpaBlockImport, RA, PRA> { +pub struct GrandpaBlockImport, RA, PRA, SC> { inner: Arc>, + select_chain: SC, authority_set: SharedAuthoritySet>, send_voter_commands: mpsc::UnboundedSender>>, consensus_changes: SharedConsensusChanges>, api: Arc, } -impl, RA, PRA> JustificationImport - for GrandpaBlockImport where +impl, RA, PRA, SC> JustificationImport + for GrandpaBlockImport where NumberFor: grandpa::BlockNumberOps, B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, + SC: SelectChain, { type Error = ConsensusError; @@ -89,7 +89,7 @@ impl, RA, PRA> JustificationImport pending_change.effective_number() > chain_info.finalized_number && pending_change.effective_number() <= chain_info.best_number { - let effective_block_hash = self.inner.best_containing( + let effective_block_hash = self.select_chain.finality_target( pending_change.canon_hash, Some(pending_change.effective_number()), ); @@ -158,12 +158,13 @@ impl<'a, Block: 'a + BlockT> Drop for PendingSetChanges<'a, Block> { } } -impl, RA, PRA> GrandpaBlockImport where +impl, RA, PRA, SC> + GrandpaBlockImport +where NumberFor: grandpa::BlockNumberOps, B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, @@ -186,11 +187,11 @@ impl, RA, PRA> GrandpaBlockImport match api.has_api_with::, _>(&at, |v| v >= 2) { - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(true) => { // API version is high enough to support forced changes // but got error, so it is legitimate. - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()) + return Err(ConsensusError::ClientImport(e.to_string()).into()) }, Ok(false) => { // API version isn't high enough to support forced changes @@ -215,7 +216,7 @@ impl, RA, PRA> GrandpaBlockImport Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(Some(change)) => Ok(Some(PendingChange { next_authorities: change.next_authorities, delay: change.delay, @@ -300,12 +301,12 @@ impl, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport, RA, PRA> BlockImport - for GrandpaBlockImport where +impl, RA, PRA, SC> BlockImport + for GrandpaBlockImport where NumberFor: grandpa::BlockNumberOps, B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, @@ -399,7 +399,7 @@ impl, RA, PRA> BlockImport match self.inner.backend().blockchain().status(BlockId::Hash(hash)) { Ok(blockchain::BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), Ok(blockchain::BlockStatus::Unknown) => {}, - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), } let pending_changes = self.make_authorities_changes(&mut block, hash)?; @@ -420,7 +420,7 @@ impl, RA, PRA> BlockImport Err(e) => { debug!(target: "afg", "Restoring old authority set after block import error: {:?}", e); pending_changes.revert(); - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string()).into()); }, } }; @@ -509,16 +509,20 @@ impl, RA, PRA> BlockImport } } -impl, RA, PRA> GrandpaBlockImport { +impl, RA, PRA, SC> + GrandpaBlockImport +{ pub(crate) fn new( inner: Arc>, + select_chain: SC, authority_set: SharedAuthoritySet>, send_voter_commands: mpsc::UnboundedSender>>, consensus_changes: SharedConsensusChanges>, api: Arc, - ) -> GrandpaBlockImport { + ) -> GrandpaBlockImport { GrandpaBlockImport { inner, + select_chain, authority_set, send_voter_commands, consensus_changes, @@ -527,12 +531,13 @@ impl, RA, PRA> GrandpaBlockImport, RA, PRA> GrandpaBlockImport - where - NumberFor: grandpa::BlockNumberOps, - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, - RA: Send + Sync, +impl, RA, PRA, SC> + GrandpaBlockImport +where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, { /// Import a block justification and finalize the block. @@ -547,14 +552,14 @@ impl, RA, PRA> GrandpaBlockImport Result<(), ConsensusError> { let justification = GrandpaJustification::decode_and_verify_finalizes( - justification, + &justification, (hash, number), self.authority_set.set_id(), &self.authority_set.current_authorities(), ); let justification = match justification { - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(justification) => justification, }; @@ -574,17 +579,17 @@ impl, RA, PRA> GrandpaBlockImport { return Err(match e { - Error::Grandpa(error) => ConsensusErrorKind::ClientImport(error.to_string()), - Error::Network(error) => ConsensusErrorKind::ClientImport(error), - Error::Blockchain(error) => ConsensusErrorKind::ClientImport(error), - Error::Client(error) => ConsensusErrorKind::ClientImport(error.to_string()), - Error::Safety(error) => ConsensusErrorKind::ClientImport(error), - Error::Timer(error) => ConsensusErrorKind::ClientImport(error.to_string()), + Error::Grandpa(error) => ConsensusError::ClientImport(error.to_string()), + Error::Network(error) => ConsensusError::ClientImport(error), + Error::Blockchain(error) => ConsensusError::ClientImport(error), + Error::Client(error) => ConsensusError::ClientImport(error.to_string()), + Error::Safety(error) => ConsensusError::ClientImport(error), + Error::Timer(error) => ConsensusError::ClientImport(error.to_string()), }.into()); }, Ok(_) => { diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index 57ea3a344cd80c58b2c8a4eb06b844da2336d207..f16824f9246805bce45edbd124a0b0d7a8295adf 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -19,7 +19,7 @@ use std::collections::{HashMap, HashSet}; use client::{CallExecutor, Client}; use client::backend::Backend; use client::blockchain::HeaderBackend; -use client::error::{Error as ClientError, ErrorKind as ClientErrorKind}; +use client::error::Error as ClientError; use parity_codec::{Encode, Decode}; use grandpa::voter_set::VoterSet; use grandpa::{Error as GrandpaError}; @@ -64,7 +64,7 @@ impl> GrandpaJustification { let error = || { let msg = "invalid precommits for target commit".to_string(); - Err(Error::Client(ClientErrorKind::BadJustification(msg).into())) + Err(Error::Client(ClientError::BadJustification(msg))) }; for signed in commit.precommits.iter() { @@ -95,21 +95,20 @@ impl> GrandpaJustification { /// Decode a GRANDPA justification and validate the commit and the votes' /// ancestry proofs finalize the given block. pub(crate) fn decode_and_verify_finalizes( - encoded: Vec, + encoded: &[u8], finalized_target: (Block::Hash, NumberFor), set_id: u64, voters: &VoterSet, ) -> Result, ClientError> where NumberFor: grandpa::BlockNumberOps, { - let justification = GrandpaJustification::::decode(&mut &*encoded).ok_or_else(|| { - let msg = "failed to decode grandpa justification".to_string(); - ClientError::from(ClientErrorKind::BadJustification(msg)) - })?; + + let justification = GrandpaJustification::::decode(&mut &*encoded) + .ok_or(ClientError::JustificationDecode)?; if (justification.commit.target_hash, justification.commit.target_number) != finalized_target { let msg = "invalid commit target in grandpa justification".to_string(); - Err(ClientErrorKind::BadJustification(msg).into()) + Err(ClientError::BadJustification(msg)) } else { justification.verify(set_id, voters).map(|_| justification) } @@ -132,7 +131,7 @@ impl> GrandpaJustification { Ok(ref result) if result.ghost().is_some() => {}, _ => { let msg = "invalid commit in grandpa justification".to_string(); - return Err(ClientErrorKind::BadJustification(msg).into()); + return Err(ClientError::BadJustification(msg)); } } @@ -145,7 +144,7 @@ impl> GrandpaJustification { self.round, set_id, ) { - return Err(ClientErrorKind::BadJustification( + return Err(ClientError::BadJustification( "invalid signature for precommit in grandpa justification".to_string()).into()); } @@ -162,7 +161,7 @@ impl> GrandpaJustification { } }, _ => { - return Err(ClientErrorKind::BadJustification( + return Err(ClientError::BadJustification( "invalid precommit ancestry proof in grandpa justification".to_string()).into()); }, } @@ -174,7 +173,7 @@ impl> GrandpaJustification { .collect(); if visited_hashes != ancestry_hashes { - return Err(ClientErrorKind::BadJustification( + return Err(ClientError::BadJustification( "invalid precommit ancestries in grandpa justification with unused headers".to_string()).into()); } diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index b42c329d15693a85d582cbfd5a29c827fe724e66..75aa4d85ce9fdb707a5561acada2d7799b35fe75 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -51,6 +51,8 @@ //! number (this is num(signal) + N). When finalizing a block, we either apply //! or prune any signaled changes based on whether the signaling block is //! included in the newly-finalized chain. +#![forbid(warnings)] +#![allow(deprecated)] // FIXME #2532: remove once the refactor is done https://github.com/paritytech/substrate/issues/2532 use futures::prelude::*; use log::{debug, info, warn}; @@ -62,13 +64,15 @@ use client::{ use client::blockchain::HeaderBackend; use parity_codec::Encode; use runtime_primitives::traits::{ - NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, DigestItemFor, DigestItem, + NumberFor, Block as BlockT, DigestFor, ProvideRuntimeApi, }; use fg_primitives::GrandpaApi; use inherents::InherentDataProviders; use runtime_primitives::generic::BlockId; +use consensus_common::SelectChain; use substrate_primitives::{ed25519, H256, Pair, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG, CONSENSUS_WARN}; +use serde_json; use srml_finality_tracker; @@ -89,20 +93,25 @@ mod environment; mod finality_proof; mod import; mod justification; +mod light_import; +mod observer; mod until_imported; #[cfg(feature="service-integration")] mod service_integration; #[cfg(feature="service-integration")] -pub use service_integration::{LinkHalfForService, BlockImportForService}; +pub use service_integration::{LinkHalfForService, BlockImportForService, BlockImportForLightService}; pub use communication::Network; -pub use finality_proof::{prove_finality, check_finality_proof}; +pub use finality_proof::FinalityProofProvider; +pub use light_import::light_block_import; +pub use observer::run_grandpa_observer; use aux_schema::PersistentData; use environment::{CompletedRound, CompletedRounds, Environment, HasVoted, SharedVoterSetState, VoterSetState}; use import::GrandpaBlockImport; use until_imported::UntilCommitBlocksImported; use communication::NetworkBridge; +use service::TelemetryOnConnect; use ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; @@ -148,7 +157,7 @@ pub struct Config { /// Justification generation period (in blocks). GRANDPA will try to generate justifications /// at least every justification_period blocks. There are some other events which might cause /// justification generation. - pub justification_period: u64, + pub justification_period: u32, /// The local signing key. pub local_key: Option>, /// Some local identifier of the voter. @@ -281,24 +290,30 @@ impl fmt::Display for CommandOrError { } } -pub struct LinkHalf, RA> { +pub struct LinkHalf, RA, SC> { client: Arc>, + select_chain: SC, persistent_data: PersistentData, voter_commands_rx: mpsc::UnboundedReceiver>>, } /// Make block importer and link half necessary to tie the background voter /// to it. -pub fn block_import, RA, PRA>( +pub fn block_import, RA, PRA, SC>( client: Arc>, - api: Arc -) -> Result<(GrandpaBlockImport, LinkHalf), ClientError> - where - B: Backend + 'static, - E: CallExecutor + 'static + Clone + Send + Sync, - RA: Send + Sync, - PRA: ProvideRuntimeApi, - PRA::Api: GrandpaApi, + api: Arc, + select_chain: SC, +) -> Result<( + GrandpaBlockImport, + LinkHalf + ), ClientError> +where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, + SC: SelectChain, { use runtime_primitives::traits::Zero; @@ -324,6 +339,7 @@ pub fn block_import, RA, PRA>( Ok(( GrandpaBlockImport::new( client.clone(), + select_chain.clone(), persistent_data.authority_set.clone(), voter_commands_tx, persistent_data.consensus_changes.clone(), @@ -331,48 +347,14 @@ pub fn block_import, RA, PRA>( ), LinkHalf { client, + select_chain, persistent_data, voter_commands_rx, }, )) } -fn global_communication, I, O>( - commits_in: I, - commits_out: O, -) -> ( - impl Stream< - Item = voter::CommunicationIn, AuthoritySignature, AuthorityId>, - Error = CommandOrError>, - >, - impl Sink< - SinkItem = voter::CommunicationOut, AuthoritySignature, AuthorityId>, - SinkError = CommandOrError>, - >, -) where - I: Stream< - Item = (u64, ::grandpa::CompactCommit, AuthoritySignature, AuthorityId>), - Error = CommandOrError>, - >, - O: Sink< - SinkItem = (u64, ::grandpa::Commit, AuthoritySignature, AuthorityId>), - SinkError = CommandOrError>, - >, -{ - let global_in = commits_in.map(|(round, commit)| { - voter::CommunicationIn::Commit(round, commit, voter::Callback::Blank) - }); - - // NOTE: eventually this will also handle catch-up requests - let global_out = commits_out.with(|global| match global { - voter::CommunicationOut::Commit(round, commit) => Ok((round, commit)), - _ => unimplemented!(), - }); - - (global_in, global_out) -} - -fn committer_communication, B, E, N, RA>( +fn global_communication, B, E, N, RA>( local_key: Option<&Arc>, set_id: u64, voters: &Arc>, @@ -380,11 +362,11 @@ fn committer_communication, B, E, N, RA>( network: &NetworkBridge, ) -> ( impl Stream< - Item = (u64, ::grandpa::CompactCommit, AuthoritySignature, AuthorityId>), + Item = voter::CommunicationIn, AuthoritySignature, AuthorityId>, Error = CommandOrError>, >, impl Sink< - SinkItem = (u64, ::grandpa::Commit, AuthoritySignature, AuthorityId>), + SinkItem = voter::CommunicationOut, AuthoritySignature, AuthorityId>, SinkError = CommandOrError>, >, ) where @@ -393,8 +375,8 @@ fn committer_communication, B, E, N, RA>( N: Network, RA: Send + Sync, NumberFor: BlockNumberOps, - DigestItemFor: DigestItem, { + let is_voter = local_key .map(|pair| voters.contains_key(&pair.public().into())) .unwrap_or(false); @@ -413,10 +395,26 @@ fn committer_communication, B, E, N, RA>( commit_in, ); - let commit_in = commit_in.map_err(Into::into); - let commit_out = commit_out.sink_map_err(Into::into); + let commits_in = commit_in.map_err(CommandOrError::from); + let commits_out = commit_out.sink_map_err(CommandOrError::from); + + let global_in = commits_in.map(|(round, commit, mut callback)| { + let callback = voter::Callback::Work(Box::new(move |outcome| match outcome { + voter::CommitProcessingOutcome::Good(_) => + callback(communication::CommitProcessingOutcome::Good), + voter::CommitProcessingOutcome::Bad(_) => + callback(communication::CommitProcessingOutcome::Bad), + })); + voter::CommunicationIn::Commit(round, commit, callback) + }); + + // NOTE: eventually this will also handle catch-up requests + let global_out = commits_out.with(|global| match global { + voter::CommunicationOut::Commit(round, commit) => Ok((round, commit)), + _ => unimplemented!(), + }); - (commit_in, commit_out) + (global_in, global_out) } /// Register the finality tracker inherent data provider (which is used by @@ -443,37 +441,60 @@ fn register_finality_tracker_inherent_data_provider, N, RA, SC, X> { + /// Configuration for the GRANDPA service. + pub config: Config, + /// A link to the block import worker. + pub link: LinkHalf, + /// The Network instance. + pub network: N, + /// The inherent data providers. + pub inherent_data_providers: InherentDataProviders, + /// Handle to a future that will resolve on exit. + pub on_exit: X, + /// If supplied, can be used to hook on telemetry connection established events. + pub telemetry_on_connect: Option>, +} + /// Run a GRANDPA voter as a task. Provide configuration and a link to a /// block import worker that has already been instantiated with `block_import`. -pub fn run_grandpa, N, RA>( - config: Config, - link: LinkHalf, - network: N, - inherent_data_providers: InherentDataProviders, - on_exit: impl Future + Send + 'static, +pub fn run_grandpa_voter, N, RA, SC, X>( + grandpa_params: GrandpaParams, ) -> ::client::error::Result + Send + 'static> where Block::Hash: Ord, B: Backend + 'static, E: CallExecutor + Send + Sync + 'static, N: Network + Send + Sync + 'static, N::In: Send + 'static, + SC: SelectChain + 'static, NumberFor: BlockNumberOps, DigestFor: Encode, - DigestItemFor: DigestItem, RA: Send + Sync + 'static, + X: Future + Clone + Send + 'static, { + let GrandpaParams { + config, + link, + network, + inherent_data_providers, + on_exit, + telemetry_on_connect, + } = grandpa_params; + use futures::future::{self, Loop as FutureLoop}; - let network = NetworkBridge::new(network, config.clone()); + let (network, network_startup) = NetworkBridge::new(network, config.clone(), on_exit.clone()); let LinkHalf { client, + select_chain, persistent_data, voter_commands_rx, } = link; @@ -481,10 +502,33 @@ pub fn run_grandpa, N, RA>( register_finality_tracker_inherent_data_provider(client.clone(), &inherent_data_providers)?; + if let Some(telemetry_on_connect) = telemetry_on_connect { + let authorities = authority_set.clone(); + let events = telemetry_on_connect.telemetry_connection_sinks + .for_each(move |_| { + telemetry!(CONSENSUS_INFO; "afg.authority_set"; + "authority_set_id" => ?authorities.set_id(), + "authorities" => { + let curr = authorities.current_authorities(); + let voters = curr.voters(); + let authorities: Vec = + voters.iter().map(|(id, _)| id.to_string()).collect(); + serde_json::to_string(&authorities) + .expect("authorities is always at least an empty vector; elements are always of type string") + } + ); + Ok(()) + }) + .then(|_| Ok(())); + let events = events.select(telemetry_on_connect.on_exit).then(|_| Ok(())); + telemetry_on_connect.executor.spawn(events); + } + let voters = authority_set.current_authorities(); let initial_environment = Arc::new(Environment { inner: client.clone(), config: config.clone(), + select_chain: select_chain.clone(), voters: Arc::new(voters), network: network.clone(), set_id: authority_set.set_id(), @@ -538,7 +582,7 @@ pub fn run_grandpa, N, RA>( chain_info.chain.finalized_number, ); - let (commit_in, commit_out) = committer_communication( + let global_comms = global_communication( config.local_key.as_ref(), env.set_id, &env.voters, @@ -546,11 +590,6 @@ pub fn run_grandpa, N, RA>( &network, ); - let global_comms = global_communication::( - commit_in, - commit_out, - ); - let voters = (*env.voters).clone(); let last_completed_round = completed_rounds.last(); @@ -576,6 +615,7 @@ pub fn run_grandpa, N, RA>( let client = client.clone(); let config = config.clone(); let network = network.clone(); + let select_chain = select_chain.clone(); let authority_set = authority_set.clone(); let consensus_changes = consensus_changes.clone(); @@ -607,10 +647,13 @@ pub fn run_grandpa, N, RA>( current_round: HasVoted::No, }; + aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; + let set_state: SharedVoterSetState<_> = set_state.into(); let env = Arc::new(Environment { inner: client, + select_chain, config, voters: Arc::new(new.authorities.into_iter().collect()), set_id: new.set_id, @@ -673,5 +716,25 @@ pub fn run_grandpa, N, RA>( telemetry!(CONSENSUS_WARN; "afg.voter_failed"; "e" => ?e); }); + let voter_work = network_startup.and_then(move |()| voter_work); + Ok(voter_work.select(on_exit).then(|_| Ok(()))) } + +#[deprecated(since = "1.1", note = "Please switch to run_grandpa_voter.")] +pub fn run_grandpa, N, RA, SC, X>( + grandpa_params: GrandpaParams, +) -> ::client::error::Result + Send + 'static> where + Block::Hash: Ord, + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + N: Network + Send + Sync + 'static, + N::In: Send + 'static, + SC: SelectChain + 'static, + NumberFor: BlockNumberOps, + DigestFor: Encode, + RA: Send + Sync + 'static, + X: Future + Clone + Send + 'static, +{ + run_grandpa_voter(grandpa_params) +} diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs new file mode 100644 index 0000000000000000000000000000000000000000..10143154f9e3b493118b816cdf170580150855b4 --- /dev/null +++ b/core/finality-grandpa/src/light_import.rs @@ -0,0 +1,731 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use std::collections::HashMap; +use std::sync::Arc; +use log::{info, trace, warn}; +use parking_lot::RwLock; + +use client::{ + CallExecutor, Client, + backend::{AuxStore, Backend}, + blockchain::HeaderBackend, + error::Error as ClientError, +}; +use parity_codec::{Encode, Decode}; +use consensus_common::{ + import_queue::{Verifier, SharedFinalityProofRequestBuilder}, well_known_cache_keys, + BlockOrigin, BlockImport, FinalityProofImport, ImportBlock, ImportResult, ImportedAux, + Error as ConsensusError, FinalityProofRequestBuilder, +}; +use runtime_primitives::Justification; +use runtime_primitives::traits::{ + NumberFor, Block as BlockT, Header as HeaderT, ProvideRuntimeApi, DigestFor, +}; +use fg_primitives::GrandpaApi; +use runtime_primitives::generic::BlockId; +use substrate_primitives::{H256, Blake2Hasher, ed25519::Public as AuthorityId}; + +use crate::aux_schema::load_decode; +use crate::consensus_changes::ConsensusChanges; +use crate::environment::canonical_at_height; +use crate::finality_proof::{AuthoritySetForFinalityChecker, ProvableJustification, make_finality_proof_request}; +use crate::justification::GrandpaJustification; + +/// LightAuthoritySet is saved under this key in aux storage. +const LIGHT_AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; +/// ConsensusChanges is saver under this key in aux storage. +const LIGHT_CONSENSUS_CHANGES_KEY: &[u8] = b"grandpa_consensus_changes"; + +/// Create light block importer. +pub fn light_block_import, RA, PRA>( + client: Arc>, + authority_set_provider: Arc>, + api: Arc, +) -> Result, ClientError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, +{ + let info = client.info()?; + let import_data = load_aux_import_data(info.chain.finalized_hash, &**client.backend(), api)?; + Ok(GrandpaLightBlockImport { + client, + authority_set_provider, + data: Arc::new(RwLock::new(import_data)), + }) +} + +/// A light block-import handler for GRANDPA. +/// +/// It is responsible for: +/// - checking GRANDPA justifications; +/// - fetching finality proofs for blocks that are enacting consensus changes. +pub struct GrandpaLightBlockImport, RA> { + client: Arc>, + authority_set_provider: Arc>, + data: Arc>>, +} + +/// Mutable data of light block importer. +struct LightImportData> { + last_finalized: Block::Hash, + authority_set: LightAuthoritySet, + consensus_changes: ConsensusChanges>, +} + +/// Latest authority set tracker. +#[derive(Debug, Encode, Decode)] +struct LightAuthoritySet { + set_id: u64, + authorities: Vec<(AuthorityId, u64)>, +} + +impl, RA> GrandpaLightBlockImport { + /// Create finality proof request builder. + pub fn create_finality_proof_request_builder(&self) -> SharedFinalityProofRequestBuilder { + Arc::new(GrandpaFinalityProofRequestBuilder(self.data.clone())) as _ + } +} + +impl, RA> BlockImport + for GrandpaLightBlockImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, +{ + type Error = ConsensusError; + + fn import_block( + &self, + block: ImportBlock, + new_cache: HashMap>, + ) -> Result { + do_import_block::<_, _, _, _, GrandpaJustification>( + &*self.client, &mut *self.data.write(), block, new_cache + ) + } + + fn check_block( + &self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.client.check_block(hash, parent_hash) + } +} + +impl, RA> FinalityProofImport + for GrandpaLightBlockImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, +{ + type Error = ConsensusError; + + fn on_start(&self, link: &::consensus_common::import_queue::Link) { + let chain_info = match self.client.info() { + Ok(info) => info.chain, + _ => return, + }; + + let data = self.data.read(); + for (pending_number, pending_hash) in data.consensus_changes.pending_changes() { + if *pending_number > chain_info.finalized_number && *pending_number <= chain_info.best_number { + link.request_finality_proof(pending_hash, *pending_number); + } + } + } + + fn import_finality_proof( + &self, + hash: Block::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &Verifier, + ) -> Result<(Block::Hash, NumberFor), Self::Error> { + do_import_finality_proof::<_, _, _, _, GrandpaJustification>( + &*self.client, + &*self.authority_set_provider, + &mut *self.data.write(), + hash, + number, + finality_proof, + verifier, + ) + } +} + +impl LightAuthoritySet { + /// Get a genesis set with given authorities. + pub fn genesis(initial: Vec<(AuthorityId, u64)>) -> Self { + LightAuthoritySet { + set_id: 0, + authorities: initial, + } + } + + /// Get latest set id. + pub fn set_id(&self) -> u64 { + self.set_id + } + + /// Get latest authorities set. + pub fn authorities(&self) -> Vec<(AuthorityId, u64)> { + self.authorities.clone() + } + + /// Set new authorities set. + pub fn update(&mut self, set_id: u64, authorities: Vec<(AuthorityId, u64)>) { + self.set_id = set_id; + std::mem::replace(&mut self.authorities, authorities); + } +} + +struct GrandpaFinalityProofRequestBuilder>(Arc>>); + +impl> FinalityProofRequestBuilder for GrandpaFinalityProofRequestBuilder { + fn build_request_data(&self, _hash: &B::Hash) -> Vec { + let data = self.0.read(); + make_finality_proof_request( + data.last_finalized, + data.authority_set.set_id(), + ) + } +} + +/// Try to import new block. +fn do_import_block, RA, J>( + client: &Client, + data: &mut LightImportData, + mut block: ImportBlock, + new_cache: HashMap>, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, + DigestFor: Encode, + J: ProvableJustification, +{ + let hash = block.post_header().hash(); + let number = block.header.number().clone(); + + // we don't want to finalize on `inner.import_block` + let justification = block.justification.take(); + let enacts_consensus_change = !new_cache.is_empty(); + let import_result = client.import_block(block, new_cache); + + let mut imported_aux = match import_result { + Ok(ImportResult::Imported(aux)) => aux, + Ok(r) => return Ok(r), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), + }; + + match justification { + Some(justification) => { + trace!( + target: "finality", + "Imported block {}{}. Importing justification.", + if enacts_consensus_change { " which enacts consensus changes" } else { "" }, + hash, + ); + + do_import_justification::<_, _, _, _, J>(client, data, hash, number, justification) + }, + None if enacts_consensus_change => { + trace!( + target: "finality", + "Imported block {} which enacts consensus changes. Requesting finality proof.", + hash, + ); + + // remember that we need finality proof for this block + imported_aux.needs_finality_proof = true; + data.consensus_changes.note_change((number, hash)); + Ok(ImportResult::Imported(imported_aux)) + }, + None => Ok(ImportResult::Imported(imported_aux)), + } +} + +/// Try to import finality proof. +fn do_import_finality_proof, RA, J>( + client: &Client, + authority_set_provider: &AuthoritySetForFinalityChecker, + data: &mut LightImportData, + _hash: Block::Hash, + _number: NumberFor, + finality_proof: Vec, + verifier: &Verifier, +) -> Result<(Block::Hash, NumberFor), ConsensusError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + DigestFor: Encode, + NumberFor: grandpa::BlockNumberOps, + J: ProvableJustification, +{ + let authority_set_id = data.authority_set.set_id(); + let authorities = data.authority_set.authorities(); + let finality_effects = crate::finality_proof::check_finality_proof( + &*client.backend().blockchain(), + authority_set_id, + authorities, + authority_set_provider, + finality_proof, + ).map_err(|e| ConsensusError::ClientImport(e.to_string()))?; + + // try to import all new headers + let block_origin = BlockOrigin::NetworkBroadcast; + for header_to_import in finality_effects.headers_to_import { + let (block_to_import, new_authorities) = verifier.verify(block_origin, header_to_import, None, None) + .map_err(|e| ConsensusError::ClientImport(e))?; + assert!(block_to_import.justification.is_none(), "We have passed None as justification to verifier.verify"); + + let mut cache = HashMap::new(); + if let Some(authorities) = new_authorities { + cache.insert(well_known_cache_keys::AUTHORITIES, authorities.encode()); + } + do_import_block::<_, _, _, _, J>(client, data, block_to_import, cache)?; + } + + // try to import latest justification + let finalized_block_hash = finality_effects.block; + let finalized_block_number = client.backend().blockchain() + .expect_block_number_from_id(&BlockId::Hash(finality_effects.block)) + .map_err(|e| ConsensusError::ClientImport(e.to_string()))?; + do_finalize_block( + client, + data, + finalized_block_hash, + finalized_block_number, + finality_effects.justification.encode(), + )?; + + // apply new authorities set + data.authority_set.update( + finality_effects.new_set_id, + finality_effects.new_authorities, + ); + + Ok((finalized_block_hash, finalized_block_number)) +} + +/// Try to import justification. +fn do_import_justification, RA, J>( + client: &Client, + data: &mut LightImportData, + hash: Block::Hash, + number: NumberFor, + justification: Justification, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, + J: ProvableJustification, +{ + // with justification, we have two cases + // + // optimistic: the same GRANDPA authorities set has generated intermediate justification + // => justification is verified using current authorities set + we could proceed further + // + // pessimistic scenario: the GRANDPA authorities set has changed + // => we need to fetch new authorities set (i.e. finality proof) from remote node + + // first, try to behave optimistically + let authority_set_id = data.authority_set.set_id(); + let justification = J::decode_and_verify( + &justification, + authority_set_id, + &data.authority_set.authorities(), + ); + + // BadJustification error means that justification has been successfully decoded, but + // it isn't valid within current authority set + let justification = match justification { + Err(ClientError::BadJustification(_)) => { + trace!( + target: "finality", + "Justification for {} is not valid within current authorities set. Requesting finality proof.", + hash, + ); + + let mut imported_aux = ImportedAux::default(); + imported_aux.needs_finality_proof = true; + return Ok(ImportResult::Imported(imported_aux)); + }, + Err(e) => { + trace!( + target: "finality", + "Justification for {} is not valid. Bailing.", + hash, + ); + + return Err(ConsensusError::ClientImport(e.to_string()).into()); + }, + Ok(justification) => { + trace!( + target: "finality", + "Justification for {} is valid. Finalizing the block.", + hash, + ); + + justification + }, + }; + + // finalize the block + do_finalize_block(client, data, hash, number, justification.encode()) +} + +/// Finalize the block. +fn do_finalize_block, RA>( + client: &Client, + data: &mut LightImportData, + hash: Block::Hash, + number: NumberFor, + justification: Justification, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, +{ + // finalize the block + client.finalize_block(BlockId::Hash(hash), Some(justification), true).map_err(|e| { + warn!(target: "finality", "Error applying finality to block {:?}: {:?}", (hash, number), e); + ConsensusError::ClientImport(e.to_string()) + })?; + + // forget obsoleted consensus changes + let consensus_finalization_res = data.consensus_changes + .finalize((number, hash), |at_height| canonical_at_height(&client, (hash, number), true, at_height)); + match consensus_finalization_res { + Ok((true, _)) => require_insert_aux( + &client, + LIGHT_CONSENSUS_CHANGES_KEY, + &data.consensus_changes, + "consensus changes", + )?, + Ok(_) => (), + Err(error) => return Err(on_post_finalization_error(error, "consensus changes")), + } + + // update last finalized block reference + data.last_finalized = hash; + + Ok(ImportResult::imported()) +} + +/// Load light import aux data from the store. +fn load_aux_import_data, PRA>( + last_finalized: Block::Hash, + aux_store: &B, + api: Arc, +) -> Result, ClientError> + where + B: AuxStore, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, +{ + use runtime_primitives::traits::Zero; + let authority_set = match load_decode(aux_store, LIGHT_AUTHORITY_SET_KEY)? { + Some(authority_set) => authority_set, + None => { + info!(target: "afg", "Loading GRANDPA authorities \ + from genesis on what appears to be first startup."); + + // no authority set on disk: fetch authorities from genesis state + let genesis_authorities = api.runtime_api().grandpa_authorities(&BlockId::number(Zero::zero()))?; + + let authority_set = LightAuthoritySet::genesis(genesis_authorities); + let encoded = authority_set.encode(); + aux_store.insert_aux(&[(LIGHT_AUTHORITY_SET_KEY, &encoded[..])], &[])?; + + authority_set + }, + }; + + let consensus_changes = match load_decode(aux_store, LIGHT_CONSENSUS_CHANGES_KEY)? { + Some(consensus_changes) => consensus_changes, + None => { + let consensus_changes = ConsensusChanges::>::empty(); + + let encoded = authority_set.encode(); + aux_store.insert_aux(&[(LIGHT_CONSENSUS_CHANGES_KEY, &encoded[..])], &[])?; + + consensus_changes + }, + }; + + Ok(LightImportData { + last_finalized, + authority_set, + consensus_changes, + }) +} + +/// Insert into aux store. If failed, return error && show inconsistency warning. +fn require_insert_aux, RA>( + client: &Client, + key: &[u8], + value: &T, + value_type: &str, +) -> Result<(), ConsensusError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, +{ + let backend = &**client.backend(); + let encoded = value.encode(); + let update_res = Backend::insert_aux(backend, &[(key, &encoded[..])], &[]); + if let Err(error) = update_res { + return Err(on_post_finalization_error(error, value_type)); + } + + Ok(()) +} + +/// Display inconsistency warning. +fn on_post_finalization_error(error: ClientError, value_type: &str) -> ConsensusError { + warn!(target: "finality", "Failed to write updated {} to disk. Bailing.", value_type); + warn!(target: "finality", "Node is in a potentially inconsistent state."); + ConsensusError::ClientImport(error.to_string()) +} + +#[cfg(test)] +pub mod tests { + use super::*; + use consensus_common::ForkChoiceStrategy; + use substrate_primitives::H256; + use test_client::client::in_mem::Blockchain as InMemoryAuxStore; + use test_client::runtime::{Block, Header}; + use crate::tests::TestApi; + use crate::finality_proof::tests::TestJustification; + + pub struct NoJustificationsImport, RA>( + pub GrandpaLightBlockImport + ); + + impl, RA> BlockImport + for NoJustificationsImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, + { + type Error = ConsensusError; + + fn import_block( + &self, + mut block: ImportBlock, + new_cache: HashMap>, + ) -> Result { + block.justification.take(); + self.0.import_block(block, new_cache) + } + + fn check_block( + &self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.0.check_block(hash, parent_hash) + } + } + + impl, RA> FinalityProofImport + for NoJustificationsImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, + { + type Error = ConsensusError; + + fn on_start(&self, link: &::consensus_common::import_queue::Link) { + self.0.on_start(link) + } + + fn import_finality_proof( + &self, + hash: Block::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &Verifier, + ) -> Result<(Block::Hash, NumberFor), Self::Error> { + self.0.import_finality_proof(hash, number, finality_proof, verifier) + } + } + + /// Creates light block import that ignores justifications that came outside of finality proofs. + pub fn light_block_import_without_justifications, RA, PRA>( + client: Arc>, + authority_set_provider: Arc>, + api: Arc, + ) -> Result, ClientError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, + { + light_block_import(client, authority_set_provider, api).map(NoJustificationsImport) + } + + fn import_block( + new_cache: HashMap>, + justification: Option, + ) -> ImportResult { + let client = test_client::new_light(); + let mut import_data = LightImportData { + last_finalized: Default::default(), + authority_set: LightAuthoritySet::genesis(vec![(AuthorityId([1; 32]), 1)]), + consensus_changes: ConsensusChanges::empty(), + }; + let block = ImportBlock { + origin: BlockOrigin::Own, + header: Header { + number: 1, + parent_hash: client.info().unwrap().chain.best_hash, + state_root: Default::default(), + digest: Default::default(), + extrinsics_root: Default::default(), + }, + justification, + post_digests: Vec::new(), + body: None, + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + do_import_block::<_, _, _, _, TestJustification>( + &client, + &mut import_data, + block, + new_cache, + ).unwrap() + } + + #[test] + fn finality_proof_not_required_when_consensus_data_does_not_changes_and_no_justification_provided() { + assert_eq!(import_block(HashMap::new(), None), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + })); + } + + #[test] + fn finality_proof_not_required_when_consensus_data_does_not_changes_and_correct_justification_provided() { + let justification = TestJustification(true, Vec::new()).encode(); + assert_eq!(import_block(HashMap::new(), Some(justification)), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + })); + } + + #[test] + fn finality_proof_required_when_consensus_data_changes_and_no_justification_provided() { + let mut cache = HashMap::new(); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId([2; 32])].encode()); + assert_eq!(import_block(cache, None), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: true, + })); + } + + #[test] + fn finality_proof_required_when_consensus_data_changes_and_incorrect_justification_provided() { + let justification = TestJustification(false, Vec::new()).encode(); + let mut cache = HashMap::new(); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId([2; 32])].encode()); + assert_eq!( + import_block(cache, Some(justification)), + ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: true, + }, + )); + } + + + #[test] + fn aux_data_updated_on_start() { + let aux_store = InMemoryAuxStore::::new(); + let api = Arc::new(TestApi::new(vec![(AuthorityId([1; 32]), 1)])); + + // when aux store is empty initially + assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_none()); + assert!(aux_store.get_aux(LIGHT_CONSENSUS_CHANGES_KEY).unwrap().is_none()); + + // it is updated on importer start + load_aux_import_data(Default::default(), &aux_store, api).unwrap(); + assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_some()); + assert!(aux_store.get_aux(LIGHT_CONSENSUS_CHANGES_KEY).unwrap().is_some()); + } + + #[test] + fn aux_data_loaded_on_restart() { + let aux_store = InMemoryAuxStore::::new(); + let api = Arc::new(TestApi::new(vec![(AuthorityId([1; 32]), 1)])); + + // when aux store is non-empty initially + let mut consensus_changes = ConsensusChanges::::empty(); + consensus_changes.note_change((42, Default::default())); + aux_store.insert_aux( + &[ + ( + LIGHT_AUTHORITY_SET_KEY, + LightAuthoritySet::genesis(vec![(AuthorityId([42; 32]), 2)]).encode().as_slice(), + ), + ( + LIGHT_CONSENSUS_CHANGES_KEY, + consensus_changes.encode().as_slice(), + ), + ], + &[], + ).unwrap(); + + // importer uses it on start + let data = load_aux_import_data(Default::default(), &aux_store, api).unwrap(); + assert_eq!(data.authority_set.authorities(), vec![(AuthorityId([42; 32]), 2)]); + assert_eq!(data.consensus_changes.pending_changes(), &[(42, Default::default())]); + } +} diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs new file mode 100644 index 0000000000000000000000000000000000000000..f6d657e1ff1f8676234c474814c250eadc564bd0 --- /dev/null +++ b/core/finality-grandpa/src/observer.rs @@ -0,0 +1,282 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use std::sync::Arc; + +use futures::prelude::*; +use futures::future::{self, Loop as FutureLoop}; + +use grandpa::{ + BlockNumberOps, Error as GrandpaError, round::State as RoundState, voter, voter_set::VoterSet +}; +use log::{debug, info, warn}; + +use consensus_common::SelectChain; +use client::{CallExecutor, Client, backend::Backend}; +use runtime_primitives::traits::{NumberFor, Block as BlockT}; +use substrate_primitives::{ed25519::Public as AuthorityId, H256, Blake2Hasher}; + +use crate::{ + AuthoritySignature, global_communication, CommandOrError, Config, environment, + Error, LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, +}; +use crate::authorities::SharedAuthoritySet; +use crate::communication::NetworkBridge; +use crate::consensus_changes::SharedConsensusChanges; +use crate::environment::{CompletedRound, CompletedRounds, HasVoted}; + +struct ObserverChain<'a, Block: BlockT, B, E, RA>(&'a Client); + +impl<'a, Block: BlockT, B, E, RA> grandpa::Chain> + for ObserverChain<'a, Block, B, E, RA> where + B: Backend, + E: CallExecutor, + NumberFor: BlockNumberOps, +{ + fn ancestry(&self, base: Block::Hash, block: Block::Hash) -> Result, GrandpaError> { + environment::ancestry(&self.0, base, block) + } + + fn best_chain_containing(&self, _block: Block::Hash) -> Option<(Block::Hash, NumberFor)> { + // only used by voter + None + } +} + +fn grandpa_observer, RA, S>( + client: &Arc>, + authority_set: &SharedAuthoritySet>, + consensus_changes: &SharedConsensusChanges>, + voters: &Arc>, + last_finalized_number: NumberFor, + commits: S, +) -> impl Future>> where + NumberFor: BlockNumberOps, + B: Backend, + E: CallExecutor + Send + Sync, + RA: Send + Sync, + S: Stream< + Item = voter::CommunicationIn, AuthoritySignature, AuthorityId>, + Error = CommandOrError>, + >, +{ + let authority_set = authority_set.clone(); + let consensus_changes = consensus_changes.clone(); + let client = client.clone(); + let voters = voters.clone(); + + let observer = commits.fold(last_finalized_number, move |last_finalized_number, global| { + let (round, commit, callback) = match global { + voter::CommunicationIn::Commit(round, commit, callback) => { + let commit = grandpa::Commit::from(commit); + (round, commit, callback) + }, + voter::CommunicationIn::Auxiliary(_) => { + // ignore aux messages + return future::ok(last_finalized_number); + }, + }; + + // if the commit we've received targets a block lower or equal to the last + // finalized, ignore it and continue with the current state + if commit.target_number <= last_finalized_number { + return future::ok(last_finalized_number); + } + + let validation_result = match grandpa::validate_commit( + &commit, + &voters, + &ObserverChain(&*client), + ) { + Ok(r) => r, + Err(e) => return future::err(e.into()), + }; + + if let Some(_) = validation_result.ghost() { + let finalized_hash = commit.target_hash; + let finalized_number = commit.target_number; + + // commit is valid, finalize the block it targets + match environment::finalize_block( + &client, + &authority_set, + &consensus_changes, + None, + finalized_hash, + finalized_number, + (round, commit).into(), + ) { + Ok(_) => {}, + Err(e) => return future::err(e), + }; + + grandpa::process_commit_validation_result(validation_result, callback); + + // proceed processing with new finalized block number + future::ok(finalized_number) + } else { + debug!(target: "afg", "Received invalid commit: ({:?}, {:?})", round, commit); + + grandpa::process_commit_validation_result(validation_result, callback); + + // commit is invalid, continue processing commits with the current state + future::ok(last_finalized_number) + } + }); + + observer.map(|_| ()) +} + +/// Run a GRANDPA observer as a task, the observer will finalize blocks only by +/// listening for and validating GRANDPA commits instead of following the full +/// protocol. Provide configuration and a link to a block import worker that has +/// already been instantiated with `block_import`. +pub fn run_grandpa_observer, N, RA, SC>( + config: Config, + link: LinkHalf, + network: N, + on_exit: impl Future + Clone + Send + 'static, +) -> ::client::error::Result + Send + 'static> where + B: Backend + 'static, + E: CallExecutor + Send + Sync + 'static, + N: Network + Send + Sync + 'static, + N::In: Send + 'static, + SC: SelectChain + 'static, + NumberFor: BlockNumberOps, + RA: Send + Sync + 'static, +{ + let LinkHalf { + client, + select_chain: _, + persistent_data, + voter_commands_rx, + } = link; + + let PersistentData { authority_set, consensus_changes, set_state } = persistent_data; + let initial_state = (authority_set, consensus_changes, set_state, voter_commands_rx.into_future()); + + let (network, network_startup) = NetworkBridge::new(network, config.clone(), on_exit.clone()); + + let observer_work = future::loop_fn(initial_state, move |state| { + let (authority_set, consensus_changes, set_state, voter_commands_rx) = state; + let set_id = authority_set.set_id(); + let voters = Arc::new(authority_set.current_authorities()); + let client = client.clone(); + + // start global communication stream for the current set + let (global_in, _) = global_communication( + None, + set_id, + &voters, + &client, + &network, + ); + + let chain_info = match client.info() { + Ok(i) => i, + Err(e) => return future::Either::B(future::err(Error::Client(e))), + }; + + let last_finalized_number = chain_info.chain.finalized_number; + + // create observer for the current set + let observer = grandpa_observer( + &client, + &authority_set, + &consensus_changes, + &voters, + last_finalized_number, + global_in, + ); + + let handle_voter_command = move |command, voter_commands_rx| { + // the observer doesn't use the voter set state, but we need to + // update it on-disk in case we restart as validator in the future. + let set_state = match command { + VoterCommand::Pause(reason) => { + info!(target: "afg", "Pausing old validator set: {}", reason); + + let completed_rounds = set_state.read().completed_rounds(); + let set_state = VoterSetState::Paused { completed_rounds }; + + crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; + + set_state + }, + VoterCommand::ChangeAuthorities(new) => { + // start the new authority set using the block where the + // set changed (not where the signal happened!) as the base. + let genesis_state = RoundState::genesis((new.canon_hash, new.canon_number)); + + let set_state = VoterSetState::Live:: { + // always start at round 0 when changing sets. + completed_rounds: CompletedRounds::new(CompletedRound { + number: 0, + state: genesis_state, + base: (new.canon_hash, new.canon_number), + votes: Vec::new(), + }), + current_round: HasVoted::No, + }; + + crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; + + set_state + }, + }; + + Ok(FutureLoop::Continue((authority_set, consensus_changes, set_state.into(), voter_commands_rx))) + }; + + // run observer and listen to commands (switch authorities or pause) + future::Either::A(observer.select2(voter_commands_rx).then(move |res| match res { + Ok(future::Either::A((_, _))) => { + // observer commit stream doesn't conclude naturally; this could reasonably be an error. + Ok(FutureLoop::Break(())) + }, + Err(future::Either::B(_)) => { + // the `voter_commands_rx` stream should not fail. + Ok(FutureLoop::Break(())) + }, + Ok(future::Either::B(((None, _), _))) => { + // the `voter_commands_rx` stream should never conclude since it's never closed. + Ok(FutureLoop::Break(())) + }, + Err(future::Either::A((CommandOrError::Error(e), _))) => { + // return inner observer error + Err(e) + }, + Ok(future::Either::B(((Some(command), voter_commands_rx), _))) => { + // some command issued externally + handle_voter_command(command, voter_commands_rx.into_future()) + }, + Err(future::Either::A((CommandOrError::VoterCommand(command), voter_commands_rx))) => { + // some command issued internally + handle_voter_command(command, voter_commands_rx) + }, + })) + }); + + let observer_work = observer_work + .map(|_| ()) + .map_err(|e| { + warn!("GRANDPA Observer failed: {:?}", e); + }); + + let observer_work = network_startup.and_then(move |()| observer_work); + + Ok(observer_work.select(on_exit).map(|_| ()).map_err(|_| ())) +} diff --git a/core/finality-grandpa/src/service_integration.rs b/core/finality-grandpa/src/service_integration.rs index 3eee1dd9408d490f7275532fff3a8ea27ac7b73d..9f19b9204190bdcc16f3766db3c20a400ed40331 100644 --- a/core/finality-grandpa/src/service_integration.rs +++ b/core/finality-grandpa/src/service_integration.rs @@ -17,7 +17,7 @@ /// Integrate grandpa finality with substrate service use client; -use service::{FullBackend, FullExecutor, ServiceFactory}; +use service::{FullBackend, FullExecutor, LightBackend, LightExecutor, ServiceFactory}; pub type BlockImportForService = crate::GrandpaBlockImport< FullBackend, @@ -25,16 +25,25 @@ pub type BlockImportForService = crate::GrandpaBlockImport< ::Block, ::RuntimeApi, client::Client< - FullBackend, - FullExecutor, - ::Block, - ::RuntimeApi - >, + FullBackend, + FullExecutor, + ::Block, + ::RuntimeApi + >, + ::SelectChain, >; pub type LinkHalfForService = crate::LinkHalf< FullBackend, FullExecutor, ::Block, - ::RuntimeApi + ::RuntimeApi, + ::SelectChain +>; + +pub type BlockImportForLightService = crate::light_import::GrandpaLightBlockImport< + LightBackend, + LightExecutor, + ::Block, + ::RuntimeApi, >; diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index b4a5d40bf99160e5405d4b879d52da567d2701ea..622eb7d4700f84df53eafc3b8aa1f4cbb6047370 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -23,22 +23,26 @@ use network::config::{ProtocolConfig, Roles}; use network::consensus_gossip as network_gossip; use parking_lot::Mutex; use tokio::runtime::current_thread; -use keyring::AuthorityKeyring; +use keyring::ed25519::{Keyring as AuthorityKeyring}; use client::{ - BlockchainEvents, error::Result, - blockchain::Backend as BlockchainBackend, + error::Result, runtime_api::{Core, RuntimeVersion, ApiExt}, + LongestChain, }; use test_client::{self, runtime::BlockNumber}; use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult}; -use consensus_common::import_queue::{SharedBlockImport, SharedJustificationImport}; +use consensus_common::import_queue::{SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, +}; use std::collections::{HashMap, HashSet}; use std::result; +use parity_codec::Decode; use runtime_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; use runtime_primitives::generic::BlockId; -use substrate_primitives::{NativeOrEncoded, ExecutionContext}; +use substrate_primitives::{NativeOrEncoded, ExecutionContext, ed25519::Public as AuthorityId}; use authorities::AuthoritySet; +use finality_proof::{FinalityProofProvider, AuthoritySetForFinalityProver, AuthoritySetForFinalityChecker}; use communication::GRANDPA_ENGINE_ID; use consensus_changes::ConsensusChanges; @@ -50,6 +54,7 @@ type PeerData = test_client::Executor, Block, test_client::runtime::RuntimeApi, + LongestChain > > >; @@ -70,7 +75,7 @@ impl GrandpaTestNet { }; let config = Self::default_config(); for _ in 0..n_peers { - net.add_peer(&config); + net.add_full_peer(&config); } net } @@ -97,21 +102,65 @@ impl TestNetFactory for GrandpaTestNet { } } - fn make_verifier(&self, _client: Arc, _cfg: &ProtocolConfig) + fn make_verifier(&self, _client: PeersClient, _cfg: &ProtocolConfig) -> Arc { Arc::new(PassThroughVerifier(false)) // use non-instant finality. } - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + PeerData, + ) { - let (import, link) = block_import( - client, - Arc::new(self.test_config.clone()) - ).expect("Could not create block import for fresh peer."); - let shared_import = Arc::new(import); - (shared_import.clone(), Some(shared_import), Mutex::new(Some(link))) + match client { + PeersClient::Full(ref client) => { + let select_chain = LongestChain::new( + client.backend().clone(), + client.import_lock().clone() + ); + let (import, link) = block_import( + client.clone(), + Arc::new(self.test_config.clone()), + select_chain, + ).expect("Could not create block import for fresh peer."); + let shared_import = Arc::new(import); + (shared_import.clone(), Some(shared_import), None, None, Mutex::new(Some(link))) + }, + PeersClient::Light(ref client) => { + use crate::light_import::tests::light_block_import_without_justifications; + + let authorities_provider = Arc::new(self.test_config.clone()); + // forbid direct finalization using justification that cames with the block + // => light clients will try to fetch finality proofs + let import = light_block_import_without_justifications( + client.clone(), + authorities_provider, + Arc::new(self.test_config.clone()) + ).expect("Could not create block import for fresh peer."); + let finality_proof_req_builder = import.0.create_finality_proof_request_builder(); + let shared_import = Arc::new(import); + (shared_import.clone(), None, Some(shared_import), Some(finality_proof_req_builder), Mutex::new(None)) + }, + } + } + + fn make_finality_proof_provider(&self, client: PeersClient) -> Option>> { + match client { + PeersClient::Full(ref client) => { + let authorities_provider = Arc::new(self.test_config.clone()); + Some(Arc::new(FinalityProofProvider::new(client.clone(), authorities_provider))) + }, + PeersClient::Light(_) => None, + } + } + + fn uses_tokio(&self) -> bool { + true } fn peer(&self, i: usize) -> &GrandpaPeer { @@ -204,20 +253,36 @@ impl Network for MessageRouting { }) } + fn report(&self, _who: network::PeerId, _cost_benefit: i32) { + + } + fn announce(&self, _block: Hash) { } } +#[derive(Clone)] +struct Exit; + +impl Future for Exit { + type Item = (); + type Error = (); + + fn poll(&mut self) -> Poll<(), ()> { + Ok(Async::NotReady) + } +} + #[derive(Default, Clone)] -struct TestApi { +pub(crate) struct TestApi { genesis_authorities: Vec<(AuthorityId, u64)>, scheduled_changes: Arc>>>, forced_changes: Arc)>>>, } impl TestApi { - fn new(genesis_authorities: Vec<(AuthorityId, u64)>) -> Self { + pub fn new(genesis_authorities: Vec<(AuthorityId, u64)>) -> Self { TestApi { genesis_authorities, scheduled_changes: Arc::new(Mutex::new(HashMap::new())), @@ -226,7 +291,7 @@ impl TestApi { } } -struct RuntimeApi { +pub(crate) struct RuntimeApi { inner: TestApi, } @@ -274,7 +339,7 @@ impl Core for RuntimeApi { _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { + ) -> Result>> { unimplemented!("Not required for testing!") } } @@ -290,21 +355,25 @@ impl ApiExt for RuntimeApi { fn runtime_version_at(&self, _: &BlockId) -> Result { unimplemented!("Not required for testing!") } + + fn record_proof(&mut self) { + unimplemented!("Not required for testing!") + } + + fn extract_proof(&mut self) -> Option>> { + unimplemented!("Not required for testing!") + } } impl GrandpaApi for RuntimeApi { fn GrandpaApi_grandpa_authorities_runtime_api_impl( &self, - at: &BlockId, + _: &BlockId, _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { - if at == &BlockId::Number(0) { - Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) - } else { - panic!("should generally only request genesis authorities") - } + ) -> Result>> { + Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) } fn GrandpaApi_grandpa_pending_change_runtime_api_impl( @@ -343,10 +412,37 @@ impl GrandpaApi for RuntimeApi { } } +impl AuthoritySetForFinalityProver for TestApi { + fn authorities(&self, block: &BlockId) -> Result> { + let runtime_api = RuntimeApi { inner: self.clone() }; + runtime_api.GrandpaApi_grandpa_authorities_runtime_api_impl(block, ExecutionContext::Syncing, None, Vec::new()) + .map(|v| match v { + NativeOrEncoded::Native(value) => value, + _ => unreachable!("only providing native values"), + }) + } + + fn prove_authorities(&self, block: &BlockId) -> Result>> { + self.authorities(block).map(|auth| vec![auth.encode()]) + } +} + +impl AuthoritySetForFinalityChecker for TestApi { + fn check_authorities_proof( + &self, + _hash: ::Hash, + _header: ::Header, + proof: Vec>, + ) -> Result> { + Decode::decode(&mut &proof[0][..]) + .ok_or_else(|| unreachable!("incorrect value is passed as GRANDPA authorities proof")) + } +} + const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); -fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(AuthorityId, u64)> { +fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { keys.iter() .map(|key| AuthorityId(key.to_raw_public())) .map(|id| (id, 1)) @@ -355,19 +451,25 @@ fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(AuthorityId, u64)> { // run the voters to completion. provide a closure to be invoked after // the voters are spawned but before blocking on them. -fn run_to_completion_with( +fn run_to_completion_with( blocks: u64, net: Arc>, peers: &[AuthorityKeyring], - before_waiting: F, -) -> u64 { + with: F, +) -> u64 where + F: FnOnce(current_thread::Handle) -> Option>> +{ use parking_lot::RwLock; - let mut finality_notifications = Vec::new(); + let mut wait_for = Vec::new(); let mut runtime = current_thread::Runtime::new().unwrap(); let highest_finalized = Arc::new(RwLock::new(0)); + if let Some(f) = (with)(runtime.handle()) { + wait_for.push(f); + }; + for (peer_id, key) in peers.iter().enumerate() { let highest_finalized = highest_finalized.clone(); let (client, link) = { @@ -379,31 +481,38 @@ fn run_to_completion_with( link, ) }; - finality_notifications.push( - client.finality_notification_stream() - .take_while(move |n| { - let mut highest_finalized = highest_finalized.write(); - if *n.header.number() > *highest_finalized { - *highest_finalized = *n.header.number(); - } - Ok(n.header.number() < &blocks) - }) - .for_each(|_| Ok(())) + + wait_for.push( + Box::new( + client.finality_notification_stream() + .take_while(move |n| { + let mut highest_finalized = highest_finalized.write(); + if *n.header.number() > *highest_finalized { + *highest_finalized = *n.header.number(); + } + Ok(n.header.number() < &blocks) + }) + .collect() + .map(|_| ()) + ) ); + fn assert_send(_: &T) { } - let voter = run_grandpa( - Config { + let grandpa_params = GrandpaParams { + config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, local_key: Some(Arc::new(key.clone().into())), name: Some(format!("peer#{}", peer_id)), }, - link, - MessageRouting::new(net.clone(), peer_id), - InherentDataProviders::new(), - futures::empty(), - ).expect("all in order with client and network"); + link: link, + network: MessageRouting::new(net.clone(), peer_id), + inherent_data_providers: InherentDataProviders::new(), + on_exit: Exit, + telemetry_on_connect: None, + }; + let voter = run_grandpa_voter(grandpa_params).expect("all in order with client and network"); assert_send(&voter); @@ -411,7 +520,7 @@ fn run_to_completion_with( } // wait for all finalized on each. - let wait_for = ::futures::future::join_all(finality_notifications) + let wait_for = ::futures::future::join_all(wait_for) .map(|_| ()) .map_err(|_| ()); @@ -419,23 +528,20 @@ fn run_to_completion_with( .for_each(move |_| { net.lock().send_import_notifications(); net.lock().send_finality_notifications(); - net.lock().route_fast(); + net.lock().sync_without_disconnects(); Ok(()) }) .map(|_| ()) .map_err(|_| ()); - (before_waiting)(); - runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); let highest_finalized = *highest_finalized.read(); - highest_finalized } fn run_to_completion(blocks: u64, net: Arc>, peers: &[AuthorityKeyring]) -> u64 { - run_to_completion_with(blocks, net, peers, || {}) + run_to_completion_with(blocks, net, peers, |_| None) } #[test] @@ -457,12 +563,12 @@ fn finalize_3_voters_no_observers() { run_to_completion(20, net.clone(), peers); // normally there's no justification for finalized blocks - assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(20)).unwrap().is_none(), + assert!(net.lock().peer(0).client().justification(&BlockId::Number(20)).unwrap().is_none(), "Extra justification for block#1"); } #[test] -fn finalize_3_voters_1_observer() { +fn finalize_3_voters_1_full_observer() { let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; let voters = make_ids(peers); @@ -493,18 +599,21 @@ fn finalize_3_voters_1_observer() { .take_while(|n| Ok(n.header.number() < &20)) .for_each(move |_| Ok(())) ); - let voter = run_grandpa( - Config { + + let grandpa_params = GrandpaParams { + config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, local_key, name: Some(format!("peer#{}", peer_id)), }, - link, - MessageRouting::new(net.clone(), peer_id), - InherentDataProviders::new(), - futures::empty(), - ).expect("all in order with client and network"); + link: link, + network: MessageRouting::new(net.clone(), peer_id), + inherent_data_providers: InherentDataProviders::new(), + on_exit: Exit, + telemetry_on_connect: None, + }; + let voter = run_grandpa_voter(grandpa_params).expect("all in order with client and network"); runtime.spawn(voter); } @@ -515,7 +624,7 @@ fn finalize_3_voters_1_observer() { .map_err(|_| ()); let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) - .for_each(move |_| { net.lock().route_fast(); Ok(()) }) + .for_each(move |_| { net.lock().sync_without_disconnects(); Ok(()) }) .map(|_| ()) .map_err(|_| ()); @@ -523,7 +632,7 @@ fn finalize_3_voters_1_observer() { } #[test] -fn transition_3_voters_twice_1_observer() { +fn transition_3_voters_twice_1_full_observer() { let _ = env_logger::try_init(); let peers_a = &[ AuthorityKeyring::Alice, @@ -557,11 +666,12 @@ fn transition_3_voters_twice_1_observer() { net.lock().sync(); for (i, peer) in net.lock().peers().iter().enumerate() { - assert_eq!(peer.client().info().unwrap().chain.best_number, 1, + let full_client = peer.client().as_full().expect("only full clients are used in test"); + assert_eq!(full_client.info().unwrap().chain.best_number, 1, "Peer #{} failed to sync", i); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**peer.client().backend() + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (0, make_ids(peers_a).as_slice())); @@ -642,31 +752,35 @@ fn transition_3_voters_twice_1_observer() { link, ) }; + finality_notifications.push( client.finality_notification_stream() .take_while(|n| Ok(n.header.number() < &30)) .for_each(move |_| Ok(())) .map(move |()| { + let full_client = client.as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**client.backend() + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (2, make_ids(peers_c).as_slice())); assert_eq!(set.pending_changes().count(), 0); }) ); - let voter = run_grandpa( - Config { + let grandpa_params = GrandpaParams { + config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, local_key, name: Some(format!("peer#{}", peer_id)), }, - link, - MessageRouting::new(net.clone(), peer_id), - InherentDataProviders::new(), - futures::empty(), - ).expect("all in order with client and network"); + link: link, + network: MessageRouting::new(net.clone(), peer_id), + inherent_data_providers: InherentDataProviders::new(), + on_exit: Exit, + telemetry_on_connect: None, + }; + let voter = run_grandpa_voter(grandpa_params).expect("all in order with client and network"); runtime.spawn(voter); } @@ -680,7 +794,7 @@ fn transition_3_voters_twice_1_observer() { .for_each(move |_| { net.lock().send_import_notifications(); net.lock().send_finality_notifications(); - net.lock().route_fast(); + net.lock().sync_without_disconnects(); Ok(()) }) .map(|_| ()) @@ -695,14 +809,14 @@ fn justification_is_emitted_when_consensus_data_changes() { let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); // import block#1 WITH consensus data change - let new_authorities = vec![AuthorityId::from_raw([42; 32])]; + let new_authorities = vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]; net.peer(0).push_authorities_change_block(new_authorities); net.sync(); let net = Arc::new(Mutex::new(net)); run_to_completion(1, net.clone(), peers); - // ... and check that there's no justification for block#1 - assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(1)).unwrap().is_some(), + // ... and check that there's justification for block#1 + assert!(net.lock().peer(0).client().justification(&BlockId::Number(1)).unwrap().is_some(), "Missing justification for block#1"); } @@ -721,8 +835,7 @@ fn justification_is_generated_periodically() { // when block#32 (justification_period) is finalized, justification // is required => generated for i in 0..3 { - assert!(net.lock().peer(i).client().backend().blockchain() - .justification(BlockId::Number(32)).unwrap().is_some()); + assert!(net.lock().peer(i).client().justification(&BlockId::Number(32)).unwrap().is_some()); } } @@ -789,7 +902,7 @@ fn sync_justifications_on_change_blocks() { // the last peer should get the justification by syncing from other peers while net.lock().peer(3).client().justification(&BlockId::Number(21)).unwrap().is_none() { - net.lock().route_fast(); + net.lock().sync_without_disconnects(); } } @@ -890,7 +1003,7 @@ fn force_change_to_new_set() { let net = Arc::new(Mutex::new(net)); let runner_net = net.clone(); - let add_blocks = move || { + let add_blocks = move |_| { net.lock().peer(0).push_blocks(1, false); { @@ -915,13 +1028,16 @@ fn force_change_to_new_set() { assert_eq!(peer.client().info().unwrap().chain.best_number, 26, "Peer #{} failed to sync", i); + let full_client = peer.client().as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**peer.client().backend() + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (1, voters.as_slice())); assert_eq!(set.pending_changes().count(), 0); } + + None }; // it will only finalize if the forced transition happens. @@ -941,7 +1057,8 @@ fn allows_reimporting_change_blocks() { let client = net.peer(0).client().clone(); let (block_import, ..) = net.make_block_import(client.clone()); - let builder = client.new_block_at(&BlockId::Number(0)).unwrap(); + let full_client = client.as_full().unwrap(); + let builder = full_client.new_block_at(&BlockId::Number(0)).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -964,7 +1081,12 @@ fn allows_reimporting_change_blocks() { assert_eq!( block_import.import_block(block(), HashMap::new()).unwrap(), - ImportResult::Imported(ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: false }), + ImportResult::Imported(ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: false, + needs_finality_proof: false, + }), ); assert_eq!( @@ -984,7 +1106,8 @@ fn test_bad_justification() { let client = net.peer(0).client().clone(); let (block_import, ..) = net.make_block_import(client.clone()); - let builder = client.new_block_at(&BlockId::Number(0)).unwrap(); + let full_client = client.as_full().expect("only full clients are used in test"); + let builder = full_client.new_block_at(&BlockId::Number(0)).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -1007,7 +1130,12 @@ fn test_bad_justification() { assert_eq!( block_import.import_block(block(), HashMap::new()).unwrap(), - ImportResult::Imported(ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: true }), + ImportResult::Imported(ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: true, + ..Default::default() + }), ); assert_eq!( @@ -1052,21 +1180,23 @@ fn voter_persists_its_votes() { let net = net.clone(); let voter = future::loop_fn(voter_rx, move |rx| { - let (_block_import, _, link) = net.lock().make_block_import(client.clone()); + let (_block_import, _, _, _, link) = net.lock().make_block_import(client.clone()); let link = link.lock().take().unwrap(); - let mut voter = run_grandpa( - Config { + let grandpa_params = GrandpaParams { + config: Config { gossip_duration: TEST_GOSSIP_DURATION, justification_period: 32, local_key: Some(Arc::new(peers[0].clone().into())), name: Some(format!("peer#{}", 0)), }, - link, - MessageRouting::new(net.clone(), 0), - InherentDataProviders::new(), - futures::empty(), - ).expect("all in order with client and network"); + link: link, + network: MessageRouting::new(net.clone(), 0), + inherent_data_providers: InherentDataProviders::new(), + on_exit: Exit, + telemetry_on_connect: None, + }; + let mut voter = run_grandpa_voter(grandpa_params).expect("all in order with client and network"); let voter = future::poll_fn(move || { // we need to keep the block_import alive since it owns the @@ -1112,7 +1242,8 @@ fn voter_persists_its_votes() { name: Some(format!("peer#{}", 1)), }; let routing = MessageRouting::new(net.clone(), 1); - let network = communication::NetworkBridge::new(routing, config.clone()); + let (network, routing_work) = communication::NetworkBridge::new(routing, config.clone(), Exit); + runtime.block_on(routing_work).unwrap(); let (round_rx, round_tx) = network.round_communication( communication::Round(1), @@ -1148,7 +1279,7 @@ fn voter_persists_its_votes() { "Peer #{} failed to sync", 0); let block_30_hash = - net.lock().peer(0).client().backend().blockchain().hash(30).unwrap().unwrap(); + net.lock().peer(0).client().as_full().unwrap().backend().blockchain().hash(30).unwrap().unwrap(); // we restart alice's voter voter_tx.unbounded_send(()).unwrap(); @@ -1198,7 +1329,7 @@ fn voter_persists_its_votes() { .for_each(move |_| { net.lock().send_import_notifications(); net.lock().send_finality_notifications(); - net.lock().route_fast(); + net.lock().sync_without_disconnects(); Ok(()) }) .map(|_| ()) @@ -1208,3 +1339,135 @@ fn voter_persists_its_votes() { runtime.block_on(drive_to_completion.select(exit).map(|_| ()).map_err(|_| ())).unwrap(); } + +#[test] +fn finalize_3_voters_1_light_observer() { + let _ = env_logger::try_init(); + let authorities = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let voters = make_ids(authorities); + + let mut net = GrandpaTestNet::new(TestApi::new(voters), 4); + net.peer(0).push_blocks(20, false); + net.sync(); + + for i in 0..4 { + assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + "Peer #{} failed to sync", i); + } + + let net = Arc::new(Mutex::new(net)); + let link = net.lock().peer(3).data.lock().take().expect("link initialized on startup; qed"); + + let finality_notifications = net.lock().peer(3).client().finality_notification_stream() + .take_while(|n| Ok(n.header.number() < &20)) + .collect(); + + run_to_completion_with(20, net.clone(), authorities, |executor| { + executor.spawn( + run_grandpa_observer( + Config { + gossip_duration: TEST_GOSSIP_DURATION, + justification_period: 32, + local_key: None, + name: Some("observer".to_string()), + }, + link, + MessageRouting::new(net.clone(), 3), + Exit, + ).unwrap() + ).unwrap(); + + Some(Box::new(finality_notifications.map(|_| ()))) + }); +} + +#[test] +fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { + let _ = ::env_logger::try_init(); + + let peers = &[AuthorityKeyring::Alice]; + let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 1); + net.add_light_peer(&GrandpaTestNet::default_config()); + + // import block#1 WITH consensus data change. Light client ignores justification + // && instead fetches finality proof for block #1 + net.peer(0).push_authorities_change_block(vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]); + let net = Arc::new(Mutex::new(net)); + run_to_completion(1, net.clone(), peers); + net.lock().sync_without_disconnects(); + + // check that the block#1 is finalized on light client + while net.lock().peer(1).client().info().unwrap().chain.finalized_number != 1 { + net.lock().tick_peer(1); + net.lock().sync_without_disconnects(); + } +} + +#[test] +fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_different() { + // for debug: to ensure that without forced change light client will sync finality proof + const FORCE_CHANGE: bool = true; + + let _ = ::env_logger::try_init(); + + // two of these guys are offline. + let genesis_authorities = if FORCE_CHANGE { + vec![ + AuthorityKeyring::Alice, + AuthorityKeyring::Bob, + AuthorityKeyring::Charlie, + AuthorityKeyring::One, + AuthorityKeyring::Two, + ] + } else { + vec![ + AuthorityKeyring::Alice, + AuthorityKeyring::Bob, + AuthorityKeyring::Charlie, + ] + }; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let api = TestApi::new(make_ids(&genesis_authorities)); + + let voters = make_ids(peers_a); + let forced_transitions = api.forced_changes.clone(); + let net = GrandpaTestNet::new(api, 3); + let net = Arc::new(Mutex::new(net)); + + let runner_net = net.clone(); + let add_blocks = move |_| { + net.lock().peer(0).push_blocks(1, false); // best is #1 + + // add a forced transition at block 5. + if FORCE_CHANGE { + let parent_hash = net.lock().peer(0).client().info().unwrap().chain.best_hash; + forced_transitions.lock().insert(parent_hash, (0, ScheduledChange { + next_authorities: voters.clone(), + delay: 3, + })); + } + + // ensure block#10 enacts authorities set change => justification is generated + // normally it will reach light client, but because of the forced change, it will not + net.lock().peer(0).push_blocks(8, false); // best is #9 + net.lock().peer(0).push_authorities_change_block( + vec![substrate_primitives::sr25519::Public::from_raw([42; 32])] + ); // #10 + net.lock().peer(0).push_blocks(1, false); // best is #11 + net.lock().sync_without_disconnects(); + + None + }; + + // finalize block #11 on full clients + run_to_completion_with(11, runner_net.clone(), peers_a, add_blocks); + // request finalization by light client + runner_net.lock().add_light_peer(&GrandpaTestNet::default_config()); + runner_net.lock().sync_without_disconnects(); + + // check block, finalized on light client + assert_eq!( + runner_net.lock().peer(3).client().info().unwrap().chain.finalized_number, + if FORCE_CHANGE { 0 } else { 10 }, + ); +} \ No newline at end of file diff --git a/core/finality-grandpa/src/until_imported.rs b/core/finality-grandpa/src/until_imported.rs index 4b867c18c8e2bea8f0ca2e02db34a2fd5eaf75a2..2efb827d378d07a1e7cd12d1f1c4db80d7b8635d 100644 --- a/core/finality-grandpa/src/until_imported.rs +++ b/core/finality-grandpa/src/until_imported.rs @@ -258,13 +258,13 @@ pub(crate) type UntilVoteTargetImported = UntilImported { - inner: Arc<(AtomicUsize, Mutex)>>)>, +pub(crate) struct BlockCommitMessage { + inner: Arc<(AtomicUsize, Mutex, U)>>)>, target_number: NumberFor, } -impl BlockUntilImported for BlockCommitMessage { - type Blocked = (u64, CompactCommit); +impl BlockUntilImported for BlockCommitMessage { + type Blocked = (u64, CompactCommit, U); fn schedule_wait( input: Self::Blocked, @@ -400,11 +400,11 @@ impl BlockUntilImported for BlockCommitMessage { /// A stream which gates off incoming commit messages until all referenced /// block hashes have been imported. -pub(crate) type UntilCommitBlocksImported = UntilImported< +pub(crate) type UntilCommitBlocksImported = UntilImported< Block, Status, I, - BlockCommitMessage, + BlockCommitMessage, >; #[cfg(test)] @@ -507,7 +507,7 @@ mod tests { commit_rx.map_err(|_| panic!("should never error")), ); - commit_tx.unbounded_send((0, unknown_commit.clone())).unwrap(); + commit_tx.unbounded_send((0, unknown_commit.clone(), ())).unwrap(); let inner_chain_state = chain_state.clone(); let work = until_imported @@ -527,7 +527,7 @@ mod tests { }); let mut runtime = Runtime::new().unwrap(); - assert_eq!(runtime.block_on(work).map_err(|(e, _)| e).unwrap().0, Some((0, unknown_commit))); + assert_eq!(runtime.block_on(work).map_err(|(e, _)| e).unwrap().0, Some((0, unknown_commit, ()))); } #[test] @@ -567,11 +567,11 @@ mod tests { commit_rx.map_err(|_| panic!("should never error")), ); - commit_tx.unbounded_send((0, known_commit.clone())).unwrap(); + commit_tx.unbounded_send((0, known_commit.clone(), ())).unwrap(); let work = until_imported.into_future(); let mut runtime = Runtime::new().unwrap(); - assert_eq!(runtime.block_on(work).map_err(|(e, _)| e).unwrap().0, Some((0, known_commit))); + assert_eq!(runtime.block_on(work).map_err(|(e, _)| e).unwrap().0, Some((0, known_commit, ()))); } } diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index 54757ed2684f30a74a38c16af33ce4e0df73c04e..a71661bd1d2b020ac8c2c944556a80b035b75097 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index 7d2324bc933cdaeb5ab6d0b3f6a8d7579ec385b4..87fa39fe06e6cc8aed7eb502fc736d0e8c274aca 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -114,7 +114,9 @@ impl InherentData { match self.data.get(identifier) { Some(inherent) => I::decode(&mut &inherent[..]) - .ok_or_else(|| "Could not decode requested inherent type!".into()) + .ok_or_else(|| { + "Could not decode requested inherent type!".into() + }) .map(Some), None => Ok(None) } diff --git a/core/keyring/Cargo.toml b/core/keyring/Cargo.toml index 8159e4252e684d205adcadaddcf6707b90e6330c..299d822843a3e1de0e297adf173c2fafdbeaede5 100644 --- a/core/keyring/Cargo.toml +++ b/core/keyring/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] substrate-primitives = { path = "../primitives" } -hex-literal = { version = "0.1.0" } +sr-primitives = { path = "../sr-primitives" } lazy_static = { version = "1.0" } strum = "0.14.0" strum_macros = "0.14.0" diff --git a/core/keyring/src/ed25519.rs b/core/keyring/src/ed25519.rs index f36d8fd4853e97b7ac541f7acb1acf5fcc6adca6..9c303b62bc58e6728603dcbe1b27be7c85f724d8 100644 --- a/core/keyring/src/ed25519.rs +++ b/core/keyring/src/ed25519.rs @@ -79,7 +79,7 @@ impl Keyring { .expect("static values are known good; qed") } - /// Returns an interator over all test accounts. + /// Returns an iterator over all test accounts. pub fn iter() -> impl Iterator { ::iter() } @@ -100,6 +100,12 @@ impl From for &'static str { } } +impl From for sr_primitives::MultiSigner { + fn from(x: Keyring) -> Self { + sr_primitives::MultiSigner::Ed25519(x.into()) + } +} + lazy_static! { static ref PRIVATE_KEYS: HashMap = { Keyring::iter().map(|i| (i, i.pair())).collect() diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index 1d3342d86d1c4bc34fbda9c00802915b5a45eedf..0097d7b2f9c5c1493dad59cdd0a7d7220550a193 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -96,6 +96,12 @@ impl From for &'static str { } } +impl From for sr_primitives::MultiSigner { + fn from(x: Keyring) -> Self { + sr_primitives::MultiSigner::Sr25519(x.into()) + } +} + lazy_static! { static ref PRIVATE_KEYS: HashMap = { [ diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index d0c8a93473fe12b0452856aa65f9a1a33241a705..1d4f146b7ed7fc156590dedd4fb825f84deaca8e 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -1,18 +1,15 @@ [package] name = "substrate-keystore" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] +derive_more = "0.14.0" substrate-primitives = { path = "../primitives" } -crypto = { package = "parity-crypto", version = "0.3", default-features = false } -error-chain = "0.12" hex = "0.3" rand = "0.6" serde_json = "1.0" -serde = "1.0" -serde_derive = "1.0" subtle = "2.0" [dev-dependencies] diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 59c1a65cfb1cd14317ab08dc41bfa5aec0ee300d..67cf2c8d327cd659fb22c75137ff0fe7a0a5702c 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -16,40 +16,42 @@ //! Keystore (and session key management) for ed25519 based chains like Polkadot. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] +#![warn(missing_docs)] use std::collections::HashMap; use std::path::PathBuf; use std::fs::{self, File}; use std::io::{self, Write}; -use error_chain::{bail, error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; - use substrate_primitives::{ed25519::{Pair, Public}, Pair as PairT}; -pub use crypto::KEY_ITERATIONS; +/// Keystore error. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// IO error. + Io(io::Error), + /// JSON error. + Json(serde_json::Error), + /// Invalid password. + #[display(fmt="Invalid password")] + InvalidPassword, + /// Invalid BIP39 phrase + #[display(fmt="Invalid recovery phrase (BIP39) data")] + InvalidPhrase, + /// Invalid seed + #[display(fmt="Invalid seed")] + InvalidSeed, +} -error_chain! { - foreign_links { - Io(io::Error); - Json(serde_json::Error); - } +/// Keystore Result +pub type Result = std::result::Result; - errors { - InvalidPassword { - description("Invalid password"), - display("Invalid password"), - } - InvalidPhrase { - description("Invalid recovery phrase (BIP39) data"), - display("Invalid recovery phrase (BIP39) data"), - } - InvalidSeed { - description("Invalid seed"), - display("Invalid seed"), +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Json(ref err) => Some(err), + _ => None, } } } @@ -79,7 +81,7 @@ impl Store { /// Create a new key from seed. Do not place it into the store. pub fn generate_from_seed(&mut self, seed: &str) -> Result { let pair = Pair::from_string(seed, None) - .map_err(|_| Error::from(ErrorKind::InvalidSeed))?; + .ok().ok_or(Error::InvalidSeed)?; self.additional.insert(pair.public(), pair.clone()); Ok(pair) } @@ -94,9 +96,9 @@ impl Store { let phrase: String = ::serde_json::from_reader(&file)?; let pair = Pair::from_phrase(&phrase, Some(password)) - .map_err(|_| Error::from(ErrorKind::InvalidPhrase))?; + .ok().ok_or(Error::InvalidPhrase)?; if &pair.public() != public { - bail!(ErrorKind::InvalidPassword); + return Err(Error::InvalidPassword); } Ok(pair) } @@ -138,6 +140,7 @@ impl Store { mod tests { use super::*; use tempdir::TempDir; + use substrate_primitives::crypto::Ss58Codec; #[test] fn basic_store() { @@ -162,6 +165,6 @@ mod tests { let mut store = Store::open(temp_dir.path().to_owned()).unwrap(); let pair = store.generate_from_seed("0x3d97c819d68f9bafa7d6e79cb991eebcd77d966c5334c0b94d9e1fa7ad0869dc").unwrap(); - assert_eq!("5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HBL8", pair.public().to_ss58check()); + assert_eq!("5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HJCA", pair.public().to_ss58check()); } } diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml index b97916b91a5076a9ce285717873c1bb7dcd90ec1..a2ea8660a2fcdc20973531ed2633fb3c8ac877ac 100644 --- a/core/network-libp2p/Cargo.toml +++ b/core/network-libp2p/Cargo.toml @@ -3,32 +3,34 @@ description = "libp2p implementation of the ethcore network library" homepage = "http://parity.io" license = "GPL-3.0" name = "substrate-network-libp2p" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] byteorder = "1.3" bytes = "0.4" -error-chain = { version = "0.12", default-features = false } fnv = "1.0" futures = "0.1" -libp2p = { version = "0.6.0", default-features = false, features = ["secio-secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.8.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } parking_lot = "0.7.1" lazy_static = "1.2" log = "0.4" rand = "0.6" -serde = "1.0.70" -serde_derive = "1.0.70" +serde = { version = "1.0.70", features = ["derive"] } serde_json = "1.0.24" smallvec = "0.6" substrate-peerset = { path = "../peerset" } -tokio = "0.1" tokio-io = "0.1" tokio-timer = "0.2" unsigned-varint = { version = "0.2.1", features = ["codec"] } void = "1.0" +zeroize = "0.6.0" + +slog = { version = "^2", features = ["nested-values"] } +slog_derive = "0.1.1" +erased-serde = "0.3.9" [dev-dependencies] tempdir = "0.3" - +tokio = "0.1" diff --git a/core/network-libp2p/src/behaviour.rs b/core/network-libp2p/src/behaviour.rs index c6401ef79e1570159d5ac29055da566f06e3edee..a180a340645c0d751d9ba6aed369abbca2632f10 100644 --- a/core/network-libp2p/src/behaviour.rs +++ b/core/network-libp2p/src/behaviour.rs @@ -14,75 +14,80 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::custom_proto::{CustomProto, CustomProtoOut, RegisteredProtocol}; +use crate::DiscoveryNetBehaviour; use futures::prelude::*; use libp2p::NetworkBehaviour; -use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; +use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, protocols_handler::IntoProtocolsHandler, PublicKey}; use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; use libp2p::core::swarm::{NetworkBehaviourEventProcess, PollParameters}; +#[cfg(not(target_os = "unknown"))] use libp2p::core::swarm::toggle::Toggle; -use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; use libp2p::kad::{Kademlia, KademliaOut}; +#[cfg(not(target_os = "unknown"))] use libp2p::mdns::{Mdns, MdnsEvent}; -use libp2p::ping::{Ping, PingEvent}; -use log::{debug, trace, warn}; -use std::{cmp, io, fmt, time::Duration, time::Instant}; +use libp2p::multiaddr::Protocol; +use log::{debug, info, trace, warn}; +use std::{cmp, iter, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::Delay; +use tokio_timer::{Delay, clock::Clock}; use void; +mod debug_info; + /// General behaviour of the network. #[derive(NetworkBehaviour)] -#[behaviour(out_event = "BehaviourOut", poll_method = "poll")] -pub struct Behaviour { - /// Periodically ping nodes, and close the connection if it's unresponsive. - ping: Ping, - /// Custom protocols (dot, bbq, sub, etc.). - custom_protocols: CustomProto, +#[behaviour(out_event = "TBehaviourEv", poll_method = "poll")] +pub struct Behaviour { + /// Main protocol that handles everything except the discovery and the technicalities. + user_protocol: UserBehaviourWrap, + /// Periodically pings and identifies the nodes we are connected to, and store information in a + /// cache. + debug_info: debug_info::DebugInfoBehaviour, /// Discovers nodes of the network. Defined below. discovery: DiscoveryBehaviour, - /// Periodically identifies the remote and responds to incoming requests. - identify: Identify, /// Discovers nodes on the local network. + #[cfg(not(target_os = "unknown"))] mdns: Toggle>, /// Queue of events to produce for the outside. #[behaviour(ignore)] - events: Vec>, + events: Vec, } -impl Behaviour { +impl Behaviour { /// Builds a new `Behaviour`. pub fn new( + user_protocol: TBehaviour, user_agent: String, local_public_key: PublicKey, - protocol: RegisteredProtocol, known_addresses: Vec<(PeerId, Multiaddr)>, - peerset: substrate_peerset::Peerset, enable_mdns: bool, ) -> Self { - let identify = { - let proto_version = "/substrate/1.0".to_string(); - Identify::new(proto_version, user_agent, local_public_key.clone()) - }; - - let custom_protocols = CustomProto::new(protocol, peerset); + let debug_info = debug_info::DebugInfoBehaviour::new(user_agent, local_public_key.clone()); - let mut kademlia = Kademlia::new(local_public_key.into_peer_id()); + let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); for (peer_id, addr) in &known_addresses { kademlia.add_connected_address(peer_id, addr.clone()); } + if enable_mdns { + #[cfg(target_os = "unknown")] + warn!(target: "sub-libp2p", "mDNS is not available on this platform"); + } + + let clock = Clock::new(); Behaviour { - ping: Ping::new(), - custom_protocols, + user_protocol: UserBehaviourWrap(user_protocol), + debug_info, discovery: DiscoveryBehaviour { user_defined: known_addresses, kademlia, - next_kad_random_query: Delay::new(Instant::now()), + next_kad_random_query: Delay::new(clock.now()), duration_to_next_kad: Duration::from_secs(1), + clock, + local_peer_id: local_public_key.into_peer_id(), }, - identify, + #[cfg(not(target_os = "unknown"))] mdns: if enable_mdns { match Mdns::new() { Ok(mdns) => Some(mdns).into(), @@ -98,32 +103,11 @@ impl Behaviour { } } - /// Sends a message to a peer. - /// - /// Has no effect if the custom protocol is not open with the given peer. - /// - /// Also note that even we have a valid open substream, it may in fact be already closed - /// without us knowing, in which case the packet will not be received. - #[inline] - pub fn send_custom_message(&mut self, target: &PeerId, data: TMessage) { - self.custom_protocols.send_packet(target, data) - } - /// Returns the list of nodes that we know exist in the network. pub fn known_peers(&self) -> impl Iterator { self.discovery.kademlia.kbuckets_entries() } - /// Returns true if we try to open protocols with the given peer. - pub fn is_enabled(&self, peer_id: &PeerId) -> bool { - self.custom_protocols.is_enabled(peer_id) - } - - /// Returns true if we have an open protocol with the given peer. - pub fn is_open(&self, peer_id: &PeerId) -> bool { - self.custom_protocols.is_open(peer_id) - } - /// Adds a hard-coded address for the given peer, that never expires. pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { if self.discovery.user_defined.iter().all(|(p, a)| *p != peer_id && *a != addr) { @@ -131,148 +115,70 @@ impl Behaviour { } } - /// Disconnects the custom protocols from a peer. - /// - /// The peer will still be able to use Kademlia or other protocols, but will get disconnected - /// after a few seconds of inactivity. - /// - /// This is asynchronous and does not instantly close the custom protocols. - /// Corresponding closing events will be generated once the closing actually happens. + /// Borrows `self` and returns a struct giving access to the information about a node. /// - /// Has no effect if we're not connected to the `PeerId`. - #[inline] - pub fn drop_node(&mut self, peer_id: &PeerId) { - self.custom_protocols.disconnect_peer(peer_id) + /// Returns `None` if we don't know anything about this node. Always returns `Some` for nodes + /// we're connected to, meaning that if `None` is returned then we're not connected to that + /// node. + pub fn node(&self, peer_id: &PeerId) -> Option { + self.debug_info.node(peer_id) } - /// Returns the state of the peerset manager, for debugging purposes. - pub fn peerset_debug_info(&self) -> serde_json::Value { - self.custom_protocols.peerset_debug_info() + /// Returns a shared reference to the user protocol. + pub fn user_protocol(&self) -> &TBehaviour { + &self.user_protocol.0 } -} - -/// Event that can be emitted by the behaviour. -#[derive(Debug)] -pub enum BehaviourOut { - /// Opened a custom protocol with the remote. - CustomProtocolOpen { - /// Version of the protocol that has been opened. - version: u8, - /// Id of the node we have opened a connection with. - peer_id: PeerId, - /// Endpoint used for this custom protocol. - endpoint: ConnectedPoint, - }, - - /// Closed a custom protocol with the remote. - CustomProtocolClosed { - /// Id of the peer we were connected to. - peer_id: PeerId, - /// Reason why the substream closed. If `Ok`, then it's a graceful exit (EOF). - result: io::Result<()>, - }, - - /// Receives a message on a custom protocol substream. - CustomMessage { - /// Id of the peer the message came from. - peer_id: PeerId, - /// Message that has been received. - message: TMessage, - }, - /// A substream with a remote is clogged. We should avoid sending more data to it if possible. - Clogged { - /// Id of the peer the message came from. - peer_id: PeerId, - /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, - }, - - /// We have obtained debug information from a peer. - Identified { - /// Id of the peer that has been identified. - peer_id: PeerId, - /// Information about the peer. - info: IdentifyInfo, - }, - - /// We have successfully pinged a peer. - PingSuccess { - /// Id of the peer that has been pinged. - peer_id: PeerId, - /// Time it took for the ping to come back. - ping_time: Duration, - }, -} - -impl From> for BehaviourOut { - fn from(other: CustomProtoOut) -> BehaviourOut { - match other { - CustomProtoOut::CustomProtocolOpen { version, peer_id, endpoint } => { - BehaviourOut::CustomProtocolOpen { version, peer_id, endpoint } - } - CustomProtoOut::CustomProtocolClosed { peer_id, result } => { - BehaviourOut::CustomProtocolClosed { peer_id, result } - } - CustomProtoOut::CustomMessage { peer_id, message } => { - BehaviourOut::CustomMessage { peer_id, message } - } - CustomProtoOut::Clogged { peer_id, messages } => { - BehaviourOut::Clogged { peer_id, messages } - } - } + /// Returns a mutable reference to the user protocol. + pub fn user_protocol_mut(&mut self) -> &mut TBehaviour { + &mut self.user_protocol.0 } } -impl NetworkBehaviourEventProcess for Behaviour { +impl NetworkBehaviourEventProcess for +Behaviour { fn inject_event(&mut self, event: void::Void) { void::unreachable(event) } } -impl NetworkBehaviourEventProcess> for Behaviour { - fn inject_event(&mut self, event: CustomProtoOut) { - self.events.push(event.into()); +impl NetworkBehaviourEventProcess> for +Behaviour { + fn inject_event(&mut self, event: UserEventWrap) { + self.events.push(event.0); } } -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: IdentifyEvent) { - match event { - IdentifyEvent::Identified { peer_id, mut info, .. } => { - trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info); - // TODO: ideally we would delay the first identification to when we open the custom - // protocol, so that we only report id info to the service about the nodes we - // care about (https://github.com/libp2p/rust-libp2p/issues/876) - if !info.protocol_version.contains("substrate") { - warn!(target: "sub-libp2p", "Connected to a non-Substrate node: {:?}", info); - } - if info.listen_addrs.len() > 30 { - warn!(target: "sub-libp2p", "Node {:?} id reported more than 30 addresses", - peer_id); - info.listen_addrs.truncate(30); - } - for addr in &info.listen_addrs { - self.discovery.kademlia.add_connected_address(&peer_id, addr.clone()); - } - self.custom_protocols.add_discovered_nodes(Some(peer_id.clone())); - self.events.push(BehaviourOut::Identified { peer_id, info }); - } - IdentifyEvent::Error { .. } => {} - IdentifyEvent::SendBack { result: Err(ref err), ref peer_id } => - debug!(target: "sub-libp2p", "Error when sending back identify info \ - to {:?} => {}", peer_id, err), - IdentifyEvent::SendBack { .. } => {} +impl NetworkBehaviourEventProcess + for Behaviour + where TBehaviour: DiscoveryNetBehaviour { + fn inject_event(&mut self, event: debug_info::DebugInfoEvent) { + let debug_info::DebugInfoEvent::Identified { peer_id, mut info } = event; + if !info.protocol_version.contains("substrate") { + warn!(target: "sub-libp2p", "Connected to a non-Substrate node: {:?}", info); + } + if info.listen_addrs.len() > 30 { + warn!(target: "sub-libp2p", "Node {:?} has reported more than 30 addresses; \ + it is identified by {:?} and {:?}", peer_id, info.protocol_version, + info.agent_version + ); + info.listen_addrs.truncate(30); + } + for addr in &info.listen_addrs { + self.discovery.kademlia.add_connected_address(&peer_id, addr.clone()); } + self.user_protocol.0.add_discovered_nodes(iter::once(peer_id.clone())); } } -impl NetworkBehaviourEventProcess for Behaviour { +impl NetworkBehaviourEventProcess + for Behaviour + where TBehaviour: DiscoveryNetBehaviour { fn inject_event(&mut self, out: KademliaOut) { match out { KademliaOut::Discovered { .. } => {} KademliaOut::KBucketAdded { peer_id, .. } => { - self.custom_protocols.add_discovered_nodes(Some(peer_id)); + self.user_protocol.0.add_discovered_nodes(iter::once(peer_id)); } KademliaOut::FindNodeResult { key, closer_peers } => { trace!(target: "sub-libp2p", "Libp2p => Query for {:?} yielded {:?} results", @@ -288,30 +194,22 @@ impl NetworkBehaviourEventProcess for Behavio } } -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: PingEvent) { - match event { - PingEvent::PingSuccess { peer, time } => { - trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer, time); - self.events.push(BehaviourOut::PingSuccess { peer_id: peer, ping_time: time }); - } - } - } -} - -impl NetworkBehaviourEventProcess for Behaviour { +#[cfg(not(target_os = "unknown"))] +impl NetworkBehaviourEventProcess for + Behaviour + where TBehaviour: DiscoveryNetBehaviour { fn inject_event(&mut self, event: MdnsEvent) { match event { MdnsEvent::Discovered(list) => { - self.custom_protocols.add_discovered_nodes(list.into_iter().map(|(peer_id, _)| peer_id)); + self.user_protocol.0.add_discovered_nodes(list.into_iter().map(|(peer_id, _)| peer_id)); }, MdnsEvent::Expired(_) => {} } } } -impl Behaviour { - fn poll(&mut self) -> Async>> { +impl Behaviour { + fn poll(&mut self) -> Async> { if !self.events.is_empty() { return Async::Ready(NetworkBehaviourAction::GenerateEvent(self.events.remove(0))) } @@ -320,6 +218,74 @@ impl Behaviour { } } +/// Because of limitations with the network behaviour custom derive and trait impl duplication, we +/// have to wrap the user protocol into a struct. +pub struct UserBehaviourWrap(TInner); +/// Event produced by `UserBehaviourWrap`. +pub struct UserEventWrap(TInner); +impl NetworkBehaviour for UserBehaviourWrap { + type ProtocolsHandler = TInner::ProtocolsHandler; + type OutEvent = UserEventWrap; + fn new_handler(&mut self) -> Self::ProtocolsHandler { self.0.new_handler() } + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + self.0.addresses_of_peer(peer_id) + } + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.0.inject_connected(peer_id, endpoint) + } + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.0.inject_disconnected(peer_id, endpoint) + } + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent + ) { + self.0.inject_node_event(peer_id, event) + } + fn poll( + &mut self, + params: &mut PollParameters + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + match self.0.poll(params) { + Async::NotReady => Async::NotReady, + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => + Async::Ready(NetworkBehaviourAction::GenerateEvent(UserEventWrap(ev))), + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.0.inject_replaced(peer_id, closed_endpoint, new_endpoint) + } + fn inject_addr_reach_failure(&mut self, peer_id: Option<&PeerId>, addr: &Multiaddr, error: &dyn std::error::Error) { + self.0.inject_addr_reach_failure(peer_id, addr, error) + } + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.0.inject_dial_failure(peer_id) + } + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.0.inject_new_listen_addr(addr) + } + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.0.inject_expired_listen_addr(addr) + } + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.0.inject_new_external_addr(addr) + } +} + /// Implementation of `NetworkBehaviour` that discovers the nodes on the network. pub struct DiscoveryBehaviour { /// User-defined list of nodes and their addresses. Typically includes bootstrap nodes and @@ -331,6 +297,10 @@ pub struct DiscoveryBehaviour { next_kad_random_query: Delay, /// After `next_kad_random_query` triggers, the next one triggers after this duration. duration_to_next_kad: Duration, + /// `Clock` instance that uses the current execution context's source of time. + clock: Clock, + /// Identity of our local node. + local_peer_id: PeerId, } impl NetworkBehaviour for DiscoveryBehaviour @@ -382,6 +352,16 @@ where NetworkBehaviour::inject_node_event(&mut self.kademlia, peer_id, event) } + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + let new_addr = addr.clone() + .with(Protocol::P2p(self.local_peer_id.clone().into())); + info!(target: "sub-libp2p", "Discovered new external address for our node: {}", new_addr); + } + + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + info!(target: "sub-libp2p", "No longer listening on {}", addr); + } + fn poll( &mut self, params: &mut PollParameters, @@ -408,7 +388,7 @@ where self.kademlia.find_node(random_peer_id); // Reset the `Delay` to the next random. - self.next_kad_random_query.reset(Instant::now() + self.duration_to_next_kad); + self.next_kad_random_query.reset(self.clock.now() + self.duration_to_next_kad); self.duration_to_next_kad = cmp::min(self.duration_to_next_kad * 2, Duration::from_secs(60)); }, @@ -422,27 +402,3 @@ where Async::NotReady } } - -/// The severity of misbehaviour of a peer that is reported. -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum Severity { - /// Peer is timing out. Could be bad connectivity of overload of work on either of our sides. - Timeout, - /// Peer has been notably useless. E.g. unable to answer a request that we might reasonably consider - /// it could answer. - Useless(String), - /// Peer has behaved in an invalid manner. This doesn't necessarily need to be Byzantine, but peer - /// must have taken concrete action in order to behave in such a way which is wantanly invalid. - Bad(String), -} - -impl fmt::Display for Severity { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - match self { - Severity::Timeout => write!(fmt, "Timeout"), - Severity::Useless(r) => write!(fmt, "Useless ({})", r), - Severity::Bad(r) => write!(fmt, "Bad ({})", r), - } - } -} - diff --git a/core/network-libp2p/src/behaviour/debug_info.rs b/core/network-libp2p/src/behaviour/debug_info.rs new file mode 100644 index 0000000000000000000000000000000000000000..46c7422fd7e693050ba7f897b0e5bd6d9712e77a --- /dev/null +++ b/core/network-libp2p/src/behaviour/debug_info.rs @@ -0,0 +1,329 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use fnv::FnvHashMap; +use futures::prelude::*; +use libp2p::Multiaddr; +use libp2p::core::{either::EitherOutput, PeerId, PublicKey}; +use libp2p::core::protocols_handler::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; +use libp2p::core::nodes::ConnectedPoint; +use libp2p::core::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; +use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; +use log::{debug, trace, error}; +use std::collections::hash_map::Entry; +use std::time::{Duration, Instant}; +use tokio_io::{AsyncRead, AsyncWrite}; +use tokio_timer::Interval; + +/// Time after we disconnect from a node before we purge its information from the cache. +const CACHE_EXPIRE: Duration = Duration::from_secs(10 * 60); +/// Interval at which we perform garbage collection on the node info. +const GARBAGE_COLLECT_INTERVAL: Duration = Duration::from_secs(2 * 60); + +/// Implementation of `NetworkBehaviour` that holds information about nodes in cache for diagnostic +/// purposes. +pub struct DebugInfoBehaviour { + /// Periodically ping nodes, and close the connection if it's unresponsive. + ping: Ping, + /// Periodically identifies the remote and responds to incoming requests. + identify: Identify, + /// Information that we know about all nodes. + nodes_info: FnvHashMap, + /// Interval at which we perform garbage collection in `nodes_info`. + garbage_collect: Interval, +} + +/// Information about a node we're connected to. +#[derive(Debug)] +struct NodeInfo { + /// When we will remove the entry about this node from the list, or `None` if we're connected + /// to the node. + info_expire: Option, + /// How we're connected to the node. + endpoint: ConnectedPoint, + /// Version reported by the remote, or `None` if unknown. + client_version: Option, + /// Latest ping time with this node. + latest_ping: Option, +} + +impl DebugInfoBehaviour { + /// Builds a new `DebugInfoBehaviour`. + pub fn new( + user_agent: String, + local_public_key: PublicKey, + ) -> Self { + let identify = { + let proto_version = "/substrate/1.0".to_string(); + Identify::new(proto_version, user_agent, local_public_key.clone()) + }; + + DebugInfoBehaviour { + ping: Ping::new(PingConfig::new()), + identify, + nodes_info: FnvHashMap::default(), + garbage_collect: Interval::new_interval(GARBAGE_COLLECT_INTERVAL), + } + } + + /// Borrows `self` and returns a struct giving access to the information about a node. + /// + /// Returns `None` if we don't know anything about this node. Always returns `Some` for nodes + /// we're connected to, meaning that if `None` is returned then we're not connected to that + /// node. + pub fn node(&self, peer_id: &PeerId) -> Option { + self.nodes_info.get(peer_id).map(Node) + } + + /// Inserts a ping time in the cache. Has no effect if we don't have any entry for that node, + /// which shouldn't happen. + fn handle_ping_report(&mut self, peer_id: &PeerId, ping_time: Duration) { + trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer_id, ping_time); + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.latest_ping = Some(ping_time); + } else { + error!(target: "sub-libp2p", + "Received ping from node we're not connected to {:?}", peer_id); + } + } + + /// Inserts an identify record in the cache. Has no effect if we don't have any entry for that + /// node, which shouldn't happen. + fn handle_identify_report(&mut self, peer_id: &PeerId, info: &IdentifyInfo) { + trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info); + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.client_version = Some(info.agent_version.clone()); + } else { + error!(target: "sub-libp2p", + "Received pong from node we're not connected to {:?}", peer_id); + } + } +} + +/// Gives access to the information about a node. +pub struct Node<'a>(&'a NodeInfo); + +impl<'a> Node<'a> { + /// Returns the endpoint we are connected to or were last connected to. + pub fn endpoint(&self) -> &'a ConnectedPoint { + &self.0.endpoint + } + + /// Returns the latest version information we know of. + pub fn client_version(&self) -> Option<&'a str> { + self.0.client_version.as_ref().map(|s| &s[..]) + } + + /// Returns the latest ping time we know of for this node. `None` if we never successfully + /// pinged this node. + pub fn latest_ping(&self) -> Option { + self.0.latest_ping + } + + /// Generates an arbitrary string containing debug information about the node. + pub fn debug_info(&self) -> String { + format!("(version: {:?}) through {:?}", self.0.client_version, self.0.endpoint) + } +} + +/// Event that can be emitted by the behaviour. +#[derive(Debug)] +pub enum DebugInfoEvent { + /// We have obtained debug information from a peer, including the addresses it is listening + /// on. + Identified { + /// Id of the peer that has been identified. + peer_id: PeerId, + /// Information about the peer. + info: IdentifyInfo, + }, +} + +impl NetworkBehaviour for DebugInfoBehaviour +where TSubstream: AsyncRead + AsyncWrite { + type ProtocolsHandler = IntoProtocolsHandlerSelect< + as NetworkBehaviour>::ProtocolsHandler, + as NetworkBehaviour>::ProtocolsHandler + >; + type OutEvent = DebugInfoEvent; + + fn new_handler(&mut self) -> Self::ProtocolsHandler { + IntoProtocolsHandler::select(self.ping.new_handler(), self.identify.new_handler()) + } + + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + let mut list = self.ping.addresses_of_peer(peer_id); + list.extend_from_slice(&self.identify.addresses_of_peer(peer_id)); + list + } + + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.ping.inject_connected(peer_id.clone(), endpoint.clone()); + self.identify.inject_connected(peer_id.clone(), endpoint.clone()); + + match self.nodes_info.entry(peer_id) { + Entry::Vacant(e) => { + e.insert(NodeInfo { + info_expire: None, + endpoint, + client_version: None, + latest_ping: None, + }); + } + Entry::Occupied(e) => { + let e = e.into_mut(); + if e.info_expire.as_ref().map(|exp| *exp < Instant::now()).unwrap_or(false) { + e.client_version = None; + e.latest_ping = None; + } + e.info_expire = None; + e.endpoint = endpoint; + } + } + } + + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.ping.inject_disconnected(peer_id, endpoint.clone()); + self.identify.inject_disconnected(peer_id, endpoint); + + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.info_expire = Some(Instant::now() + CACHE_EXPIRE); + } else { + error!(target: "sub-libp2p", + "Disconnected from node we were not connected to {:?}", peer_id); + } + } + + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent + ) { + match event { + EitherOutput::First(event) => self.ping.inject_node_event(peer_id, event), + EitherOutput::Second(event) => self.identify.inject_node_event(peer_id, event), + } + } + + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.ping.inject_replaced(peer_id.clone(), closed_endpoint.clone(), new_endpoint.clone()); + self.identify.inject_replaced(peer_id.clone(), closed_endpoint, new_endpoint.clone()); + + if let Some(entry) = self.nodes_info.get_mut(&peer_id) { + entry.endpoint = new_endpoint; + } else { + error!(target: "sub-libp2p", + "Disconnected from node we were not connected to {:?}", peer_id); + } + } + + fn inject_addr_reach_failure(&mut self, peer_id: Option<&PeerId>, addr: &Multiaddr, error: &dyn std::error::Error) { + self.ping.inject_addr_reach_failure(peer_id, addr, error); + self.identify.inject_addr_reach_failure(peer_id, addr, error); + } + + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.ping.inject_dial_failure(peer_id); + self.identify.inject_dial_failure(peer_id); + } + + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_new_listen_addr(addr); + self.identify.inject_new_listen_addr(addr); + } + + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_expired_listen_addr(addr); + self.identify.inject_expired_listen_addr(addr); + } + + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_new_external_addr(addr); + self.identify.inject_new_external_addr(addr); + } + + fn poll( + &mut self, + params: &mut PollParameters + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + loop { + match self.ping.poll(params) { + Async::NotReady => break, + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { + if let PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } = ev { + self.handle_ping_report(&peer, rtt) + } + }, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { + peer_id, + event: EitherOutput::First(event) + }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + + loop { + match self.identify.poll(params) { + Async::NotReady => break, + Async::Ready(NetworkBehaviourAction::GenerateEvent(event)) => { + match event { + IdentifyEvent::Identified { peer_id, info, .. } => { + self.handle_identify_report(&peer_id, &info); + let event = DebugInfoEvent::Identified { peer_id, info }; + return Async::Ready(NetworkBehaviourAction::GenerateEvent(event)); + } + IdentifyEvent::Error { .. } => {} + IdentifyEvent::SendBack { result: Err(ref err), ref peer_id } => + debug!(target: "sub-libp2p", "Error when sending back identify info \ + to {:?} => {}", peer_id, err), + IdentifyEvent::SendBack { .. } => {} + } + }, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { + peer_id, + event: EitherOutput::Second(event) + }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + + while let Ok(Async::Ready(Some(_))) = self.garbage_collect.poll() { + self.nodes_info.retain(|_, node| { + node.info_expire.as_ref().map(|exp| *exp >= Instant::now()).unwrap_or(true) + }); + } + + Async::NotReady + } +} diff --git a/core/network-libp2p/src/config.rs b/core/network-libp2p/src/config.rs index 74f928000547967c88e30ce53cf0335a5c40d33c..d845d132a812f963f8107fa0a2f295d14233fe38 100644 --- a/core/network-libp2p/src/config.rs +++ b/core/network-libp2p/src/config.rs @@ -20,6 +20,7 @@ use libp2p::identity::{Keypair, secp256k1, ed25519}; use libp2p::{Multiaddr, multiaddr::Protocol}; use std::error::Error; use std::{io::{self, Write}, iter, fs, net::Ipv4Addr, path::{Path, PathBuf}}; +use zeroize::Zeroize; /// Network service configuration. #[derive(Clone)] @@ -61,7 +62,7 @@ impl Default for NetworkConfiguration { listen_addresses: Vec::new(), public_addresses: Vec::new(), boot_nodes: Vec::new(), - node_key: NodeKeyConfig::Secp256k1(Secret::New), + node_key: NodeKeyConfig::Ed25519(Secret::New), in_peers: 25, out_peers: 75, reserved_nodes: Vec::new(), @@ -167,7 +168,8 @@ impl NodeKeyConfig { Secp256k1(Secret::File(f)) => get_secret(f, |mut b| secp256k1::SecretKey::from_bytes(&mut b), - secp256k1::SecretKey::generate) + secp256k1::SecretKey::generate, + |b| b.to_bytes().to_vec()) .map(secp256k1::Keypair::from) .map(Keypair::Secp256k1), @@ -180,7 +182,8 @@ impl NodeKeyConfig { Ed25519(Secret::File(f)) => get_secret(f, |mut b| ed25519::SecretKey::from_bytes(&mut b), - ed25519::SecretKey::generate) + ed25519::SecretKey::generate, + |b| b.as_ref().to_vec()) .map(ed25519::Keypair::from) .map(Keypair::Ed25519), } @@ -190,13 +193,13 @@ impl NodeKeyConfig { /// Load a secret key from a file, if it exists, or generate a /// new secret key and write it to that file. In either case, /// the secret key is returned. -fn get_secret(file: P, parse: F, generate: G) -> io::Result +fn get_secret(file: P, parse: F, generate: G, serialize: W) -> io::Result where P: AsRef, F: for<'r> FnOnce(&'r mut [u8]) -> Result, G: FnOnce() -> K, E: Error + Send + Sync + 'static, - K: AsRef<[u8]> + W: Fn(&K) -> Vec, { std::fs::read(&file) .and_then(|mut sk_bytes| @@ -206,7 +209,9 @@ where if e.kind() == io::ErrorKind::NotFound { file.as_ref().parent().map_or(Ok(()), fs::create_dir_all)?; let sk = generate(); - write_secret_file(file, sk.as_ref())?; + let mut sk_vec = serialize(&sk); + write_secret_file(file, &sk_vec)?; + sk_vec.zeroize(); Ok(sk) } else { Err(e) @@ -257,7 +262,7 @@ mod tests { fn secret_bytes(kp: &Keypair) -> Vec { match kp { Keypair::Ed25519(p) => p.secret().as_ref().iter().cloned().collect(), - Keypair::Secp256k1(p) => p.secret().as_ref().iter().cloned().collect(), + Keypair::Secp256k1(p) => p.secret().to_bytes().to_vec(), _ => panic!("Unexpected keypair.") } } diff --git a/core/network-libp2p/src/custom_proto/behaviour.rs b/core/network-libp2p/src/custom_proto/behaviour.rs index 7f29711a51405521f092dd679d833b2f2567471a..0aa6ed9544740d61fafee1ffa6a390782d3ff092 100644 --- a/core/network-libp2p/src/custom_proto/behaviour.rs +++ b/core/network-libp2p/src/custom_proto/behaviour.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use crate::DiscoveryNetBehaviour; use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use fnv::FnvHashMap; @@ -22,8 +23,9 @@ use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourActi use libp2p::core::{Multiaddr, PeerId}; use log::{debug, error, trace, warn}; use smallvec::SmallVec; -use std::{collections::hash_map::Entry, cmp, error, io, marker::PhantomData, mem, time::Duration, time::Instant}; +use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, time::Duration, time::Instant}; use tokio_io::{AsyncRead, AsyncWrite}; +use tokio_timer::clock::Clock; /// Network behaviour that handles opening substreams for custom protocols with other nodes. /// @@ -78,6 +80,9 @@ pub struct CustomProto { /// Marker to pin the generics. marker: PhantomData, + + /// `Clock` instance that uses the current execution context's source of time. + clock: Clock, } /// State of a peer we're connected to. @@ -149,6 +154,22 @@ enum PeerState { }, } +impl PeerState { + /// True if we have an open channel with that node. + fn is_open(&self) -> bool { + match self { + PeerState::Poisoned => false, + PeerState::Banned { .. } => false, + PeerState::PendingRequest { .. } => false, + PeerState::Requested => false, + PeerState::Disabled { open, .. } => *open, + PeerState::DisabledPendingEnable { open, .. } => *open, + PeerState::Enabled { open, .. } => *open, + PeerState::Incoming { .. } => false, + } + } +} + /// State of an "incoming" message sent to the peer set manager. #[derive(Debug)] struct IncomingPeer { @@ -178,8 +199,8 @@ pub enum CustomProtoOut { CustomProtocolClosed { /// Id of the peer we were connected to. peer_id: PeerId, - /// Reason why the substream closed. If `Ok`, then it's a graceful exit (EOF). - result: io::Result<()>, + /// Reason why the substream closed, for debugging purposes. + reason: Cow<'static, str>, }, /// Receives a message on a custom protocol substream. @@ -214,9 +235,20 @@ impl CustomProto { next_incoming_index: substrate_peerset::IncomingIndex(0), events: SmallVec::new(), marker: PhantomData, + clock: Clock::new(), } } + /// Returns the list of all the peers we have an open channel to. + pub fn open_peers<'a>(&'a self) -> impl Iterator + 'a { + self.peers.iter().filter(|(_, state)| state.is_open()).map(|(id, _)| id) + } + + /// Returns true if we have a channel open with this node. + pub fn is_open(&self, peer_id: &PeerId) -> bool { + self.peers.get(peer_id).map(|p| p.is_open()).unwrap_or(false) + } + /// Disconnects the given peer if we are connected to it. pub fn disconnect_peer(&mut self, peer_id: &PeerId) { debug!(target: "sub-libp2p", "External API => Disconnect {:?}", peer_id); @@ -244,7 +276,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); let banned_until = Some(if let Some(ban) = ban { - cmp::max(timer.deadline(), Instant::now() + ban) + cmp::max(timer.deadline(), self.clock.now() + ban) } else { timer.deadline() }); @@ -260,7 +292,8 @@ impl CustomProto { peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - let banned_until = ban.map(|dur| Instant::now() + dur); + let clock = &self.clock; + let banned_until = ban.map(|dur| clock.now() + dur); *entry.into_mut() = PeerState::Disabled { open, connected_point, banned_until } }, @@ -281,7 +314,8 @@ impl CustomProto { peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - let banned_until = ban.map(|dur| Instant::now() + dur); + let clock = &self.clock; + let banned_until = ban.map(|dur| clock.now() + dur); *entry.into_mut() = PeerState::Disabled { open: false, connected_point, banned_until } }, @@ -305,21 +339,6 @@ impl CustomProto { } } - /// Returns true if we have opened a protocol with the given peer. - pub fn is_open(&self, peer_id: &PeerId) -> bool { - match self.peers.get(peer_id) { - None => false, - Some(PeerState::Disabled { open, .. }) => *open, - Some(PeerState::DisabledPendingEnable { open, .. }) => *open, - Some(PeerState::Enabled { open, .. }) => *open, - Some(PeerState::Incoming { .. }) => false, - Some(PeerState::Requested) => false, - Some(PeerState::PendingRequest { .. }) => false, - Some(PeerState::Banned { .. }) => false, - Some(PeerState::Poisoned) => false, - } - } - /// Sends a message to a peer. /// /// Has no effect if the custom protocol is not open with the given peer. @@ -341,16 +360,8 @@ impl CustomProto { }); } - /// Indicates to the peerset that we have discovered new addresses for a given node. - pub fn add_discovered_nodes>(&mut self, peer_ids: I) { - self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { - debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); - peer_id - })); - } - /// Returns the state of the peerset manager, for debugging purposes. - pub fn peerset_debug_info(&self) -> serde_json::Value { + pub fn peerset_debug_info(&mut self) -> serde_json::Value { self.peerset.debug_info() } @@ -369,7 +380,7 @@ impl CustomProto { }; match mem::replace(occ_entry.get_mut(), PeerState::Poisoned) { - PeerState::Banned { ref until } if *until > Instant::now() => { + PeerState::Banned { ref until } if *until > self.clock.now() => { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \ until {:?}", occ_entry.key(), until); *occ_entry.into_mut() = PeerState::PendingRequest { @@ -385,7 +396,7 @@ impl CustomProto { }, PeerState::Disabled { open, ref connected_point, banned_until: Some(ref banned) } - if *banned > Instant::now() => { + if *banned > self.clock.now() => { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Has idle connection through \ {:?} but node is banned until {:?}", occ_entry.key(), connected_point, banned); *occ_entry.into_mut() = PeerState::DisabledPendingEnable { @@ -588,6 +599,15 @@ impl CustomProto { } } +impl DiscoveryNetBehaviour for CustomProto { + fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { + self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { + debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); + peer_id + })); + } +} + impl NetworkBehaviour for CustomProto where TSubstream: AsyncRead + AsyncWrite, @@ -605,31 +625,25 @@ where } fn inject_connected(&mut self, peer_id: PeerId, connected_point: ConnectedPoint) { - match (self.peers.entry(peer_id), connected_point) { - (Entry::Occupied(mut entry), connected_point) => { - match mem::replace(entry.get_mut(), PeerState::Poisoned) { - PeerState::Requested | PeerState::PendingRequest { .. } | - PeerState::Banned { .. } => { - debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Connection \ - requested by PSM (through {:?})", entry.key(), connected_point); - debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", entry.key()); - self.events.push(NetworkBehaviourAction::SendEvent { - peer_id: entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), - }); - *entry.into_mut() = PeerState::Enabled { open: false, connected_point }; - } - st @ _ => { - // This is a serious bug either in this state machine or in libp2p. - error!(target: "sub-libp2p", "Received inject_connected for \ - already-connected node; state is {:?}", st); - *entry.into_mut() = st; - return - } - } + match (self.peers.entry(peer_id.clone()).or_insert(PeerState::Poisoned), connected_point) { + (st @ &mut PeerState::Requested, connected_point) | + (st @ &mut PeerState::PendingRequest { .. }, connected_point) => { + debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Connection \ + requested by PSM (through {:?})", peer_id, connected_point + ); + debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", peer_id); + self.events.push(NetworkBehaviourAction::SendEvent { + peer_id: peer_id.clone(), + event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + }); + *st = PeerState::Enabled { open: false, connected_point }; } - (Entry::Vacant(entry), connected_point @ ConnectedPoint::Listener { .. }) => { + // Note: it may seem weird that "Banned" nodes get treated as if there were absent. + // This is because the word "Banned" means "temporarily prevent outgoing connections to + // this node", and not "banned" in the sense that we would refuse the node altogether. + (st @ &mut PeerState::Poisoned, connected_point @ ConnectedPoint::Listener { .. }) | + (st @ &mut PeerState::Banned { .. }, connected_point @ ConnectedPoint::Listener { .. }) => { let incoming_id = self.next_incoming_index.clone(); self.next_incoming_index.0 = match self.next_incoming_index.0.checked_add(1) { Some(v) => v, @@ -639,27 +653,40 @@ where } }; debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Incoming connection", - entry.key()); + peer_id); debug!(target: "sub-libp2p", "PSM <= Incoming({:?}, {:?}): Through {:?}", - incoming_id, entry.key(), connected_point); - self.peerset.incoming(entry.key().clone(), incoming_id); + incoming_id, peer_id, connected_point); + self.peerset.incoming(peer_id.clone(), incoming_id); self.incoming.push(IncomingPeer { - peer_id: entry.key().clone(), + peer_id: peer_id.clone(), alive: true, incoming_id, }); - entry.insert(PeerState::Incoming { connected_point }); + *st = PeerState::Incoming { connected_point }; } - (Entry::Vacant(entry), connected_point) => { + (st @ &mut PeerState::Poisoned, connected_point) | + (st @ &mut PeerState::Banned { .. }, connected_point) => { + let banned_until = if let PeerState::Banned { until } = st { + Some(*until) + } else { + None + }; debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Requested by something \ - else than PSM, disabling", entry.key()); - debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", entry.key()); + else than PSM, disabling", peer_id); + debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", peer_id); self.events.push(NetworkBehaviourAction::SendEvent { - peer_id: entry.key().clone(), + peer_id: peer_id.clone(), event: CustomProtoHandlerIn::Disable, }); - entry.insert(PeerState::Disabled { open: false, connected_point, banned_until: None }); + *st = PeerState::Disabled { open: false, connected_point, banned_until }; + } + + st => { + // This is a serious bug either in this state machine or in libp2p. + error!(target: "sub-libp2p", "Received inject_connected for \ + already-connected node; state is {:?}", st + ); } } } @@ -682,7 +709,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = CustomProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), - result: Ok(()), + reason: "Disconnected by libp2p".into(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); @@ -699,7 +726,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = CustomProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), - result: Ok(()), + reason: "Disconnected by libp2p".into(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); @@ -716,7 +743,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", peer_id); let event = CustomProtoOut::CustomProtocolClosed { peer_id: peer_id.clone(), - result: Ok(()), + reason: "Disconnected by libp2p".into(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); @@ -758,7 +785,7 @@ where PeerState::Requested | PeerState::PendingRequest { .. } => { debug!(target: "sub-libp2p", "Libp2p => Dial failure for {:?}", peer_id); *entry.into_mut() = PeerState::Banned { - until: Instant::now() + Duration::from_secs(5) + until: self.clock.now() + Duration::from_secs(5) }; debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()) @@ -788,8 +815,8 @@ where event: CustomProtoHandlerOut, ) { match event { - CustomProtoHandlerOut::CustomProtocolClosed { result } => { - debug!(target: "sub-libp2p", "Handler({:?}) => Closed({:?})", source, result); + CustomProtoHandlerOut::CustomProtocolClosed { reason } => { + debug!(target: "sub-libp2p", "Handler({:?}) => Closed: {}", source, reason); let mut entry = if let Entry::Occupied(entry) = self.peers.entry(source.clone()) { entry @@ -800,7 +827,7 @@ where debug!(target: "sub-libp2p", "External API <= Closed({:?})", source); let event = CustomProtoOut::CustomProtocolClosed { - result, + reason, peer_id: source.clone(), }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); diff --git a/core/network-libp2p/src/custom_proto/handler.rs b/core/network-libp2p/src/custom_proto/handler.rs index 969df7799b592b108c8a4f0d7e76675504c5cbc4..01644f6214231a394b6b2f0b356046b99bb178ab 100644 --- a/core/network-libp2p/src/custom_proto/handler.rs +++ b/core/network-libp2p/src/custom_proto/handler.rs @@ -14,22 +14,22 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crate::custom_proto::upgrade::{CustomMessage, CustomMessageId, RegisteredProtocol}; +use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use crate::custom_proto::upgrade::{RegisteredProtocolEvent, RegisteredProtocolSubstream}; use futures::prelude::*; use libp2p::core::{ - PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, + ConnectedPoint, PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, protocols_handler::IntoProtocolsHandler, protocols_handler::KeepAlive, protocols_handler::ProtocolsHandlerUpgrErr, + protocols_handler::SubstreamProtocol, upgrade::{InboundUpgrade, OutboundUpgrade} }; -use log::{debug, error, warn}; +use log::{debug, error}; use smallvec::{smallvec, SmallVec}; -use std::{error, fmt, io, marker::PhantomData, mem, time::Duration, time::Instant}; +use std::{borrow::Cow, error, fmt, io, marker::PhantomData, mem, time::Duration}; use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::Delay; -use void::Void; +use tokio_timer::{Delay, clock::Clock}; /// Implements the `IntoProtocolsHandler` trait of libp2p. /// @@ -68,26 +68,22 @@ use void::Void; /// /// ## How it works /// -/// For backwards compatibility reasons, the behaviour of the handler is quite complicated. After -/// enough nodes have upgraded, it should be simplified by using helpers provided by libp2p. -/// /// When the handler is created, it is initially in the `Init` state and waits for either a /// `Disable` or an `Enable` message from the outer layer. At any time, the outer layer is free to /// toggle the handler between the disabled and enabled states. /// -/// When the handler is enabled for the first time, if it is the dialer of the connection, it tries -/// to open a substream. The substream negotiates either a protocol named `/substrate/xxx` or a -/// protocol named `/substrate/multi/xxx`. If it is the former, then we are in -/// "backwards-compatibility mode". If it is the latter, we are in normal operation mode. +/// When the handler switches to "enabled", it opens a substream and negotiates the protocol named +/// `/substrate/xxx`, where `xxx` is chosen by the user and depends on the chain. +/// +/// For backwards compatibility reasons, when we switch to "enabled" for the first time (while we +/// are still in "init" mode) and we are the connection listener, we don't open a substream. /// -/// In "backwards-compatibility mode", we have one unique substream where bidirectional -/// communications happen. If the remote closes the substream, we consider that we are now -/// disconnected. Re-enabling is performed by re-opening the substream. +/// In order the handle the situation where both the remote and us get enabled at the same time, +/// we tolerate multiple substreams open at the same time. Messages are transmitted on an arbitrary +/// substream. The endpoints don't try to agree on a single substream. /// -/// In normal operation mode, each request gets sent over a different substream where the response -/// is then sent back. If the remote refuses one of our substream open request, or if an error -/// happens on one substream, we consider that we are disconnected. Re-enabling is performed by -/// opening an outbound substream. +/// We consider that we are now "closed" if the remote closes all the existing substreams. +/// Re-opening it can then be performed by closing all active substream and re-opening one. /// pub struct CustomProtoHandlerProto { /// Configuration for the protocol upgrade to negotiate. @@ -118,16 +114,21 @@ where { type Handler = CustomProtoHandler; - fn into_handler(self, remote_peer_id: &PeerId) -> Self::Handler { + fn inbound_protocol(&self) -> RegisteredProtocol { + self.protocol.clone() + } + + fn into_handler(self, remote_peer_id: &PeerId, _: &ConnectedPoint) -> Self::Handler { + let clock = Clock::new(); CustomProtoHandler { protocol: self.protocol, remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), - init_deadline: Delay::new(Instant::now() + Duration::from_secs(5)) + init_deadline: Delay::new(clock.now() + Duration::from_secs(5)) }, events_queue: SmallVec::new(), - warm_up_end: Instant::now() + Duration::from_secs(5), + clock, } } } @@ -150,9 +151,8 @@ pub struct CustomProtoHandler { /// element. events_queue: SmallVec<[ProtocolsHandlerEvent, (), CustomProtoHandlerOut>; 16]>, - /// We have a warm-up period after creating the handler during which we don't shut down the - /// connection. - warm_up_end: Instant, + /// `Clock` instance that uses the current execution context's source of time. + clock: Clock, } /// State of the handler. @@ -172,19 +172,15 @@ enum ProtocolState { deadline: Delay, }, - /// Backwards-compatible mode. Contains the unique substream that is open. + /// Normal operating mode. Contains the substreams that are open. /// If we are in this state, we have sent a `CustomProtocolOpen` message to the outside. - BackCompat { - /// The unique substream where bidirectional communications happen. - substream: RegisteredProtocolSubstream, + Normal { + /// The substreams where bidirectional communications happen. + substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, /// Contains substreams which are being shut down. shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, }, - /// Normal functionning. Contains the substreams that are open. - /// If we are in this state, we have sent a `CustomProtocolOpen` message to the outside. - Normal(PerProtocolNormalState), - /// We are disabled. Contains substreams that are being closed. /// If we are in this state, either we have sent a `CustomProtocolClosed` message to the /// outside or we have never sent any `CustomProtocolOpen` in the first place. @@ -200,133 +196,15 @@ enum ProtocolState { reenable: bool, }, + /// In this state, we don't care about anything anymore and need to kill the connection as soon + /// as possible. + KillAsap, + /// We sometimes temporarily switch to this state during processing. If we are in this state - /// at the beginning of a method, that means something bad happend in the source code. + /// at the beginning of a method, that means something bad happened in the source code. Poisoned, } -/// Normal functionning mode for a protocol. -struct PerProtocolNormalState { - /// Optional substream that we opened. - outgoing_substream: Option>, - - /// Substreams that have been opened by the remote. We are waiting for a packet from it. - incoming_substreams: SmallVec<[RegisteredProtocolSubstream; 4]>, - - /// For each request that has been sent to the remote, contains the substream where we - /// expect a response. - pending_response: SmallVec<[(u64, RegisteredProtocolSubstream); 4]>, - - /// For each request received by the remote, contains the substream where to send back our - /// response. Once a response has been sent, the substream closes. - pending_send_back: SmallVec<[(u64, RegisteredProtocolSubstream); 4]>, - - /// List of messages waiting for a substream to open in order to be sent. - pending_messages: SmallVec<[TMessage; 6]>, - - /// Contains substreams which are being shut down. - shutdown: SmallVec<[RegisteredProtocolSubstream; 4]>, -} - -impl PerProtocolNormalState -where TMessage: CustomMessage, TSubstream: AsyncRead + AsyncWrite { - /// Polls for things that are new. Same API constraints as `Future::poll()`. - /// Optionally returns the event to produce. - /// You must pass the `protocol_id` as we need have to inject it in the returned event. - /// API note: Ideally we wouldn't need to be passed a `ProtocolId`, and we would return a - /// different enum that doesn't contain any `protocol_id`, and the caller would inject - /// the ID itself, but that's a ton of code for not much gain. - fn poll(&mut self) -> Option> { - for n in (0..self.pending_response.len()).rev() { - let (request_id, mut substream) = self.pending_response.swap_remove(n); - match substream.poll() { - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { - if message.request_id() == CustomMessageId::Response(request_id) { - let event = CustomProtoHandlerOut::CustomMessage { - message - }; - self.shutdown.push(substream); - return Some(event); - } else { - self.shutdown.push(substream); - let event = CustomProtoHandlerOut::ProtocolError { - is_severe: true, - error: format!("Request ID doesn't match substream: expected {:?}, \ - got {:?}", request_id, message.request_id()).into(), - }; - return Some(event); - } - }, - Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { .. }))) => - unreachable!("Cannot receive Clogged message with new protocol version; QED"), - Ok(Async::NotReady) => - self.pending_response.push((request_id, substream)), - Ok(Async::Ready(None)) => { - self.shutdown.push(substream); - let event = CustomProtoHandlerOut::ProtocolError { - is_severe: false, - error: format!("Request ID {:?} didn't receive an answer", request_id).into(), - }; - return Some(event); - } - Err(err) => { - self.shutdown.push(substream); - let event = CustomProtoHandlerOut::ProtocolError { - is_severe: false, - error: format!("Error while waiting for an answer for {:?}: {}", - request_id, err).into(), - }; - return Some(event); - } - } - } - - for n in (0..self.incoming_substreams.len()).rev() { - let mut substream = self.incoming_substreams.swap_remove(n); - match substream.poll() { - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { - return match message.request_id() { - CustomMessageId::Request(id) => { - self.pending_send_back.push((id, substream)); - Some(CustomProtoHandlerOut::CustomMessage { - message - }) - } - CustomMessageId::OneWay => { - self.shutdown.push(substream); - Some(CustomProtoHandlerOut::CustomMessage { - message - }) - } - _ => { - self.shutdown.push(substream); - Some(CustomProtoHandlerOut::ProtocolError { - is_severe: true, - error: format!("Received response in new substream").into(), - }) - } - } - }, - Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { .. }))) => - unreachable!("Cannot receive Clogged message with new protocol version; QED"), - Ok(Async::NotReady) => - self.incoming_substreams.push(substream), - Ok(Async::Ready(None)) => {} - Err(err) => { - self.shutdown.push(substream); - return Some(CustomProtoHandlerOut::ProtocolError { - is_severe: false, - error: format!("Error in incoming substream: {}", err).into(), - }); - } - } - } - - shutdown_list(&mut self.shutdown); - None - } -} - /// Event that can be received by a `CustomProtoHandler`. #[derive(Debug)] pub enum CustomProtoHandlerIn { @@ -355,8 +233,8 @@ pub enum CustomProtoHandlerOut { /// Closed a custom protocol with the remote. CustomProtocolClosed { - /// Reason why the substream closed. If `Ok`, then it's a graceful exit (EOF). - result: io::Result<()>, + /// Reason why the substream closed, for diagnostic purposes. + reason: Cow<'static, str>, }, /// Receives a message on a custom protocol substream. @@ -399,43 +277,28 @@ where if incoming.is_empty() { if let Endpoint::Dialer = endpoint { self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { - upgrade: self.protocol.clone(), + protocol: SubstreamProtocol::new(self.protocol.clone()), info: (), }); } ProtocolState::Opening { - deadline: Delay::new(Instant::now() + Duration::from_secs(60)) + deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) } - } else if incoming.iter().any(|s| s.is_multiplex()) { - let event = CustomProtoHandlerOut::CustomProtocolOpen { - version: incoming[0].protocol_version() - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Normal(PerProtocolNormalState { - outgoing_substream: None, - incoming_substreams: incoming.into_iter().collect(), - pending_response: SmallVec::new(), - pending_send_back: SmallVec::new(), - pending_messages: SmallVec::new(), - shutdown: SmallVec::new(), - }) - } else { let event = CustomProtoHandlerOut::CustomProtocolOpen { version: incoming[0].protocol_version() }; self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::BackCompat { - substream: incoming.into_iter().next() - .expect("We have a check above that incoming isn't empty; QED"), + ProtocolState::Normal { + substreams: incoming.into_iter().collect(), shutdown: SmallVec::new() } } } + st @ ProtocolState::KillAsap => st, st @ ProtocolState::Opening { .. } => st, - st @ ProtocolState::BackCompat { .. } => st, st @ ProtocolState::Normal { .. } => st, ProtocolState::Disabled { shutdown, .. } => { ProtocolState::Disabled { shutdown, reenable: true } @@ -459,42 +322,18 @@ where ProtocolState::Disabled { shutdown, reenable: false } } - ProtocolState::Opening { .. } => { - ProtocolState::Disabled { shutdown: SmallVec::new(), reenable: false } - } - - ProtocolState::BackCompat { mut substream, mut shutdown } => { - substream.shutdown(); - shutdown.push(substream); - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Ok(()) - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { - shutdown: shutdown.into_iter().collect(), - reenable: false - } - } - - ProtocolState::Normal(state) => { - let mut out: SmallVec<[_; 6]> = SmallVec::new(); - out.extend(state.outgoing_substream.into_iter()); - out.extend(state.incoming_substreams.into_iter()); - out.extend(state.pending_response.into_iter().map(|(_, s)| s)); - out.extend(state.pending_send_back.into_iter().map(|(_, s)| s)); - for s in &mut out { - s.shutdown(); - } - out.extend(state.shutdown.into_iter()); - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Ok(()) - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { shutdown: out, reenable: false } - } + ProtocolState::Opening { .. } | ProtocolState::Normal { .. } => + // At the moment, if we get disabled while things were working, we kill the entire + // connection in order to force a reset of the state. + // This is obviously an extremely shameful way to do things, but at the time of + // the writing of this comment, the networking works very poorly and a solution + // needs to be found. + ProtocolState::KillAsap, ProtocolState::Disabled { shutdown, .. } => ProtocolState::Disabled { shutdown, reenable: false }, + + ProtocolState::KillAsap => ProtocolState::KillAsap, }; } @@ -502,19 +341,18 @@ where #[must_use] fn poll_state(&mut self) -> Option, (), CustomProtoHandlerOut>> { - let return_value; - self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { + match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", self.remote_peer_id); - return_value = None; - ProtocolState::Poisoned + self.state = ProtocolState::Poisoned; + None } ProtocolState::Init { substreams, mut init_deadline } => { match init_deadline.poll() { Ok(Async::Ready(())) => { - init_deadline.reset(Instant::now() + Duration::from_secs(60)); + init_deadline.reset(self.clock.now() + Duration::from_secs(60)); error!(target: "sub-libp2p", "Handler initialization process is too long \ with {:?}", self.remote_peer_id) }, @@ -522,85 +360,88 @@ where Err(_) => error!(target: "sub-libp2p", "Tokio timer has errored") } - return_value = None; - ProtocolState::Init { substreams, init_deadline } + self.state = ProtocolState::Init { substreams, init_deadline }; + None } ProtocolState::Opening { mut deadline } => { match deadline.poll() { Ok(Async::Ready(())) => { - deadline.reset(Instant::now() + Duration::from_secs(60)); + deadline.reset(self.clock.now() + Duration::from_secs(60)); let event = CustomProtoHandlerOut::ProtocolError { is_severe: true, error: "Timeout when opening protocol".to_string().into(), }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Opening { deadline } + self.state = ProtocolState::Opening { deadline }; + Some(ProtocolsHandlerEvent::Custom(event)) }, Ok(Async::NotReady) => { - return_value = None; - ProtocolState::Opening { deadline } + self.state = ProtocolState::Opening { deadline }; + None }, Err(_) => { error!(target: "sub-libp2p", "Tokio timer has errored"); - deadline.reset(Instant::now() + Duration::from_secs(60)); - return_value = None; - ProtocolState::Opening { deadline } + deadline.reset(self.clock.now() + Duration::from_secs(60)); + self.state = ProtocolState::Opening { deadline }; + None }, } } - ProtocolState::BackCompat { mut substream, shutdown } => { - match substream.poll() { - Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { - let event = CustomProtoHandlerOut::CustomMessage { - message - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::BackCompat { substream, shutdown } - }, - Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages }))) => { - let event = CustomProtoHandlerOut::Clogged { - messages, - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::BackCompat { substream, shutdown } - } - Ok(Async::NotReady) => { - return_value = None; - ProtocolState::BackCompat { substream, shutdown } - } - Ok(Async::Ready(None)) => { - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Ok(()) - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { - shutdown: shutdown.into_iter().collect(), - reenable: true + ProtocolState::Normal { mut substreams, mut shutdown } => { + for n in (0..substreams.len()).rev() { + let mut substream = substreams.swap_remove(n); + match substream.poll() { + Ok(Async::NotReady) => substreams.push(substream), + Ok(Async::Ready(Some(RegisteredProtocolEvent::Message(message)))) => { + let event = CustomProtoHandlerOut::CustomMessage { + message + }; + substreams.push(substream); + self.state = ProtocolState::Normal { substreams, shutdown }; + return Some(ProtocolsHandlerEvent::Custom(event)); + }, + Ok(Async::Ready(Some(RegisteredProtocolEvent::Clogged { messages }))) => { + let event = CustomProtoHandlerOut::Clogged { + messages, + }; + substreams.push(substream); + self.state = ProtocolState::Normal { substreams, shutdown }; + return Some(ProtocolsHandlerEvent::Custom(event)); } - } - Err(err) => { - let event = CustomProtoHandlerOut::CustomProtocolClosed { - result: Err(err), - }; - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - ProtocolState::Disabled { - shutdown: shutdown.into_iter().collect(), - reenable: true + Ok(Async::Ready(None)) => { + shutdown.push(substream); + if substreams.is_empty() { + let event = CustomProtoHandlerOut::CustomProtocolClosed { + reason: "All substreams have been closed by the remote".into(), + }; + self.state = ProtocolState::Disabled { + shutdown: shutdown.into_iter().collect(), + reenable: true + }; + return Some(ProtocolsHandlerEvent::Custom(event)); + } + } + Err(err) => { + if substreams.is_empty() { + let event = CustomProtoHandlerOut::CustomProtocolClosed { + reason: format!("Error on the last substream: {:?}", err).into(), + }; + self.state = ProtocolState::Disabled { + shutdown: shutdown.into_iter().collect(), + reenable: true + }; + return Some(ProtocolsHandlerEvent::Custom(event)); + } else { + debug!(target: "sub-libp2p", "Error on extra substream: {:?}", err); + } } } } - } - ProtocolState::Normal(mut norm_state) => { - if let Some(event) = norm_state.poll() { - return_value = Some(ProtocolsHandlerEvent::Custom(event)); - } else { - return_value = None; - } - - ProtocolState::Normal(norm_state) + // This code is reached is none if and only if none of the substreams are in a ready state. + self.state = ProtocolState::Normal { substreams, shutdown }; + None } ProtocolState::Disabled { mut shutdown, reenable } => { @@ -608,21 +449,21 @@ where // If `reenable` is `true`, that means we should open the substreams system again // after all the substreams are closed. if reenable && shutdown.is_empty() { - return_value = Some(ProtocolsHandlerEvent::OutboundSubstreamRequest { - upgrade: self.protocol.clone(), + self.state = ProtocolState::Opening { + deadline: Delay::new(self.clock.now() + Duration::from_secs(60)) + }; + Some(ProtocolsHandlerEvent::OutboundSubstreamRequest { + protocol: SubstreamProtocol::new(self.protocol.clone()), info: (), - }); - ProtocolState::Opening { - deadline: Delay::new(Instant::now() + Duration::from_secs(60)) - } + }) } else { - return_value = None; - ProtocolState::Disabled { shutdown, reenable } + self.state = ProtocolState::Disabled { shutdown, reenable }; + None } } - }; - return_value + ProtocolState::KillAsap => None, + } } /// Called by `inject_fully_negotiated_inbound` and `inject_fully_negotiated_outbound`. @@ -651,65 +492,15 @@ where version: substream.protocol_version() }; self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - - match (substream.endpoint(), substream.is_multiplex()) { - (Endpoint::Dialer, true) => { - ProtocolState::Normal(PerProtocolNormalState { - outgoing_substream: Some(substream), - incoming_substreams: SmallVec::new(), - pending_response: SmallVec::new(), - pending_send_back: SmallVec::new(), - pending_messages: SmallVec::new(), - shutdown: SmallVec::new(), - }) - }, - (Endpoint::Listener, true) => { - ProtocolState::Normal(PerProtocolNormalState { - outgoing_substream: None, - incoming_substreams: smallvec![substream], - pending_response: SmallVec::new(), - pending_send_back: SmallVec::new(), - pending_messages: SmallVec::new(), - shutdown: SmallVec::new(), - }) - }, - (_, false) => { - ProtocolState::BackCompat { - substream, - shutdown: SmallVec::new() - } - }, + ProtocolState::Normal { + substreams: smallvec![substream], + shutdown: SmallVec::new() } } - ProtocolState::BackCompat { substream: existing, mut shutdown } => { - warn!(target: "sub-libp2p", "Received extra substream after having already one \ - open in backwards-compatibility mode with {:?}", self.remote_peer_id); - substream.shutdown(); - shutdown.push(substream); - ProtocolState::BackCompat { substream: existing, shutdown } - } - - ProtocolState::Normal(mut state) => { - if substream.endpoint() == Endpoint::Listener { - state.incoming_substreams.push(substream); - } else if !state.pending_messages.is_empty() { - let message = state.pending_messages.remove(0); - let request_id = message.request_id(); - substream.send_message(message); - if let CustomMessageId::Request(request_id) = request_id { - state.pending_response.push((request_id, substream)); - } else { - state.shutdown.push(substream); - } - } else { - debug!(target: "sub-libp2p", "Opened spurious outbound substream with {:?}", - self.remote_peer_id); - substream.shutdown(); - state.shutdown.push(substream); - } - - ProtocolState::Normal(state) + ProtocolState::Normal { substreams: mut existing, shutdown } => { + existing.push(substream); + ProtocolState::Normal { substreams: existing, shutdown } } ProtocolState::Disabled { mut shutdown, .. } => { @@ -717,59 +508,16 @@ where shutdown.push(substream); ProtocolState::Disabled { shutdown, reenable: false } } + + ProtocolState::KillAsap => ProtocolState::KillAsap, }; } /// Sends a message to the remote. fn send_message(&mut self, message: TMessage) { match self.state { - ProtocolState::BackCompat { ref mut substream, .. } => - substream.send_message(message), - - ProtocolState::Normal(ref mut state) => { - if let CustomMessageId::Request(request_id) = message.request_id() { - if let Some(mut outgoing_substream) = state.outgoing_substream.take() { - outgoing_substream.send_message(message); - state.pending_response.push((request_id, outgoing_substream)); - } else { - if state.pending_messages.len() >= 2048 { - let event = CustomProtoHandlerOut::Clogged { - messages: Vec::new(), - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - } - state.pending_messages.push(message); - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { - upgrade: self.protocol.clone(), - info: () - }); - } - } else if let CustomMessageId::Response(request_id) = message.request_id() { - if let Some(pos) = state.pending_send_back.iter().position(|(id, _)| *id == request_id) { - let (_, mut substream) = state.pending_send_back.remove(pos); - substream.send_message(message); - state.shutdown.push(substream); - } else { - warn!(target: "sub-libp2p", "Libp2p layer received response to a \ - non-existing request ID {:?} with {:?}", request_id, self.remote_peer_id); - } - } else if let Some(mut outgoing_substream) = state.outgoing_substream.take() { - outgoing_substream.send_message(message); - state.shutdown.push(outgoing_substream); - } else { - if state.pending_messages.len() >= 2048 { - let event = CustomProtoHandlerOut::Clogged { - messages: Vec::new(), - }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); - } - state.pending_messages.push(message); - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { - upgrade: self.protocol.clone(), - info: () - }); - } - } + ProtocolState::Normal { ref mut substreams, .. } => + substreams[0].send_message(message), _ => debug!(target: "sub-libp2p", "Tried to send message over closed protocol \ with {:?}", self.remote_peer_id) @@ -782,13 +530,13 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { type InEvent = CustomProtoHandlerIn; type OutEvent = CustomProtoHandlerOut; type Substream = TSubstream; - type Error = Void; + type Error = ConnectionKillError; type InboundProtocol = RegisteredProtocol; type OutboundProtocol = RegisteredProtocol; type OutboundOpenInfo = (); - fn listen_protocol(&self) -> Self::InboundProtocol { - self.protocol.clone() + fn listen_protocol(&self) -> SubstreamProtocol { + SubstreamProtocol::new(self.protocol.clone()) } fn inject_fully_negotiated_inbound( @@ -829,23 +577,11 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { } fn connection_keep_alive(&self) -> KeepAlive { - if self.warm_up_end >= Instant::now() { - return KeepAlive::Until(self.warm_up_end) - } - - let mut keep_forever = false; - match self.state { - ProtocolState::Init { .. } | ProtocolState::Opening { .. } => {} - ProtocolState::BackCompat { .. } | ProtocolState::Normal { .. } => - keep_forever = true, - ProtocolState::Disabled { .. } | ProtocolState::Poisoned => return KeepAlive::Now, - } - - if keep_forever { - KeepAlive::Forever - } else { - KeepAlive::Now + ProtocolState::Init { .. } | ProtocolState::Opening { .. } | + ProtocolState::Normal { .. } => KeepAlive::Yes, + ProtocolState::Disabled { .. } | ProtocolState::Poisoned | + ProtocolState::KillAsap => KeepAlive::No, } } @@ -861,6 +597,11 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { return Ok(Async::Ready(event)) } + // Kill the connection if needed. + if let ProtocolState::KillAsap = self.state { + return Err(ConnectionKillError); + } + // Process all the substreams. if let Some(event) = self.poll_state() { return Ok(Async::Ready(event)) @@ -897,3 +638,16 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { list.push(substream); } } + +/// Error returned when switching from normal to disabled. +#[derive(Debug)] +pub struct ConnectionKillError; + +impl error::Error for ConnectionKillError { +} + +impl fmt::Display for ConnectionKillError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Connection kill when switching from normal to disabled") + } +} diff --git a/core/network-libp2p/src/custom_proto/mod.rs b/core/network-libp2p/src/custom_proto/mod.rs index cf2bf57153cc3ec0dfec5ffa2df713907b071a55..261f710d8d46b47497b32b1410211f2e1de366f0 100644 --- a/core/network-libp2p/src/custom_proto/mod.rs +++ b/core/network-libp2p/src/custom_proto/mod.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . pub use self::behaviour::{CustomProto, CustomProtoOut}; -pub use self::upgrade::{CustomMessage, CustomMessageId, RegisteredProtocol}; +pub use self::upgrade::{CustomMessage, RegisteredProtocol}; mod behaviour; mod handler; diff --git a/core/network-libp2p/src/custom_proto/upgrade.rs b/core/network-libp2p/src/custom_proto/upgrade.rs index fc9ed5bddb1b70d8149660b496b98abb4a4b2d5b..bc61ff74e89f826b0fed41cc99a8c4ef7ac0ce0a 100644 --- a/core/network-libp2p/src/custom_proto/upgrade.rs +++ b/core/network-libp2p/src/custom_proto/upgrade.rs @@ -19,7 +19,7 @@ use bytes::Bytes; use libp2p::core::{Negotiated, Endpoint, UpgradeInfo, InboundUpgrade, OutboundUpgrade, upgrade::ProtocolName}; use libp2p::tokio_codec::Framed; use log::warn; -use std::{collections::VecDeque, io, iter, marker::PhantomData, vec::IntoIter as VecIntoIter}; +use std::{collections::VecDeque, io, marker::PhantomData, vec::IntoIter as VecIntoIter}; use futures::{prelude::*, future, stream}; use tokio_io::{AsyncRead, AsyncWrite}; use unsigned_varint::codec::UviBytes; @@ -44,10 +44,11 @@ pub struct RegisteredProtocol { impl RegisteredProtocol { /// Creates a new `RegisteredProtocol`. The `custom_data` parameter will be /// passed inside the `RegisteredProtocolOutput`. - pub fn new(protocol: ProtocolId, versions: &[u8]) + pub fn new(protocol: impl Into, versions: &[u8]) -> Self { + let protocol = protocol.into(); let mut base_name = Bytes::from_static(b"/substrate/"); - base_name.extend_from_slice(&protocol); + base_name.extend_from_slice(protocol.as_bytes()); base_name.extend_from_slice(b"/"); RegisteredProtocol { @@ -63,16 +64,15 @@ impl RegisteredProtocol { } /// Returns the ID of the protocol. - #[inline] - pub fn id(&self) -> ProtocolId { - self.id + pub fn id(&self) -> &ProtocolId { + &self.id } } impl Clone for RegisteredProtocol { fn clone(&self) -> Self { RegisteredProtocol { - id: self.id, + id: self.id.clone(), base_name: self.base_name.clone(), supported_versions: self.supported_versions.clone(), marker: PhantomData, @@ -100,9 +100,6 @@ pub struct RegisteredProtocolSubstream { /// If true, we have sent a "remote is clogged" event recently and shouldn't send another one /// unless the buffer empties then fills itself again. clogged_fuse: bool, - /// If true, then this substream uses the "/multi/" version of the protocol. This is a hint - /// that the handler can behave differently. - is_multiplex: bool, /// Marker to pin the generic. marker: PhantomData, } @@ -110,8 +107,8 @@ pub struct RegisteredProtocolSubstream { impl RegisteredProtocolSubstream { /// Returns the protocol id. #[inline] - pub fn protocol_id(&self) -> ProtocolId { - self.protocol_id + pub fn protocol_id(&self) -> &ProtocolId { + &self.protocol_id } /// Returns the version of the protocol that was negotiated. @@ -126,12 +123,6 @@ impl RegisteredProtocolSubstream { self.endpoint } - /// Returns true if we negotiated the "multiplexed" version. This means that the handler can - /// open multiple substreams instead of just one. - pub fn is_multiplex(&self) -> bool { - self.is_multiplex - } - /// Starts a graceful shutdown process on this substream. /// /// Note that "graceful" means that we sent a closing message. We don't wait for any @@ -162,31 +153,9 @@ pub trait CustomMessage { /// Tries to parse `bytes` received from the network into a message. fn from_bytes(bytes: &[u8]) -> Result where Self: Sized; - - /// Returns a unique ID that is used to match request and responses. - /// - /// The networking layer employs multiplexing in order to have multiple parallel data streams. - /// Transmitting messages over the network uses two kinds of substreams: - /// - /// - Undirectional substreams, where we send a single message then close the substream. - /// - Bidirectional substreams, where we send a message then wait for a response. Once the - /// response has arrived, we close the substream. - /// - /// If `request_id()` returns `OneWay`, then this message will be sent or received over a - /// unidirectional substream. If instead it returns `Request` or `Response`, then we use the - /// value to match a request with its response. - fn request_id(&self) -> CustomMessageId; } -/// See the documentation of `CustomMessage::request_id`. -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -pub enum CustomMessageId { - OneWay, - Request(u64), - Response(u64), -} - -// These trait implementations exist mostly for testing convenience. This should eventually be +// This trait implementation exist mostly for testing convenience. This should eventually be // removed. impl CustomMessage for Vec { @@ -197,45 +166,6 @@ impl CustomMessage for Vec { fn from_bytes(bytes: &[u8]) -> Result { Ok(bytes.to_vec()) } - - fn request_id(&self) -> CustomMessageId { - CustomMessageId::OneWay - } -} - -impl CustomMessage for (Option, Vec) { - fn into_bytes(self) -> Vec { - use byteorder::WriteBytesExt; - use std::io::Write; - let mut out = Vec::new(); - out.write_u64::(self.0.unwrap_or(u64::max_value())) - .expect("Writing to a Vec can never fail"); - out.write_all(&self.1).expect("Writing to a Vec can never fail"); - out - } - - fn from_bytes(bytes: &[u8]) -> Result { - use byteorder::ReadBytesExt; - use std::io::Read; - let mut rdr = std::io::Cursor::new(bytes); - let id = rdr.read_u64::().map_err(|_| ())?; - let mut out = Vec::new(); - rdr.read_to_end(&mut out).map_err(|_| ())?; - let id = if id == u64::max_value() { - None - } else { - Some(id) - }; - Ok((id, out)) - } - - fn request_id(&self) -> CustomMessageId { - if let Some(id) = self.0 { - CustomMessageId::Request(id) - } else { - CustomMessageId::OneWay - } - } } /// Event produced by the `RegisteredProtocolSubstream`. @@ -328,33 +258,15 @@ impl UpgradeInfo for RegisteredProtocol { #[inline] fn protocol_info(&self) -> Self::InfoIter { // Report each version as an individual protocol. - self.supported_versions.iter().flat_map(|&version| { + self.supported_versions.iter().map(|&version| { let num = version.to_string(); - // Note that `name1` is the multiplex version, as we priviledge it over the old one. - let mut name1 = self.base_name.clone(); - name1.extend_from_slice(b"multi/"); - name1.extend_from_slice(num.as_bytes()); - let proto1 = RegisteredProtocolName { - name: name1, + let mut name = self.base_name.clone(); + name.extend_from_slice(num.as_bytes()); + RegisteredProtocolName { + name, version, - is_multiplex: true, - }; - - let mut name2 = self.base_name.clone(); - name2.extend_from_slice(num.as_bytes()); - let proto2 = RegisteredProtocolName { - name: name2, - version, - is_multiplex: false, - }; - - // Important note: we prioritize the backwards compatible mode for now. - // After some intensive testing has been done, we should switch to the new mode by - // default. - // Then finally we can remove the old mode after everyone has switched. - // See https://github.com/paritytech/substrate/issues/1692 - iter::once(proto2).chain(iter::once(proto1)) + } }).collect::>().into_iter() } } @@ -366,8 +278,6 @@ pub struct RegisteredProtocolName { name: Bytes, /// Version number. Stored in string form in `name`, but duplicated here for easier retrieval. version: u8, - /// If true, then this version is the one with the multiplexing. - is_multiplex: bool, } impl ProtocolName for RegisteredProtocolName { @@ -403,7 +313,6 @@ where TSubstream: AsyncRead + AsyncWrite, protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, - is_multiplex: info.is_multiplex, marker: PhantomData, }) } @@ -432,7 +341,6 @@ where TSubstream: AsyncRead + AsyncWrite, protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, - is_multiplex: info.is_multiplex, marker: PhantomData, }) } diff --git a/core/network-libp2p/src/lib.rs b/core/network-libp2p/src/lib.rs index 6a3c94933a5a639aa4540f599eb8ff22f36e5e1c..540d8d7f0b17e841b11ab66009f768126a3895d3 100644 --- a/core/network-libp2p/src/lib.rs +++ b/core/network-libp2p/src/lib.rs @@ -15,6 +15,91 @@ // along with Substrate. If not, see . //! Networking layer of Substrate. +//! +//! # Overview +//! +//! This crate handles the following network mechanisms: +//! +//! - Discovering nodes that are part of the network. +//! - Connecting to said nodes and accepting incoming connections. +//! - Encrypting communications between nodes. +//! - Ensure that nodes are really the `PeerId` that they pretend to be. +//! - Ensuring that the nodes belong to the same chain as us before reporting a new connection. +//! +//! From the point of view of our node, each other node on the network has a reputation value in +//! the form of an `i32`. We try to establish connections towards nodes with a higher reputation +//! over nodes with a lower reputation. +//! +//! Establishing connections to other nodes is automatically performed by this crate, and there is +//! no way to influence this, except by adjusting reputations. +//! +//! ## About the term "connecting" +//! +//! The documentation of this crate uses the words "connected" and "disconnected". It is important +//! to note that this doesn't correspond to actual TCP/IP connections and disconnections. Libp2p +//! will maintain connections that aren't reported by the API of this crate, and TCP/IP connections +//! can be kept alive even after we have reported a disconnect in order to potentially reuse them. +//! +//! # Usage +//! +//! > **Important**: This crate is unstable and the API and usage may change. +//! +//! The first step is to crate a [`RegisteredProtocol`] describing the protocol, and a +//! [`NetworkConfiguration`] describing the network. Then call [`start_service`] with them, which +//! returns a [`Service`] object and a [`substrate_peerset::PeersetHandle`]. +//! +//! The former allows you to know what happens on the network and to send messages, while the +//! latter can be used to adjust the reputations of nodes. +//! +//! You must call the `poll` method of [`Service`] in order to make the network progress and in +//! order to update the internal state of the [`Service`]. Calling `poll` will produce +//! [`ServiceEvent`]s, which inform you of what happened on the network. +//! +//! Please keep in mind that the state of the [`Service`] only updates itself in a way +//! corresponding to the [`ServiceEvent`] that `poll` returns. +//! +//! Illustration: +//! +//! - You call [`Service::connected_peers`] to get the list of nodes we are connected to. +//! - If you then call [`Service::connected_peers`] again, the returned list will always be the +//! same, no matter what happened on the wire. +//! - If you then call [`Service::poll`] and a [`ServiceEvent::OpenedCustomProtocol`] event is +//! returned, then the concerned node, and only the concerned node, will be added to the list of +//! nodes we are connected to. +//! - Similarly, if [`Service::poll`] produces a [`ServiceEvent::ClosedCustomProtocol`] event, then +//! only the concerned node will disappear from the list. +//! - And if [`Service::poll`] returns neither [`ServiceEvent::OpenedCustomProtocol`] nor +//! [`ServiceEvent::ClosedCustomProtocol`], then the list of connected nodes doesn't change. +//! +//! ## Example +//! +//! ```no_run +//! # use futures::prelude::*; +//! use substrate_network_libp2p::ServiceEvent; +//! +//! let proto = substrate_network_libp2p::RegisteredProtocol::new(&b"hello"[..], &[0]); +//! let config = substrate_network_libp2p::NetworkConfiguration::default(); +//! let (mut service, _peerset) = substrate_network_libp2p::start_service(config, proto).unwrap(); +//! +//! tokio::run(futures::future::poll_fn(move || { +//! loop { +//! match service.poll().unwrap() { +//! Async::NotReady => return Ok(Async::NotReady), +//! Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { peer_id, .. })) => { +//! println!("now connected to {:?}", peer_id); +//! service.send_custom_message(&peer_id, b"hello world!".to_vec()); +//! } +//! Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { peer_id, .. })) => +//! println!("now disconnected from {:?}", peer_id), +//! Async::Ready(Some(ServiceEvent::CustomMessage { peer_id, message })) => +//! println!("received message from {:?}: {:?}", peer_id, message), +//! Async::Ready(None) => return Ok(Async::Ready(())), +//! _ => {} +//! } +//! } +//! })); +//! ``` +//! mod behaviour; mod config; @@ -22,20 +107,45 @@ mod custom_proto; mod service_task; mod transport; -pub use crate::behaviour::Severity; pub use crate::config::*; -pub use crate::custom_proto::{CustomMessage, CustomMessageId, RegisteredProtocol}; +pub use crate::custom_proto::{CustomMessage, RegisteredProtocol}; pub use crate::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPeerMode}; pub use crate::service_task::{start_service, Service, ServiceEvent}; pub use libp2p::{Multiaddr, multiaddr, build_multiaddr}; pub use libp2p::{identity, PeerId, core::PublicKey}; use libp2p::core::nodes::ConnectedPoint; -use serde_derive::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; +use slog_derive::SerdeValue; use std::{collections::{HashMap, HashSet}, error, fmt, time::Duration}; -/// Protocol / handler id -pub type ProtocolId = [u8; 3]; +/// Extension trait for `NetworkBehaviour` that also accepts discovering nodes. +pub trait DiscoveryNetBehaviour { + /// Notify the protocol that we have learned about the existence of nodes. + /// + /// Can (or most likely will) be called multiple times with the same `PeerId`s. + /// + /// Also note that there is no notification for expired nodes. The implementer must add a TTL + /// system, or remove nodes that will fail to reach. + fn add_discovered_nodes(&mut self, nodes: impl Iterator); +} + +/// Name of a protocol, transmitted on the wire. Should be unique for each chain. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ProtocolId(smallvec::SmallVec<[u8; 6]>); + +impl<'a> From<&'a [u8]> for ProtocolId { + fn from(bytes: &'a [u8]) -> ProtocolId { + ProtocolId(bytes.into()) + } +} + +impl ProtocolId { + /// Exposes the `ProtocolId` as bytes. + pub fn as_bytes(&self) -> &[u8] { + self.0.as_ref() + } +} /// Parses a string address and returns the component, if valid. pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { @@ -92,7 +202,7 @@ impl From for ParseErr { /// Meant for general diagnostic purposes. /// /// **Warning**: This API is not stable. -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, SerdeValue)] #[serde(rename_all = "camelCase")] pub struct NetworkState { /// PeerId of the local node. @@ -113,7 +223,7 @@ pub struct NetworkState { pub peerset: serde_json::Value, } -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NetworkStatePeer { /// How we are connected to the node. @@ -132,14 +242,18 @@ pub struct NetworkStatePeer { pub known_addresses: HashSet, } -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NetworkStateNotConnectedPeer { /// List of addresses known for this node. pub known_addresses: HashSet, + /// Node information, as provided by the node itself, if we were ever connected to this node. + pub version_string: Option, + /// Latest ping duration with this node, if we were ever connected to this node. + pub latest_ping_time: Option, } -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum NetworkStatePeerEndpoint { /// We are dialing the given address. @@ -160,8 +274,8 @@ impl From for NetworkStatePeerEndpoint { NetworkStatePeerEndpoint::Dialing(address), ConnectedPoint::Listener { listen_addr, send_back_addr } => NetworkStatePeerEndpoint::Listening { - listen_addr: listen_addr, - send_back_addr: send_back_addr + listen_addr, + send_back_addr } } } diff --git a/core/network-libp2p/src/service_task.rs b/core/network-libp2p/src/service_task.rs index d9d65e6af86d5af7374452b50cf15c8933407109..5a6fb6978cfdb631aa18e5085c4d32082db29c39 100644 --- a/core/network-libp2p/src/service_task.rs +++ b/core/network-libp2p/src/service_task.rs @@ -15,22 +15,20 @@ // along with Substrate. If not, see . use crate::{ - behaviour::Behaviour, behaviour::BehaviourOut, + behaviour::Behaviour, transport, NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer }; -use crate::custom_proto::{CustomMessage, RegisteredProtocol}; +use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage, RegisteredProtocol}; use crate::{NetworkConfiguration, NonReservedPeerMode, parse_str_addr}; -use fnv::FnvHashMap; use futures::{prelude::*, Stream}; -use libp2p::{multiaddr::Protocol, Multiaddr, core::swarm::NetworkBehaviour, PeerId}; +use libp2p::{Multiaddr, core::swarm::NetworkBehaviour, PeerId}; use libp2p::core::{Swarm, nodes::Substream, transport::boxed::Boxed, muxing::StreamMuxerBox}; use libp2p::core::nodes::ConnectedPoint; -use log::{debug, info, warn}; +use log::{info, error, warn}; use std::fs; use std::io::Error as IoError; use std::path::Path; use std::sync::Arc; -use std::time::Duration; /// Starts the substrate libp2p service. /// @@ -84,23 +82,21 @@ where TMessage: CustomMessage + Send + 'static { let local_identity = config.node_key.clone().into_keypair()?; let local_public = local_identity.public(); let local_peer_id = local_public.clone().into_peer_id(); + info!(target: "sub-libp2p", "Local node identity is: {}", local_peer_id.to_base58()); // Build the swarm. let (mut swarm, bandwidth) = { let user_agent = format!("{} ({})", config.client_version, config.node_name); - let behaviour = Behaviour::new(user_agent, local_public, registered_custom, known_addresses, peerset, config.enable_mdns); + let proto = CustomProto::new(registered_custom, peerset); + let behaviour = Behaviour::new(proto, user_agent, local_public, known_addresses, config.enable_mdns); let (transport, bandwidth) = transport::build_transport(local_identity); (Swarm::new(transport, behaviour, local_peer_id.clone()), bandwidth) }; // Listen on multiaddresses. for addr in &config.listen_addresses { - match Swarm::listen_on(&mut swarm, addr.clone()) { - Ok(mut new_addr) => { - new_addr.append(Protocol::P2p(local_peer_id.clone().into())); - info!(target: "sub-libp2p", "Local node address is: {}", new_addr); - }, - Err(err) => warn!(target: "sub-libp2p", "Can't listen on {} because: {:?}", addr, err) + if let Err(err) = Swarm::listen_on(&mut swarm, addr.clone()) { + warn!(target: "sub-libp2p", "Can't listen on {} because: {:?}", addr, err) } } @@ -112,7 +108,6 @@ where TMessage: CustomMessage + Send + 'static { let service = Service { swarm, bandwidth, - nodes_info: Default::default(), injected_events: Vec::new(), }; @@ -160,57 +155,57 @@ pub enum ServiceEvent { /// Network service. Must be polled regularly in order for the networking to work. pub struct Service where TMessage: CustomMessage { /// Stream of events of the swarm. - swarm: Swarm, Behaviour>>, + swarm: Swarm< + Boxed<(PeerId, StreamMuxerBox), IoError>, + Behaviour>, CustomProtoOut, Substream> + >, /// Bandwidth logging system. Can be queried to know the average bandwidth consumed. bandwidth: Arc, - /// Information about all the nodes we're connected to. - nodes_info: FnvHashMap, - /// Events to produce on the Stream. injected_events: Vec>, } -/// Information about a node we're connected to. -#[derive(Debug)] -struct NodeInfo { - /// How we're connected to the node. - endpoint: ConnectedPoint, - /// Version reported by the remote, or `None` if unknown. - client_version: Option, - /// Latest ping time with this node. - latest_ping: Option, -} - impl Service where TMessage: CustomMessage + Send + 'static { /// Returns a struct containing tons of useful information about the network. pub fn state(&mut self) -> NetworkState { + let open = self.swarm.user_protocol().open_peers().cloned().collect::>(); + let connected_peers = { let swarm = &mut self.swarm; - self.nodes_info.iter().map(move |(peer_id, info)| { + open.iter().filter_map(move |peer_id| { let known_addresses = NetworkBehaviour::addresses_of_peer(&mut **swarm, peer_id) .into_iter().collect(); - (peer_id.to_base58(), NetworkStatePeer { - endpoint: info.endpoint.clone().into(), - version_string: info.client_version.clone(), - latest_ping_time: info.latest_ping, - enabled: swarm.is_enabled(&peer_id), - open: swarm.is_open(&peer_id), + let endpoint = if let Some(e) = swarm.node(peer_id).map(|i| i.endpoint()) { + e.clone().into() + } else { + error!(target: "sub-libp2p", "Found state inconsistency between custom protocol \ + and debug information about {:?}", peer_id); + return None + }; + + Some((peer_id.to_base58(), NetworkStatePeer { + endpoint, + version_string: swarm.node(peer_id).and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + latest_ping_time: swarm.node(peer_id).and_then(|i| i.latest_ping()), + enabled: swarm.user_protocol().is_enabled(&peer_id), + open: swarm.user_protocol().is_open(&peer_id), known_addresses, - }) + })) }).collect() }; let not_connected_peers = { let swarm = &mut self.swarm; - let nodes_info = &self.nodes_info; - let list = swarm.known_peers().filter(|p| !nodes_info.contains_key(p)) + let list = swarm.known_peers().filter(|p| !open.iter().all(|n| n != *p)) .cloned().collect::>(); list.into_iter().map(move |peer_id| { (peer_id.to_base58(), NetworkStateNotConnectedPeer { + version_string: swarm.node(&peer_id).and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + latest_ping_time: swarm.node(&peer_id).and_then(|i| i.latest_ping()), known_addresses: NetworkBehaviour::addresses_of_peer(&mut **swarm, &peer_id) .into_iter().collect(), }) @@ -225,7 +220,7 @@ where TMessage: CustomMessage + Send + 'static { average_upload_per_sec: self.bandwidth.average_upload_per_sec(), connected_peers, not_connected_peers, - peerset: self.swarm.peerset_debug_info(), + peerset: self.swarm.user_protocol_mut().peerset_debug_info(), } } @@ -248,27 +243,28 @@ where TMessage: CustomMessage + Send + 'static { } /// Returns the peer id of the local node. - #[inline] pub fn peer_id(&self) -> &PeerId { Swarm::local_peer_id(&self.swarm) } /// Returns the list of all the peers we are connected to. - #[inline] pub fn connected_peers<'a>(&'a self) -> impl Iterator + 'a { - self.nodes_info.keys() + self.swarm.user_protocol().open_peers() } - /// Returns the way we are connected to a node. - #[inline] + /// Returns the way we are connected to a node. Returns `None` if we are not connected to it. pub fn node_endpoint(&self, peer_id: &PeerId) -> Option<&ConnectedPoint> { - self.nodes_info.get(peer_id).map(|info| &info.endpoint) + if self.swarm.user_protocol().is_open(peer_id) { + self.swarm.node(peer_id).map(|n| n.endpoint()) + } else { + None + } } - /// Returns the client version reported by a node. + /// Returns the latest client version reported by a node. Can return `Some` even for nodes + /// we're not connected to. pub fn node_client_version(&self, peer_id: &PeerId) -> Option<&str> { - self.nodes_info.get(peer_id) - .and_then(|info| info.client_version.as_ref().map(|s| &s[..])) + self.swarm.node(peer_id).and_then(|n| n.client_version()) } /// Sends a message to a peer using the custom protocol. @@ -280,7 +276,7 @@ where TMessage: CustomMessage + Send + 'static { peer_id: &PeerId, message: TMessage ) { - self.swarm.send_custom_message(peer_id, message); + self.swarm.user_protocol_mut().send_packet(peer_id, message); } /// Disconnects a peer. @@ -288,11 +284,7 @@ where TMessage: CustomMessage + Send + 'static { /// This is asynchronous and will not immediately close the peer. /// Corresponding closing events will be generated once the closing actually happens. pub fn drop_node(&mut self, peer_id: &PeerId) { - if let Some(info) = self.nodes_info.get(peer_id) { - debug!(target: "sub-libp2p", "Dropping {:?} on purpose ({:?}, {:?})", - peer_id, info.endpoint, info.client_version); - self.swarm.drop_node(peer_id); - } + self.swarm.user_protocol_mut().disconnect_peer(peer_id); } /// Adds a hard-coded address for the given peer, that never expires. @@ -302,10 +294,10 @@ where TMessage: CustomMessage + Send + 'static { /// Get debug info for a given peer. pub fn peer_debug_info(&self, who: &PeerId) -> String { - if let Some(info) = self.nodes_info.get(who) { - format!("{:?} (version: {:?}) through {:?}", who, info.client_version, info.endpoint) + if let Some(node) = self.swarm.node(who) { + format!("{:?} {}", who, node.debug_info()) } else { - "unknown".to_string() + format!("{:?} (unknown)", who) } } @@ -313,12 +305,7 @@ where TMessage: CustomMessage + Send + 'static { fn poll_swarm(&mut self) -> Poll>, IoError> { loop { match self.swarm.poll() { - Ok(Async::Ready(Some(BehaviourOut::CustomProtocolOpen { peer_id, version, endpoint }))) => { - self.nodes_info.insert(peer_id.clone(), NodeInfo { - endpoint, - client_version: None, - latest_ping: None, - }); + Ok(Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { peer_id, version, .. }))) => { let debug_info = self.peer_debug_info(&peer_id); break Ok(Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { peer_id, @@ -326,42 +313,25 @@ where TMessage: CustomMessage + Send + 'static { debug_info, }))) } - Ok(Async::Ready(Some(BehaviourOut::CustomProtocolClosed { peer_id, .. }))) => { + Ok(Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { peer_id, .. }))) => { let debug_info = self.peer_debug_info(&peer_id); - self.nodes_info.remove(&peer_id); break Ok(Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { peer_id, debug_info, }))) } - Ok(Async::Ready(Some(BehaviourOut::CustomMessage { peer_id, message }))) => { + Ok(Async::Ready(Some(CustomProtoOut::CustomMessage { peer_id, message }))) => { break Ok(Async::Ready(Some(ServiceEvent::CustomMessage { peer_id, message, }))) } - Ok(Async::Ready(Some(BehaviourOut::Clogged { peer_id, messages }))) => { + Ok(Async::Ready(Some(CustomProtoOut::Clogged { peer_id, messages }))) => { break Ok(Async::Ready(Some(ServiceEvent::Clogged { peer_id, messages, }))) } - Ok(Async::Ready(Some(BehaviourOut::Identified { peer_id, info }))) => { - // Contrary to the other events, this one can happen even on nodes which don't - // have any open custom protocol slot. Therefore it is not necessarily in the - // list. - if let Some(n) = self.nodes_info.get_mut(&peer_id) { - n.client_version = Some(info.agent_version); - } - } - Ok(Async::Ready(Some(BehaviourOut::PingSuccess { peer_id, ping_time }))) => { - // Contrary to the other events, this one can happen even on nodes which don't - // have any open custom protocol slot. Therefore it is not necessarily in the - // list. - if let Some(n) = self.nodes_info.get_mut(&peer_id) { - n.latest_ping = Some(ping_time); - } - } Ok(Async::NotReady) => break Ok(Async::NotReady), Ok(Async::Ready(None)) => unreachable!("The Swarm stream never ends"), Err(_) => unreachable!("The Swarm never errors"), diff --git a/core/network-libp2p/src/transport.rs b/core/network-libp2p/src/transport.rs index 404fdb6bdaad8d9244ee1dca62ac8e2aa70863d3..1e8b280f3b089fd49bca1c6775c998fa5b569794 100644 --- a/core/network-libp2p/src/transport.rs +++ b/core/network-libp2p/src/transport.rs @@ -17,8 +17,10 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - mplex, identity, secio, yamux, tcp, dns, websocket, bandwidth + mplex, identity, secio, yamux, websocket, bandwidth }; +#[cfg(not(target_os = "unknown"))] +use libp2p::{tcp, dns}; use libp2p::core::{self, transport::boxed::Boxed, muxing::StreamMuxerBox}; use std::{io, sync::Arc, time::Duration, usize}; @@ -35,9 +37,15 @@ pub fn build_transport( mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block); mplex_config.max_buffer_len(usize::MAX); - let transport = tcp::TcpConfig::new(); - let transport = websocket::WsConfig::new(transport.clone()).or_transport(transport); - let transport = dns::DnsConfig::new(transport); + #[cfg(not(target_os = "unknown"))] + let transport = { + let transport = tcp::TcpConfig::new(); + let transport = websocket::WsConfig::new(transport.clone()).or_transport(transport); + dns::DnsConfig::new(transport) + }; + #[cfg(target_os = "unknown")] + let transport = websocket::BrowserWsConfig::new(); + let (transport, sinks) = bandwidth::BandwidthLogging::new(transport, Duration::from_secs(5)); // TODO: rework the transport creation (https://github.com/libp2p/rust-libp2p/issues/783) diff --git a/core/network-libp2p/tests/test.rs b/core/network-libp2p/tests/test.rs index 437f65118455d648129c5027f06ac64e8858a853..36e00e13189ac6082eb9ee5699902d5304402989 100644 --- a/core/network-libp2p/tests/test.rs +++ b/core/network-libp2p/tests/test.rs @@ -16,31 +16,37 @@ use futures::{future, stream, prelude::*, try_ready}; use rand::seq::SliceRandom; -use std::io; -use substrate_network_libp2p::{CustomMessage, multiaddr::Protocol, ServiceEvent, build_multiaddr}; +use std::{io, time::Duration, time::Instant}; +use substrate_network_libp2p::{CustomMessage, Multiaddr, multiaddr::Protocol, ServiceEvent, build_multiaddr}; /// Builds two services. The second one and further have the first one as its bootstrap node. /// This is to be used only for testing, and a panic will happen if something goes wrong. -fn build_nodes(num: usize) -> Vec> +fn build_nodes(num: usize, base_port: u16) -> Vec> where TMsg: CustomMessage + Send + 'static { let mut result: Vec> = Vec::with_capacity(num); + let mut first_addr = None::; - for _ in 0 .. num { + for index in 0 .. num { let mut boot_nodes = Vec::new(); - if !result.is_empty() { - let mut bootnode = result[0].listeners().next().unwrap().clone(); - bootnode.append(Protocol::P2p(result[0].peer_id().clone().into())); - boot_nodes.push(bootnode.to_string()); + + if let Some(first_addr) = first_addr.as_ref() { + boot_nodes.push(first_addr.clone() + .with(Protocol::P2p(result[0].peer_id().clone().into())) + .to_string()); } let config = substrate_network_libp2p::NetworkConfiguration { - listen_addresses: vec![build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0u16)]], + listen_addresses: vec![build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(base_port + index as u16)]], boot_nodes, ..substrate_network_libp2p::NetworkConfiguration::default() }; - let proto = substrate_network_libp2p::RegisteredProtocol::new(*b"tst", &[1]); + if first_addr.is_none() { + first_addr = Some(config.listen_addresses.iter().next().unwrap().clone()); + } + + let proto = substrate_network_libp2p::RegisteredProtocol::new(&b"tst"[..], &[1]); result.push(substrate_network_libp2p::start_service(config, proto).unwrap().0); } @@ -50,7 +56,7 @@ fn build_nodes(num: usize) -> Vec> #[test] fn basic_two_nodes_connectivity() { let (mut service1, mut service2) = { - let mut l = build_nodes::>(2).into_iter(); + let mut l = build_nodes::>(2, 50400).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -90,7 +96,7 @@ fn two_nodes_transfer_lots_of_packets() { const NUM_PACKETS: u32 = 5000; let (mut service1, mut service2) = { - let mut l = build_nodes::>(2).into_iter(); + let mut l = build_nodes::>(2, 50450).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -138,13 +144,13 @@ fn many_nodes_connectivity() { // increased in the `NetworkConfiguration`. const NUM_NODES: usize = 25; - let mut futures = build_nodes::>(NUM_NODES) + let mut futures = build_nodes::>(NUM_NODES, 50500) .into_iter() .map(move |mut node| { let mut num_connecs = 0; stream::poll_fn(move || -> io::Result<_> { loop { - const MAX_BANDWIDTH: u64 = NUM_NODES as u64 * 1024; // 1kiB/s/node + const MAX_BANDWIDTH: u64 = NUM_NODES as u64 * 2048; // 2kiB/s/node assert!(node.average_download_per_sec() < MAX_BANDWIDTH); assert!(node.average_upload_per_sec() < MAX_BANDWIDTH); @@ -194,7 +200,7 @@ fn many_nodes_connectivity() { #[test] fn basic_two_nodes_requests_in_parallel() { let (mut service1, mut service2) = { - let mut l = build_nodes::<(Option, Vec)>(2).into_iter(); + let mut l = build_nodes::>(2, 50550).into_iter(); let a = l.next().unwrap(); let b = l.next().unwrap(); (a, b) @@ -203,17 +209,8 @@ fn basic_two_nodes_requests_in_parallel() { // Generate random messages with or without a request id. let mut to_send = { let mut to_send = Vec::new(); - let mut next_id = 0; for _ in 0..200 { // Note: don't make that number too high or the CPU usage will explode. - let id = if rand::random::() % 4 != 0 { - let i = next_id; - next_id += 1; - Some(i) - } else { - None - }; - - let msg = (id, (0..10).map(|_| rand::random::()).collect::>()); + let msg = (0..10).map(|_| rand::random::()).collect::>(); to_send.push(msg); } to_send @@ -256,3 +253,107 @@ fn basic_two_nodes_requests_in_parallel() { let combined = fut1.select(fut2).map_err(|(err, _)| err); tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap(); } + +#[test] +fn reconnect_after_disconnect() { + // We connect two nodes together, then force a disconnect (through the API of the `Service`), + // check that the disconnect worked, and finally check whether they successfully reconnect. + + let (mut service1, mut service2) = { + let mut l = build_nodes::>(2, 50350).into_iter(); + let a = l.next().unwrap(); + let b = l.next().unwrap(); + (a, b) + }; + + // We use the `current_thread` runtime because it doesn't require us to have `'static` futures. + let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); + + // For this test, the services can be in the following states. + #[derive(Debug, Copy, Clone, PartialEq, Eq)] + enum ServiceState { NotConnected, FirstConnec, Disconnected, ConnectedAgain } + let mut service1_state = ServiceState::NotConnected; + let mut service2_state = ServiceState::NotConnected; + + // Run the events loops. + runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { + loop { + let mut service1_not_ready = false; + + match service1.poll().unwrap() { + Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { + match service1_state { + ServiceState::NotConnected => { + service1_state = ServiceState::FirstConnec; + if service2_state == ServiceState::FirstConnec { + service1.drop_node(service2.peer_id()); + } + }, + ServiceState::Disconnected => service1_state = ServiceState::ConnectedAgain, + ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), + } + }, + Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { + match service1_state { + ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, + ServiceState::ConnectedAgain| ServiceState::NotConnected | + ServiceState::Disconnected => panic!(), + } + }, + Async::NotReady => service1_not_ready = true, + _ => panic!() + } + + match service2.poll().unwrap() { + Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { + match service2_state { + ServiceState::NotConnected => { + service2_state = ServiceState::FirstConnec; + if service1_state == ServiceState::FirstConnec { + service1.drop_node(service2.peer_id()); + } + }, + ServiceState::Disconnected => service2_state = ServiceState::ConnectedAgain, + ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), + } + }, + Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { + match service2_state { + ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, + ServiceState::ConnectedAgain| ServiceState::NotConnected | + ServiceState::Disconnected => panic!(), + } + }, + Async::NotReady if service1_not_ready => break, + Async::NotReady => {} + _ => panic!() + } + } + + if service1_state == ServiceState::ConnectedAgain && service2_state == ServiceState::ConnectedAgain { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + })).unwrap(); + + // Do a second 3-seconds run to make sure we don't get disconnected immediately again. + let mut delay = tokio::timer::Delay::new(Instant::now() + Duration::from_secs(3)); + runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { + match service1.poll().unwrap() { + Async::NotReady => {}, + _ => panic!() + } + + match service2.poll().unwrap() { + Async::NotReady => {}, + _ => panic!() + } + + if let Async::Ready(()) = delay.poll().unwrap() { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + })).unwrap(); +} diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index a477373d6d2e9cfec975e5e868ddc4f1bc9dd623..d3b7a71f03e72c88e12af281bf2204390b5a5b4a 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate network protocol" name = "substrate-network" -version = "0.1.0" +version = "2.0.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" @@ -9,10 +9,9 @@ edition = "2018" [lib] [dependencies] -crossbeam-channel = "0.3.6" +derive_more = "0.14.0" log = "0.4" parking_lot = "0.7.1" -error-chain = "0.12" bitflags = "1.0" futures = "0.1.17" linked-hash-map = "0.5" @@ -31,12 +30,14 @@ peerset = { package = "substrate-peerset", path = "../../core/peerset" } tokio = "0.1.11" keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } test_client = { package = "substrate-test-client", path = "../../core/test-client", optional = true } +void = "1.0" [dev-dependencies] env_logger = { version = "0.6" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } test_client = { package = "substrate-test-client", path = "../../core/test-client" } +consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common", features = ["test-helpers"] } [features] default = [] -test-helpers = ["keyring", "test_client"] +test-helpers = ["keyring", "test_client", "consensus/test-helpers"] diff --git a/core/network/src/blocks.rs b/core/network/src/blocks.rs index 60c6886f09f27c210876825bcc4fa364235676e2..d693afba17b1cfc648f2a468866a295f76c1b1fc 100644 --- a/core/network/src/blocks.rs +++ b/core/network/src/blocks.rs @@ -21,7 +21,7 @@ use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use log::trace; use network_libp2p::PeerId; -use runtime_primitives::traits::{Block as BlockT, NumberFor, As}; +use runtime_primitives::traits::{Block as BlockT, NumberFor, One}; use crate::message; const MAX_PARALLEL_DOWNLOADS: u32 = 1; @@ -48,7 +48,7 @@ impl BlockRangeState { pub fn len(&self) -> NumberFor { match *self { BlockRangeState::Downloading { len, .. } => len, - BlockRangeState::Complete(ref blocks) => As::sa(blocks.len() as u64), + BlockRangeState::Complete(ref blocks) => (blocks.len() as u32).into(), } } } @@ -102,8 +102,8 @@ impl BlockCollection { /// Returns a set of block hashes that require a header download. The returned set is marked as being downloaded. pub fn needed_blocks(&mut self, who: PeerId, count: usize, peer_best: NumberFor, common: NumberFor) -> Option>> { // First block number that we need to download - let first_different = common + As::sa(1); - let count = As::sa(count as u64); + let first_different = common + >::one(); + let count = (count as u32).into(); let (mut range, downloading) = { let mut downloading_iter = self.blocks.iter().peekable(); let mut prev: Option<(&NumberFor, &BlockRangeState)> = None; @@ -132,7 +132,7 @@ impl BlockCollection { trace!(target: "sync", "Out of range for peer {} ({} vs {})", who, range.start, peer_best); return None; } - range.end = cmp::min(peer_best + As::sa(1), range.end); + range.end = cmp::min(peer_best + One::one(), range.end); self.peer_requests.insert(who, range.start); self.blocks.insert(range.start, BlockRangeState::Downloading { len: range.end - range.start, downloading: downloading + 1 }); if range.end <= range.start { @@ -150,7 +150,7 @@ impl BlockCollection { for (start, range_data) in &mut self.blocks { match range_data { &mut BlockRangeState::Complete(ref mut blocks) if *start <= prev => { - prev = *start + As::sa(blocks.len() as u64); + prev = *start + (blocks.len() as u32).into(); let mut blocks = mem::replace(blocks, Vec::new()); drained.append(&mut blocks); ranges.push(*start); diff --git a/core/network/src/chain.rs b/core/network/src/chain.rs index 92236e7c6384860a58ff93751b1483b306f979cf..9548afc9d1a237b154cab9ee1d0adaed9b4d5b82 100644 --- a/core/network/src/chain.rs +++ b/core/network/src/chain.rs @@ -68,6 +68,12 @@ pub trait Client: Send + Sync { fn is_descendent_of(&self, base: &Block::Hash, block: &Block::Hash) -> Result; } +/// Finality proof provider. +pub trait FinalityProofProvider: Send + Sync { + /// Prove finality of the block. + fn prove_finality(&self, for_block: Block::Hash, request: &[u8]) -> Result>, Error>; +} + impl Client for SubstrateClient where B: client::backend::Backend + Send + Sync + 'static, E: CallExecutor + Send + Sync + 'static, diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 2491fc21c4c0746747a6a49d8341a3393a886c88..a2a34780bf5fc730e490d46f575eabacd7d6fd48 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -19,9 +19,9 @@ pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfig, Secret}; use bitflags::bitflags; -use crate::chain::Client; +use crate::chain::{Client, FinalityProofProvider}; use parity_codec; -use crate::on_demand::OnDemandService; +use crate::on_demand_layer::OnDemand; use runtime_primitives::traits::{Block as BlockT}; use crate::service::{ExHashT, TransactionPool}; use std::sync::Arc; @@ -34,10 +34,12 @@ pub struct Params { pub network_config: NetworkConfiguration, /// Substrate relay chain access point. pub chain: Arc>, + /// Finality proof provider. + pub finality_proof_provider: Option>>, /// On-demand service reference. - pub on_demand: Option>>, + pub on_demand: Option>>, /// Transaction pool. - pub transaction_pool: Arc>, + pub transaction_pool: Arc>, /// Protocol specialization. pub specialization: S, } @@ -71,6 +73,18 @@ bitflags! { } } +impl Roles { + /// Does this role represents a client that holds full chain data locally? + pub fn is_full(&self) -> bool { + self.intersects(Roles::FULL | Roles::AUTHORITY) + } + + /// Does this role represents a client that does not hold full chain data locally? + pub fn is_light(&self) -> bool { + !self.is_full() + } +} + impl parity_codec::Encode for Roles { fn encode_to(&self, dest: &mut T) { dest.push_byte(self.bits()) diff --git a/core/network/src/consensus_gossip.rs b/core/network/src/consensus_gossip.rs index 745a644a9d05243ee8226dd24685faf11d50dfbf..c7747a91014a8e75c0b9b7d29f1d871aadb5494e 100644 --- a/core/network/src/consensus_gossip.rs +++ b/core/network/src/consensus_gossip.rs @@ -24,7 +24,7 @@ use std::time; use log::{trace, debug}; use futures::sync::mpsc; use lru_cache::LruCache; -use network_libp2p::{Severity, PeerId}; +use network_libp2p::PeerId; use runtime_primitives::traits::{Block as BlockT, Hash, HashFor}; use runtime_primitives::ConsensusEngineId; pub use crate::message::generic::{Message, ConsensusMessage}; @@ -35,6 +35,15 @@ use crate::config::Roles; const KNOWN_MESSAGES_CACHE_SIZE: usize = 4096; const REBROADCAST_INTERVAL: time::Duration = time::Duration::from_secs(30); +/// Reputation change when a peer sends us a gossip message that we didn't know about. +const GOSSIP_SUCCESS_REPUTATION_CHANGE: i32 = 1 << 4; +/// Reputation change when a peer sends us a gossip message that we already knew about. +const DUPLICATE_GOSSIP_REPUTATION_CHANGE: i32 = -(1 << 2); +/// Reputation change when a peer sends us a gossip message for an unknown engine, whatever that +/// means. +const UNKNOWN_GOSSIP_REPUTATION_CHANGE: i32 = -(1 << 6); +/// Reputation change when a peer sends a message from a topic it isn't registered on. +const UNREGISTERED_TOPIC_REPUTATION_CHANGE: i32 = -(1 << 10); struct PeerConsensus { known_messages: HashSet, @@ -123,10 +132,10 @@ impl<'g, 'p, B: BlockT> ValidatorContext for NetworkContext<'g, 'p, B> { /// Send addressed message to a peer. fn send_message(&mut self, who: &PeerId, message: Vec) { - self.protocol.send_message(who.clone(), Message::Consensus(ConsensusMessage { + self.protocol.send_consensus(who.clone(), ConsensusMessage { engine_id: self.engine_id, data: message, - })); + }); } /// Send all messages with given topic to a peer. @@ -183,7 +192,7 @@ fn propagate<'a, B: BlockT, I>( } peer.known_messages.insert(message_hash.clone()); trace!(target: "gossip", "Propagating to {}: {:?}", id, message); - protocol.send_message(id.clone(), Message::Consensus(message.clone())); + protocol.send_consensus(id.clone(), message.clone()); } } } @@ -256,6 +265,11 @@ impl ConsensusGossip { /// Handle new connected peer. pub fn new_peer(&mut self, protocol: &mut Context, who: PeerId, roles: Roles) { + // light nodes are not valid targets for consensus gossip messages + if !roles.is_full() { + return; + } + trace!(target:"gossip", "Registering {:?} {}", roles, who); self.peers.insert(who.clone(), PeerConsensus { known_messages: HashSet::new(), @@ -389,6 +403,7 @@ impl ConsensusGossip { if self.known_messages.contains_key(&message_hash) { trace!(target:"gossip", "Ignored already known message from {}", who); + protocol.report_peer(who.clone(), DUPLICATE_GOSSIP_REPUTATION_CHANGE); return; } @@ -406,17 +421,15 @@ impl ConsensusGossip { Some(ValidationResult::Discard) => None, None => { trace!(target:"gossip", "Unknown message engine id {:?} from {}", engine_id, who); - protocol.report_peer( - who, - Severity::Useless(format!("Sent unknown consensus engine id")), - ); + protocol.report_peer(who.clone(), UNKNOWN_GOSSIP_REPUTATION_CHANGE); + protocol.disconnect_peer(who); return; } }; if let Some((topic, keep)) = validation_result { + protocol.report_peer(who.clone(), GOSSIP_SUCCESS_REPUTATION_CHANGE); if let Some(ref mut peer) = self.peers.get_mut(&who) { - use std::collections::hash_map::Entry; peer.known_messages.insert(message_hash); if let Entry::Occupied(mut entry) = self.live_message_sinks.entry((engine_id, topic)) { debug!(target: "gossip", "Pushing consensus message to sinks for {}.", topic); @@ -438,6 +451,7 @@ impl ConsensusGossip { } } else { trace!(target:"gossip", "Ignored statement from unregistered peer {}", who); + protocol.report_peer(who.clone(), UNREGISTERED_TOPIC_REPUTATION_CHANGE); } } else { trace!(target:"gossip", "Handled valid one hop message from peer {}", who); @@ -446,17 +460,28 @@ impl ConsensusGossip { /// Send all messages with given topic to a peer. pub fn send_topic(&mut self, protocol: &mut Context, who: &PeerId, topic: B::Hash, engine_id: ConsensusEngineId, force: bool) { + let validator = self.validators.get(&engine_id); + let mut message_allowed = match validator { + None => return, // treat all messages with no validator as not allowed + Some(validator) => validator.message_allowed(), + }; + + let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::Broadcast }; + if let Some(ref mut peer) = self.peers.get_mut(who) { for entry in self.messages.iter().filter(|m| m.topic == topic && m.message.engine_id == engine_id) { if !force && peer.known_messages.contains(&entry.message_hash) { continue } + if !message_allowed(who, intent, &entry.topic, &entry.message.data) { + continue + } peer.known_messages.insert(entry.message_hash.clone()); trace!(target: "gossip", "Sending topic message to {}: {:?}", who, entry.message); - protocol.send_message(who.clone(), Message::Consensus(ConsensusMessage { + protocol.send_consensus(who.clone(), ConsensusMessage { engine_id: engine_id.clone(), data: entry.message.data.clone(), - })); + }); } } } @@ -493,7 +518,7 @@ impl ConsensusGossip { trace!(target: "gossip", "Sending direct to {}: {:?}", who, message); peer.known_messages.insert(message_hash); - protocol.send_message(who.clone(), Message::Consensus(message.clone())); + protocol.send_consensus(who.clone(), message.clone()); } } diff --git a/core/network/src/error.rs b/core/network/src/error.rs index bf687f99698e91a796c3edbf5af11b8314a3b221..95a1dc5abe76b42b450835212ba9b823a2020101 100644 --- a/core/network/src/error.rs +++ b/core/network/src/error.rs @@ -14,25 +14,27 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Substrate service possible errors. +//! Substrate network possible errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - -use error_chain::*; -use std::io::Error as IoError; use client; -error_chain! { - foreign_links { - Io(IoError) #[doc = "IO error."]; - } +/// Result type alias for the network. +pub type Result = std::result::Result; - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } +/// Error type for the network. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Io error + Io(std::io::Error), + /// Client error + Client(client::error::Error), +} - errors { +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Client(ref err) => Some(err), + } } } diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 02004945178793062e06b700343719e4368d436d..e3ed56d5adbbd8fd593ddc6c15fe9a9c41a11c09 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -19,6 +19,9 @@ //! Substrate-specific P2P networking: synchronizing blocks, propagating BFT messages. //! Allows attachment of an optional subprotocol for chain-specific requests. +//! +//! **Important**: This crate is unstable and the API and usage may change. +//! mod service; mod sync; @@ -27,6 +30,7 @@ mod protocol; mod chain; mod blocks; mod on_demand; +mod on_demand_layer; mod util; pub mod config; pub mod consensus_gossip; @@ -37,19 +41,23 @@ pub mod specialization; #[cfg(any(test, feature = "test-helpers"))] pub mod test; -pub use chain::Client as ClientHandle; -pub use service::{Service, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, SyncProvider, ExHashT}; +pub use chain::{Client as ClientHandle, FinalityProofProvider}; +pub use service::{ + Service, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, + SyncProvider, ExHashT, ReportHandle, +}; pub use protocol::{ProtocolStatus, PeerInfo, Context}; pub use sync::{Status as SyncStatus, SyncState}; pub use network_libp2p::{ identity, multiaddr, - ProtocolId, Severity, Multiaddr, + ProtocolId, Multiaddr, NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer, NetworkStatePeerEndpoint, NodeKeyConfig, Secret, Secp256k1Secret, Ed25519Secret, build_multiaddr, PeerId, PublicKey }; pub use message::{generic as generic_message, RequestId, Status as StatusMessage}; pub use error::Error; -pub use on_demand::{OnDemand, OnDemandService, RemoteResponse}; +pub use on_demand::AlwaysBadChecker; +pub use on_demand_layer::{OnDemand, RemoteResponse}; #[doc(hidden)] pub use runtime_primitives::traits::Block as BlockT; diff --git a/core/network/src/message.rs b/core/network/src/message.rs index d0f697b8ab40672ce43349df926eacb22c0e8e8c..6a38c106b7342525f310adea514b7180a3d9ad01 100644 --- a/core/network/src/message.rs +++ b/core/network/src/message.rs @@ -23,7 +23,8 @@ pub use self::generic::{ BlockAnnounce, RemoteCallRequest, RemoteReadRequest, RemoteHeaderRequest, RemoteHeaderResponse, RemoteChangesRequest, RemoteChangesResponse, - FromBlock + FinalityProofRequest, FinalityProofResponse, + FromBlock, RemoteReadChildRequest, }; /// A unique ID of a request. @@ -66,7 +67,7 @@ pub type BlockResponse = generic::BlockResponse< /// A set of transactions. pub type Transactions = Vec; -/// Bits of block data and associated artifacts to request. +// Bits of block data and associated artifacts to request. bitflags! { /// Node roles bitmask. pub struct BlockAttributes: u8 { @@ -125,12 +126,12 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { use parity_codec::{Encode, Decode}; - use network_libp2p::{CustomMessage, CustomMessageId}; + use network_libp2p::CustomMessage; use runtime_primitives::Justification; use crate::config::Roles; use super::{ - BlockAttributes, RemoteCallResponse, RemoteReadResponse, - RequestId, Transactions, Direction, ConsensusEngineId, + RemoteReadResponse, Transactions, Direction, + RequestId, BlockAttributes, RemoteCallResponse, ConsensusEngineId, }; /// Consensus is mostly opaque to us #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] @@ -198,7 +199,13 @@ pub mod generic { RemoteChangesRequest(RemoteChangesRequest), /// Remote changes reponse. RemoteChangesResponse(RemoteChangesResponse), - /// Chain-specific message + /// Remote child storage read request. + RemoteReadChildRequest(RemoteReadChildRequest), + /// Finality proof request. + FinalityProofRequest(FinalityProofRequest), + /// Finality proof reponse. + FinalityProofResponse(FinalityProofResponse), + /// Chain-specific message. #[codec(index = "255")] ChainSpecific(Vec), } @@ -213,26 +220,6 @@ pub mod generic { fn from_bytes(bytes: &[u8]) -> Result { Decode::decode(&mut &bytes[..]).ok_or(()) } - - fn request_id(&self) -> CustomMessageId { - match *self { - Message::Status(_) => CustomMessageId::OneWay, - Message::BlockRequest(ref req) => CustomMessageId::Request(req.id), - Message::BlockResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::BlockAnnounce(_) => CustomMessageId::OneWay, - Message::Transactions(_) => CustomMessageId::OneWay, - Message::Consensus(_) => CustomMessageId::OneWay, - Message::RemoteCallRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteCallResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::RemoteReadRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteReadResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::RemoteHeaderRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteHeaderResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::RemoteChangesRequest(ref req) => CustomMessageId::Request(req.id), - Message::RemoteChangesResponse(ref resp) => CustomMessageId::Response(resp.id), - Message::ChainSpecific(_) => CustomMessageId::OneWay, - } - } } /// Status sent on connection. @@ -311,6 +298,19 @@ pub mod generic { pub key: Vec, } + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Remote storage read child request. + pub struct RemoteReadChildRequest { + /// Unique request id. + pub id: RequestId, + /// Block at which to perform call. + pub block: H, + /// Child Storage key. + pub storage_key: Vec, + /// Storage key. + pub key: Vec, + } + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] /// Remote header request. pub struct RemoteHeaderRequest { @@ -364,4 +364,26 @@ pub mod generic { /// Missing changes tries roots proof. pub roots_proof: Vec>, } + + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Finality proof request. + pub struct FinalityProofRequest { + /// Unique request id. + pub id: RequestId, + /// Hash of the block to request proof for. + pub block: H, + /// Additional data blob (that both requester and provider understood) required for proving finality. + pub request: Vec, + } + + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Finality proof response. + pub struct FinalityProofResponse { + /// Id of a request this response was made for. + pub id: RequestId, + /// Hash of the block (the same as in the FinalityProofRequest). + pub block: H, + /// Finality proof (if available). + pub proof: Option>, + } } diff --git a/core/network/src/on_demand.rs b/core/network/src/on_demand.rs index e02355cb5e581f73515ad0742c3b94016d92b542..f77b50dac6fd25fee1168f7a4bec2cf79e284cba 100644 --- a/core/network/src/on_demand.rs +++ b/core/network/src/on_demand.rs @@ -19,75 +19,40 @@ use std::collections::{HashMap, VecDeque}; use std::sync::Arc; use std::time::{Instant, Duration}; -use log::trace; -use futures::{Async, Future, Poll}; -use futures::sync::oneshot::{channel, Receiver, Sender as OneShotSender}; -use linked_hash_map::LinkedHashMap; -use linked_hash_map::Entry; -use parking_lot::Mutex; -use client::{error::{Error as ClientError, ErrorKind as ClientErrorKind}}; -use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, - RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof}; +use log::{trace, info}; +use futures::sync::oneshot::{Sender as OneShotSender}; +use linked_hash_map::{Entry, LinkedHashMap}; +use client::error::Error as ClientError; +use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, + RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof, + RemoteReadChildRequest, RemoteBodyRequest}; use crate::message; -use network_libp2p::{Severity, PeerId}; +use network_libp2p::PeerId; use crate::config::Roles; -use crate::service::{NetworkChan, NetworkMsg}; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; /// Remote request timeout. const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); /// Default request retry count. const RETRY_COUNT: usize = 1; +/// Reputation change for a peer when a request timed out. +const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 8); -/// On-demand service API. -pub trait OnDemandService: Send + Sync { - /// When new node is connected. - fn on_connect(&self, peer: PeerId, role: Roles, best_number: NumberFor); +/// Trait used by the `OnDemandCore` service to communicate messages back to the network. +pub trait OnDemandNetwork { + /// Adjusts the reputation of the given peer. + fn report_peer(&mut self, who: &PeerId, reputation_change: i32); - /// When block is announced by the peer. - fn on_block_announce(&self, peer: PeerId, best_number: NumberFor); + /// Disconnect from the given peer. Used in case of misbehaviour. + fn disconnect_peer(&mut self, who: &PeerId); - /// When node is disconnected. - fn on_disconnect(&self, peer: PeerId); - - /// Maintain peers requests. - fn maintain_peers(&self); - - /// When header response is received from remote node. - fn on_remote_header_response( - &self, - peer: PeerId, - response: message::RemoteHeaderResponse - ); - - /// When read response is received from remote node. - fn on_remote_read_response(&self, peer: PeerId, response: message::RemoteReadResponse); - - /// When call response is received from remote node. - fn on_remote_call_response(&self, peer: PeerId, response: message::RemoteCallResponse); - - /// When changes response is received from remote node. - fn on_remote_changes_response( - &self, - peer: PeerId, - response: message::RemoteChangesResponse, Block::Hash> - ); + /// Send a request to a peer. + fn send_request(&mut self, who: &PeerId, message: message::Message); } /// On-demand requests service. Dispatches requests to appropriate peers. -pub struct OnDemand { - core: Mutex>, - checker: Arc>, - network_sender: Mutex>>, -} - -/// On-demand remote call response. -pub struct RemoteResponse { - receiver: Receiver>, -} - -#[derive(Default)] -struct OnDemandCore { +pub struct OnDemandCore { + checker: Arc>, next_request_id: u64, pending_requests: VecDeque>, active_peers: LinkedHashMap>, @@ -102,11 +67,22 @@ struct Request { data: RequestData, } -enum RequestData { +/// One request for data made by the `Client`. +/// +/// Contains a `Sender` where to send the result. +pub(crate) enum RequestData { + RemoteBody(RemoteBodyRequest, OneShotSender, ClientError>>), RemoteHeader(RemoteHeaderRequest, OneShotSender>), RemoteRead(RemoteReadRequest, OneShotSender>, ClientError>>), + RemoteReadChild( + RemoteReadChildRequest, + OneShotSender>, ClientError>> + ), RemoteCall(RemoteCallRequest, OneShotSender, ClientError>>), - RemoteChanges(RemoteChangesRequest, OneShotSender, u32)>, ClientError>>), + RemoteChanges( + RemoteChangesRequest, + OneShotSender, u32)>, ClientError>> + ), } enum Accept { @@ -115,143 +91,209 @@ enum Accept { Unexpected(RequestData), } -impl Future for RemoteResponse { - type Item = T; - type Error = ClientError; +/// Dummy implementation of `FetchChecker` that always assumes that responses are bad. +/// +/// Considering that it is the responsibility of the client to build the fetcher, it can use this +/// implementation if it knows that it will never perform any request. +#[derive(Default, Clone)] +pub struct AlwaysBadChecker; - fn poll(&mut self) -> Poll { - self.receiver.poll() - .map_err(|_| ClientErrorKind::RemoteFetchCancelled.into()) - .and_then(|r| match r { - Async::Ready(Ok(ready)) => Ok(Async::Ready(ready)), - Async::Ready(Err(error)) => Err(error), - Async::NotReady => Ok(Async::NotReady), - }) +impl FetchChecker for AlwaysBadChecker { + fn check_header_proof( + &self, + _request: &RemoteHeaderRequest, + _remote_header: Option, + _remote_proof: Vec> + ) -> Result { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_read_proof( + &self, + _request: &RemoteReadRequest, + _remote_proof: Vec> + ) -> Result>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_read_child_proof( + &self, + _request: &RemoteReadChildRequest, + _remote_proof: Vec> + ) -> Result>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_execution_proof( + &self, + _request: &RemoteCallRequest, + _remote_proof: Vec> + ) -> Result, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_changes_proof( + &self, + _request: &RemoteChangesRequest, + _remote_proof: ChangesProof + ) -> Result, u32)>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_body_proof( + &self, + _request: &RemoteBodyRequest, + _body: Vec + ) -> Result, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) } } -impl OnDemand where +impl OnDemandCore where B::Header: HeaderT, { - /// Creates new on-demand service. - pub fn new(checker: Arc>) -> Self { - OnDemand { + /// Creates new on-demand requests processer. + pub fn new(checker: Arc>) -> Self { + OnDemandCore { checker, - network_sender: Mutex::new(None), - core: Mutex::new(OnDemandCore { - next_request_id: 0, - pending_requests: VecDeque::new(), - active_peers: LinkedHashMap::new(), - idle_peers: VecDeque::new(), - best_blocks: HashMap::new(), - }) + next_request_id: 0, + pending_requests: VecDeque::new(), + active_peers: LinkedHashMap::new(), + idle_peers: VecDeque::new(), + best_blocks: HashMap::new(), } } - /// Sets weak reference to network service. - pub fn set_network_sender(&self, network_sender: NetworkChan) { - self.network_sender.lock().replace(network_sender); + /// Inserts a new request in the list of requests to execute. + pub(crate) fn add_request(&mut self, network: impl OnDemandNetwork, data: RequestData) { + self.insert(RETRY_COUNT, data); + self.dispatch(network); } - fn send(&self, msg: NetworkMsg) { - let _ = self.network_sender - .lock() - .as_ref() - .expect("1. OnDemand is passed a network sender upon initialization of the service, 2. it should bet set by now") - .send(msg); - } + /// Inserts a new request in the list of requests to execute. + fn insert(&mut self, retry_count: usize, data: RequestData) { + let request_id = self.next_request_id; + self.next_request_id += 1; - /// Schedule && dispatch all scheduled requests. - fn schedule_request(&self, retry_count: Option, data: RequestData, result: R) -> R { - let mut core = self.core.lock(); - core.insert(retry_count.unwrap_or(RETRY_COUNT), data); - core.dispatch(self); - result + self.pending_requests.push_back(Request { + id: request_id, + timestamp: Instant::now(), + retry_count, + data, + }); } /// Try to accept response from given peer. - fn accept_response) -> Accept>(&self, rtype: &str, peer: PeerId, request_id: u64, try_accept: F) { - let mut core = self.core.lock(); - let request = match core.remove(peer.clone(), request_id) { + fn accept_response( + &mut self, + rtype: &str, + mut network: impl OnDemandNetwork, + peer: PeerId, + request_id: u64, + try_accept: impl FnOnce(Request, &Arc>) -> Accept + ) { + let request = match self.remove(peer.clone(), request_id) { Some(request) => request, None => { - let reason = format!("Invalid remote {} response from peer", rtype); - self.send(NetworkMsg::ReportPeer(peer.clone(), Severity::Bad(reason))); - core.remove_peer(peer); + info!("Invalid remote {} response from peer {}", rtype, peer); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); return; }, }; let retry_count = request.retry_count; - let (retry_count, retry_request_data) = match try_accept(request) { + let (retry_count, retry_request_data) = match try_accept(request, &self.checker) { Accept::Ok => (retry_count, None), Accept::CheckFailed(error, retry_request_data) => { - let reason = format!("Failed to check remote {} response from peer: {}", rtype, error); - self.send(NetworkMsg::ReportPeer(peer.clone(), Severity::Bad(reason))); - core.remove_peer(peer); + info!("Failed to check remote {} response from peer {}: {}", rtype, peer, error); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); if retry_count > 0 { (retry_count - 1, Some(retry_request_data)) } else { trace!(target: "sync", "Failed to get remote {} response for given number of retries", rtype); - retry_request_data.fail(ClientErrorKind::RemoteFetchFailed.into()); + retry_request_data.fail(ClientError::RemoteFetchFailed.into()); (0, None) } }, Accept::Unexpected(retry_request_data) => { - let reason = format!("Unexpected response to remote {} from peer", rtype); - self.send(NetworkMsg::ReportPeer(peer.clone(), Severity::Bad(reason))); - core.remove_peer(peer); + info!("Unexpected response to remote {} from peer", rtype); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); (retry_count, Some(retry_request_data)) }, }; if let Some(request_data) = retry_request_data { - core.insert(retry_count, request_data); + self.insert(retry_count, request_data); } - core.dispatch(self); + self.dispatch(network); } -} -impl OnDemandService for OnDemand where - B: BlockT, - B::Header: HeaderT, -{ - fn on_connect(&self, peer: PeerId, role: Roles, best_number: NumberFor) { - if !role.intersects(Roles::FULL | Roles::AUTHORITY) { + pub fn on_connect( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + role: Roles, + best_number: NumberFor + ) { + if !role.is_full() { return; } - let mut core = self.core.lock(); - core.add_peer(peer, best_number); - core.dispatch(self); + self.idle_peers.push_back(peer.clone()); + self.best_blocks.insert(peer, best_number); + + self.dispatch(network); } - fn on_block_announce(&self, peer: PeerId, best_number: NumberFor) { - let mut core = self.core.lock(); - core.update_peer(peer, best_number); - core.dispatch(self); + pub fn on_block_announce(&mut self, network: impl OnDemandNetwork, peer: PeerId, best_number: NumberFor) { + self.best_blocks.insert(peer, best_number); + self.dispatch(network); } - fn on_disconnect(&self, peer: PeerId) { - let mut core = self.core.lock(); - core.remove_peer(peer); - core.dispatch(self); + pub fn on_disconnect(&mut self, network: impl OnDemandNetwork, peer: PeerId) { + self.remove_peer(peer); + self.dispatch(network); } - fn maintain_peers(&self) { - let mut core = self.core.lock(); - for bad_peer in core.maintain_peers() { - self.send(NetworkMsg::ReportPeer(bad_peer, Severity::Timeout)); + pub fn maintain_peers(&mut self, mut network: impl OnDemandNetwork) { + let now = Instant::now(); + + loop { + match self.active_peers.front() { + Some((_, request)) if now - request.timestamp >= REQUEST_TIMEOUT => (), + _ => break, + } + + let (bad_peer, request) = self.active_peers.pop_front().expect("front() is Some as checked above"); + self.pending_requests.push_front(request); + network.report_peer(&bad_peer, TIMEOUT_REPUTATION_CHANGE); + network.disconnect_peer(&bad_peer); } - core.dispatch(self); + + self.dispatch(network); } - fn on_remote_header_response(&self, peer: PeerId, response: message::RemoteHeaderResponse) { - self.accept_response("header", peer, response.id, |request| match request.data { - RequestData::RemoteHeader(request, sender) => match self.checker.check_header_proof(&request, response.header, response.proof) { + pub fn on_remote_header_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteHeaderResponse + ) { + self.accept_response("header", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteHeader(request, sender) => match checker.check_header_proof( + &request, + response.header, + response.proof + ) { Ok(response) => { // we do not bother if receiver has been dropped already let _ = sender.send(Ok(response)); @@ -263,23 +305,49 @@ impl OnDemandService for OnDemand where }) } - fn on_remote_read_response(&self, peer: PeerId, response: message::RemoteReadResponse) { - self.accept_response("read", peer, response.id, |request| match request.data { - RequestData::RemoteRead(request, sender) => match self.checker.check_read_proof(&request, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteRead(request, sender)), - }, + pub fn on_remote_read_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteReadResponse + ) { + self.accept_response("read", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteRead(request, sender) => { + match checker.check_read_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed( + error, + RequestData::RemoteRead(request, sender) + ), + }}, + RequestData::RemoteReadChild(request, sender) => { + match checker.check_read_child_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed( + error, + RequestData::RemoteReadChild(request, sender) + ), + }}, data => Accept::Unexpected(data), }) } - fn on_remote_call_response(&self, peer: PeerId, response: message::RemoteCallResponse) { - self.accept_response("call", peer, response.id, |request| match request.data { - RequestData::RemoteCall(request, sender) => match self.checker.check_execution_proof(&request, response.proof) { + pub fn on_remote_call_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteCallResponse + ) { + self.accept_response("call", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteCall(request, sender) => match checker.check_execution_proof(&request, response.proof) { Ok(response) => { // we do not bother if receiver has been dropped already let _ = sender.send(Ok(response)); @@ -291,9 +359,14 @@ impl OnDemandService for OnDemand where }) } - fn on_remote_changes_response(&self, peer: PeerId, response: message::RemoteChangesResponse, B::Hash>) { - self.accept_response("changes", peer, response.id, |request| match request.data { - RequestData::RemoteChanges(request, sender) => match self.checker.check_changes_proof( + pub fn on_remote_changes_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteChangesResponse, B::Hash> + ) { + self.accept_response("changes", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteChanges(request, sender) => match checker.check_changes_proof( &request, ChangesProof { max_block: response.max, proof: response.proof, @@ -310,53 +383,57 @@ impl OnDemandService for OnDemand where data => Accept::Unexpected(data), }) } -} - -impl Fetcher for OnDemand where - B: BlockT, - B::Header: HeaderT, -{ - type RemoteHeaderResult = RemoteResponse; - type RemoteReadResult = RemoteResponse>>; - type RemoteCallResult = RemoteResponse>; - type RemoteChangesResult = RemoteResponse, u32)>>; - - fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteHeader(request, sender), - RemoteResponse { receiver }) - } - fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteRead(request, sender), - RemoteResponse { receiver }) - } - - fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteCall(request, sender), - RemoteResponse { receiver }) - } + pub fn on_remote_body_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::BlockResponse + ) { + self.accept_response("body", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteBody(request, sender) => { + let mut bodies: Vec<_> = response + .blocks + .into_iter() + .filter_map(|b| b.body) + .collect(); + + // Number of bodies are hardcoded to 1 for valid `RemoteBodyResponses` + if bodies.len() != 1 { + return Accept::CheckFailed( + "RemoteBodyResponse: invalid number of blocks".into(), + RequestData::RemoteBody(request, sender), + ) + } + let body = bodies.remove(0); - fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteChanges(request, sender), - RemoteResponse { receiver }) + match checker.check_body_proof(&request, body) { + Ok(body) => { + let _ = sender.send(Ok(body)); + Accept::Ok + } + Err(error) => Accept::CheckFailed(error, RequestData::RemoteBody(request, sender)), + } + } + other => Accept::Unexpected(other), + }) } -} -impl OnDemandCore where - B: BlockT, - B::Header: HeaderT, -{ - pub fn add_peer(&mut self, peer: PeerId, best_number: NumberFor) { - self.idle_peers.push_back(peer.clone()); - self.best_blocks.insert(peer, best_number); + pub fn is_on_demand_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { + self.active_peers.get(&peer).map_or(false, |r| r.id == request_id) } - pub fn update_peer(&mut self, peer: PeerId, best_number: NumberFor) { - self.best_blocks.insert(peer, best_number); + fn remove(&mut self, peer: PeerId, id: u64) -> Option> { + match self.active_peers.entry(peer.clone()) { + Entry::Occupied(entry) => match entry.get().id == id { + true => { + self.idle_peers.push_back(peer); + Some(entry.remove()) + }, + false => None, + }, + Entry::Vacant(_) => None, + } } pub fn remove_peer(&mut self, peer: PeerId) { @@ -372,48 +449,8 @@ impl OnDemandCore where } } - pub fn maintain_peers(&mut self) -> Vec { - let now = Instant::now(); - let mut bad_peers = Vec::new(); - loop { - match self.active_peers.front() { - Some((_, request)) if now - request.timestamp >= REQUEST_TIMEOUT => (), - _ => return bad_peers, - } - - let (bad_peer, request) = self.active_peers.pop_front().expect("front() is Some as checked above"); - self.pending_requests.push_front(request); - bad_peers.push(bad_peer); - } - } - - pub fn insert(&mut self, retry_count: usize, data: RequestData) { - let request_id = self.next_request_id; - self.next_request_id += 1; - - self.pending_requests.push_back(Request { - id: request_id, - timestamp: Instant::now(), - retry_count, - data, - }); - } - - pub fn remove(&mut self, peer: PeerId, id: u64) -> Option> { - match self.active_peers.entry(peer.clone()) { - Entry::Occupied(entry) => match entry.get().id == id { - true => { - self.idle_peers.push_back(peer); - Some(entry.remove()) - }, - false => None, - }, - Entry::Vacant(_) => None, - } - } - - pub fn dispatch(&mut self, on_demand: &OnDemand) { - + /// Dispatches pending requests. + fn dispatch(&mut self, mut network: impl OnDemandNetwork) { let mut last_peer = self.idle_peers.back().cloned(); let mut unhandled_requests = VecDeque::new(); @@ -458,7 +495,7 @@ impl OnDemandCore where let mut request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); request.timestamp = Instant::now(); trace!(target: "sync", "Dispatching remote request {} to peer {}", request.id, peer); - on_demand.send(NetworkMsg::Outgoing(peer.clone(), request.message())); + network.send_request(&peer, request.message()); self.active_peers.insert(peer, request); } @@ -467,16 +504,18 @@ impl OnDemandCore where } impl Request { - pub fn required_block(&self) -> NumberFor { + fn required_block(&self) -> NumberFor { match self.data { RequestData::RemoteHeader(ref data, _) => data.block, RequestData::RemoteRead(ref data, _) => *data.header.number(), + RequestData::RemoteReadChild(ref data, _) => *data.header.number(), RequestData::RemoteCall(ref data, _) => *data.header.number(), RequestData::RemoteChanges(ref data, _) => data.max_block.0, + RequestData::RemoteBody(ref data, _) => *data.header.number(), } } - pub fn message(&self) -> message::Message { + fn message(&self) -> message::Message { match self.data { RequestData::RemoteHeader(ref data, _) => message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { @@ -489,6 +528,14 @@ impl Request { block: data.block, key: data.key.clone(), }), + RequestData::RemoteReadChild(ref data, _) => + message::generic::Message::RemoteReadChildRequest( + message::RemoteReadChildRequest { + id: self.id, + block: data.block, + storage_key: data.storage_key.clone(), + key: data.key.clone(), + }), RequestData::RemoteCall(ref data, _) => message::generic::Message::RemoteCallRequest(message::RemoteCallRequest { id: self.id, @@ -505,39 +552,51 @@ impl Request { max: data.max_block.1.clone(), key: data.key.clone(), }), + RequestData::RemoteBody(ref data, _) => { + message::generic::Message::BlockRequest(message::BlockRequest:: { + id: self.id, + fields: message::BlockAttributes::BODY, + from: message::FromBlock::Hash(data.header.hash()), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }) + } } } } impl RequestData { - pub fn fail(self, error: ClientError) { + fn fail(self, error: ClientError) { // don't care if anyone is listening match self { RequestData::RemoteHeader(_, sender) => { let _ = sender.send(Err(error)); }, RequestData::RemoteCall(_, sender) => { let _ = sender.send(Err(error)); }, RequestData::RemoteRead(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteReadChild(_, sender) => { let _ = sender.send(Err(error)); }, RequestData::RemoteChanges(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteBody(_, sender) => { let _ = sender.send(Err(error)); }, } } } #[cfg(test)] pub mod tests { + use std::collections::HashSet; use std::sync::Arc; use std::time::Instant; - use futures::Future; - use runtime_primitives::traits::NumberFor; - use client::{error::{ErrorKind as ClientErrorKind, Result as ClientResult}}; - use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, - RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof}; + use futures::{Future, sync::oneshot}; + use runtime_primitives::traits::{Block as BlockT, NumberFor}; + use client::{error::{Error as ClientError, Result as ClientResult}}; + use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, + ChangesProof, RemoteCallRequest, RemoteReadRequest, + RemoteReadChildRequest, RemoteChangesRequest, RemoteBodyRequest}; use crate::config::Roles; use crate::message; - use network_libp2p::{PeerId, Severity}; - use crate::service::{network_channel, NetworkPort, NetworkMsg}; - use super::{REQUEST_TIMEOUT, OnDemand, OnDemandService}; - use test_client::runtime::{changes_trie_config, Block, Header}; + use network_libp2p::PeerId; + use super::{REQUEST_TIMEOUT, OnDemandCore, OnDemandNetwork, RequestData}; + use test_client::runtime::{changes_trie_config, Block, Extrinsic, Header}; - pub struct DummyExecutor; struct DummyFetchChecker { ok: bool } impl FetchChecker for DummyFetchChecker { @@ -549,45 +608,73 @@ pub mod tests { ) -> ClientResult
{ match self.ok { true if header.is_some() => Ok(header.unwrap()), - _ => Err(ClientErrorKind::Backend("Test error".into()).into()), + _ => Err(ClientError::Backend("Test error".into())), } } fn check_read_proof(&self, _: &RemoteReadRequest
, _: Vec>) -> ClientResult>> { match self.ok { true => Ok(Some(vec![42])), - false => Err(ClientErrorKind::Backend("Test error".into()).into()), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_read_child_proof( + &self, + _: &RemoteReadChildRequest
, + _: Vec> + ) -> ClientResult>> { + match self.ok { + true => Ok(Some(vec![42])), + false => Err(ClientError::Backend("Test error".into())), } } fn check_execution_proof(&self, _: &RemoteCallRequest
, _: Vec>) -> ClientResult> { match self.ok { true => Ok(vec![42]), - false => Err(ClientErrorKind::Backend("Test error".into()).into()), + false => Err(ClientError::Backend("Test error".into())), } } - fn check_changes_proof(&self, _: &RemoteChangesRequest
, _: ChangesProof
) -> ClientResult, u32)>> { + fn check_changes_proof( + &self, + _: &RemoteChangesRequest
, + _: ChangesProof
+ ) -> ClientResult, u32)>> { match self.ok { true => Ok(vec![(100, 2)]), - false => Err(ClientErrorKind::Backend("Test error".into()).into()), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_body_proof( + &self, + _: &RemoteBodyRequest
, + body: Vec + ) -> ClientResult> { + match self.ok { + true => Ok(body), + false => Err(ClientError::Backend("Test error".into())), } } } - fn dummy(ok: bool) -> (Arc, Arc>) { - let executor = Arc::new(DummyExecutor); - let service = Arc::new(OnDemand::new(Arc::new(DummyFetchChecker { ok }))); - (executor, service) + fn dummy(ok: bool) -> OnDemandCore { + OnDemandCore::new(Arc::new(DummyFetchChecker { ok })) } - fn total_peers(on_demand: &OnDemand) -> usize { - let core = on_demand.core.lock(); - core.idle_peers.len() + core.active_peers.len() + fn total_peers(on_demand: &OnDemandCore) -> usize { + on_demand.idle_peers.len() + on_demand.active_peers.len() } - fn receive_call_response(on_demand: &OnDemand, peer: PeerId, id: message::RequestId) { - on_demand.on_remote_call_response(peer, message::RemoteCallResponse { + fn receive_call_response( + network_interface: impl OnDemandNetwork, + on_demand: &mut OnDemandCore, + peer: PeerId, + id: message::RequestId + ) { + on_demand.on_remote_call_response(network_interface, peer, message::RemoteCallResponse { id: id, proof: vec![vec![2]], }); @@ -603,152 +690,151 @@ pub mod tests { } } - fn assert_disconnected_peer(network_port: NetworkPort, expected_severity: Severity) { - let mut disconnect_count = 0; - while let Ok(msg) = network_port.receiver().try_recv() { - match msg { - NetworkMsg::ReportPeer(_, severity) => { - if severity == expected_severity { - disconnect_count = disconnect_count + 1; - } - }, - _ => {}, - } + #[derive(Default)] + struct DummyNetwork { + disconnected_peers: HashSet, + } + + impl<'a, B: BlockT> OnDemandNetwork for &'a mut DummyNetwork { + fn report_peer(&mut self, _: &PeerId, _: i32) {} + fn disconnect_peer(&mut self, who: &PeerId) { + self.disconnected_peers.insert(who.clone()); } - assert_eq!(disconnect_count, 1); + fn send_request(&mut self, _: &PeerId, _: message::Message) {} + } + + fn assert_disconnected_peer(dummy: &DummyNetwork) { + assert_eq!(dummy.disconnected_peers.len(), 1); } #[test] fn knows_about_peers_roles() { - let (_, on_demand) = dummy(true); + let mut network_interface = DummyNetwork::default(); + let mut on_demand = dummy(true); let peer0 = PeerId::random(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); - on_demand.on_connect(peer0, Roles::LIGHT, 1000); - on_demand.on_connect(peer1.clone(), Roles::FULL, 2000); - on_demand.on_connect(peer2.clone(), Roles::AUTHORITY, 3000); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().best_blocks.get(&peer1), Some(&2000)); - assert_eq!(on_demand.core.lock().best_blocks.get(&peer2), Some(&3000)); + on_demand.on_connect(&mut network_interface, peer0, Roles::LIGHT, 1000); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 2000); + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::AUTHORITY, 3000); + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.best_blocks.get(&peer1), Some(&2000)); + assert_eq!(on_demand.best_blocks.get(&peer2), Some(&3000)); } #[test] fn disconnects_from_idle_peer() { let peer0 = PeerId::random(); - let (_, on_demand) = dummy(true); - on_demand.on_connect(peer0.clone(), Roles::FULL, 100); - assert_eq!(1, total_peers(&*on_demand)); - assert!(!on_demand.core.lock().best_blocks.is_empty()); + let mut network_interface = DummyNetwork::default(); + let mut on_demand = dummy(true); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 100); + assert_eq!(1, total_peers(&on_demand)); + assert!(!on_demand.best_blocks.is_empty()); - on_demand.on_disconnect(peer0); - assert_eq!(0, total_peers(&*on_demand)); - assert!(on_demand.core.lock().best_blocks.is_empty()); + on_demand.on_disconnect(&mut network_interface, peer0); + assert_eq!(0, total_peers(&on_demand)); + assert!(on_demand.best_blocks.is_empty()); } #[test] fn disconnects_from_timeouted_peer() { - let (_x, on_demand) = dummy(true); - let (network_sender, network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); let peer1 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - on_demand.on_connect(peer1.clone(), Roles::FULL, 1000); - assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert!(on_demand.core.lock().active_peers.is_empty()); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 1000); + assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert!(on_demand.active_peers.is_empty()); - on_demand.remote_call(RemoteCallRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, - }); - assert_eq!(vec![peer1.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(vec![peer0.clone()], on_demand.core.lock().active_peers.keys().cloned().collect::>()); - - on_demand.core.lock().active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; - on_demand.maintain_peers(); - assert!(on_demand.core.lock().idle_peers.is_empty()); - assert_eq!(vec![peer1.clone()], on_demand.core.lock().active_peers.keys().cloned().collect::>()); - assert_disconnected_peer(network_port, Severity::Timeout); + }, oneshot::channel().0)); + assert_eq!(vec![peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(vec![peer0.clone()], on_demand.active_peers.keys().cloned().collect::>()); + + on_demand.active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; + on_demand.maintain_peers(&mut network_interface); + assert!(on_demand.idle_peers.is_empty()); + assert_eq!(vec![peer1.clone()], on_demand.active_peers.keys().cloned().collect::>()); + assert_disconnected_peer(&network_interface); } #[test] fn disconnects_from_peer_on_response_with_wrong_id() { - let (_x, on_demand) = dummy(true); + let mut on_demand = dummy(true); let peer0 = PeerId::random(); - let (network_sender, network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); + let mut network_interface = DummyNetwork::default(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.remote_call(RemoteCallRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, - }); - receive_call_response(&*on_demand, peer0, 1); - assert_disconnected_peer(network_port, Severity::Bad("Invalid remote call response from peer".to_string())); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + }, oneshot::channel().0)); + receive_call_response(&mut network_interface, &mut on_demand, peer0, 1); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); } #[test] fn disconnects_from_peer_on_incorrect_response() { - let (_x, on_demand) = dummy(false); - let (network_sender, network_port) = network_channel(); + let mut on_demand = dummy(false); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.remote_call(RemoteCallRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: Some(1), - }); + }, oneshot::channel().0)); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - receive_call_response(&*on_demand, peer0.clone(), 0); - assert_disconnected_peer(network_port, Severity::Bad("Failed to check remote call response from peer: Backend error: Test error".to_string())); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); } #[test] fn disconnects_from_peer_on_unexpected_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - receive_call_response(&*on_demand, peer0, 0); - assert_disconnected_peer(network_port, Severity::Bad("Invalid remote call response from peer".to_string())); + receive_call_response(&mut network_interface, &mut on_demand, peer0, 0); + assert_disconnected_peer(&network_interface); } #[test] fn disconnects_from_peer_on_wrong_response_type() { - let (_x, on_demand) = dummy(false); + let mut on_demand = dummy(false); let peer0 = PeerId::random(); - let (network_sender, network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); + let mut network_interface = DummyNetwork::default(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - on_demand.remote_call(RemoteCallRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: Some(1), - }); + }, oneshot::channel().0)); - on_demand.on_remote_read_response(peer0.clone(), message::RemoteReadResponse { + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); - assert_disconnected_peer(network_port, Severity::Bad("Unexpected response to remote read from peer".to_string())); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); } #[test] @@ -757,26 +843,26 @@ pub mod tests { let retry_count = 2; let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); - let (_x, on_demand) = dummy(false); - let (network_sender, _network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); + let mut on_demand = dummy(false); + let mut network_interface = DummyNetwork::default(); for i in 0..retry_count+1 { - on_demand.on_connect(peer_ids[i].clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); } let sync = Arc::new((Mutex::new(0), Mutex::new(0), Condvar::new())); let thread_sync = sync.clone(); - let response = on_demand.remote_call(RemoteCallRequest { + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: Some(retry_count) - }); + }, tx)); let thread = ::std::thread::spawn(move || { let &(ref current, ref finished_at, ref finished) = &*thread_sync; - let _ = response.wait().unwrap_err(); + let _ = response.wait().unwrap().unwrap_err(); *finished_at.lock() = *current.lock(); finished.notify_one(); }); @@ -785,7 +871,7 @@ pub mod tests { for i in 0..retry_count+1 { let mut current = current.lock(); *current = *current + 1; - receive_call_response(&*on_demand, peer_ids[i].clone(), i as u64); + receive_call_response(&mut network_interface, &mut on_demand, peer_ids[i].clone(), i as u64); } let mut finished_at = finished_at.lock(); @@ -797,69 +883,97 @@ pub mod tests { #[test] fn receives_remote_call_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - let response = on_demand.remote_call(RemoteCallRequest { + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { block: Default::default(), header: dummy_header(), method: "test".into(), call_data: vec![], retry_count: None, - }); + }, tx)); let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); + let result = response.wait().unwrap().unwrap(); assert_eq!(result, vec![42]); }); - receive_call_response(&*on_demand, peer0.clone(), 0); + receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); thread.join().unwrap(); } #[test] fn receives_remote_read_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - let response = on_demand.remote_read(RemoteReadRequest { + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteRead(RemoteReadRequest { header: dummy_header(), block: Default::default(), key: b":key".to_vec(), retry_count: None, - }); + }, tx)); let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); + let result = response.wait().unwrap().unwrap(); assert_eq!(result, Some(vec![42])); }); - on_demand.on_remote_read_response(peer0.clone(), message::RemoteReadResponse { + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { id: 0, proof: vec![vec![2]], }); thread.join().unwrap(); } + #[test] + fn receives_remote_read_child_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteReadChild(RemoteReadChildRequest { + header: dummy_header(), + block: Default::default(), + storage_key: b":child_storage:sub".to_vec(), + key: b":key".to_vec(), + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, Some(vec![42])); + }); + + on_demand.on_remote_read_response(&mut network_interface, + peer0.clone(), message::RemoteReadResponse { + id: 0, + proof: vec![vec![2]], + }); + thread.join().unwrap(); + } + #[test] fn receives_remote_header_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - let response = on_demand.remote_header(RemoteHeaderRequest { + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 1, retry_count: None, - }); + }, tx)); let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); + let result = response.wait().unwrap().unwrap(); assert_eq!( result.hash(), "6443a0b46e0412e626363028115a9f2c\ @@ -867,7 +981,7 @@ pub mod tests { ); }); - on_demand.on_remote_header_response(peer0.clone(), message::RemoteHeaderResponse { + on_demand.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { id: 0, header: Some(Header { parent_hash: Default::default(), @@ -883,13 +997,13 @@ pub mod tests { #[test] fn receives_remote_changes_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); - let response = on_demand.remote_changes(RemoteChangesRequest { + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { changes_trie_config: changes_trie_config(), first_block: (1, Default::default()), last_block: (100, Default::default()), @@ -897,13 +1011,13 @@ pub mod tests { tries_roots: (1, Default::default(), vec![]), key: vec![], retry_count: None, - }); + }, tx)); let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); + let result = response.wait().unwrap().unwrap(); assert_eq!(result, vec![(100, 2)]); }); - on_demand.on_remote_changes_response(peer0.clone(), message::RemoteChangesResponse { + on_demand.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { id: 0, max: 1000, proof: vec![vec![2]], @@ -915,53 +1029,52 @@ pub mod tests { #[test] fn does_not_sends_request_to_peer_who_has_no_required_block() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer1.clone(), Roles::FULL, 100); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 100); - on_demand.remote_header(RemoteHeaderRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 200, retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, - }); + }, oneshot::channel().0)); - on_demand.on_connect(peer2.clone(), Roles::FULL, 150); + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 150); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 3); + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 3); - on_demand.on_block_announce(peer1.clone(), 250); + on_demand.on_block_announce(&mut network_interface, peer1.clone(), 250); - assert_eq!(vec![peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 2); + assert_eq!(vec![peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 2); - on_demand.on_block_announce(peer2.clone(), 250); + on_demand.on_block_announce(&mut network_interface, peer2.clone(), 250); - assert!(!on_demand.core.lock().idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + assert!(!on_demand.idle_peers.iter().any(|_| true)); + assert_eq!(on_demand.pending_requests.len(), 1); - on_demand.on_remote_header_response(peer1.clone(), message::RemoteHeaderResponse { + on_demand.on_remote_header_response(&mut network_interface, peer1.clone(), message::RemoteHeaderResponse { id: 0, header: Some(dummy_header()), proof: vec![], }); - assert!(!on_demand.core.lock().idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.core.lock().pending_requests.len(), 0); + assert!(!on_demand.idle_peers.iter().any(|_| true)); + assert_eq!(on_demand.pending_requests.len(), 0); } #[test] @@ -969,53 +1082,126 @@ pub mod tests { // this test is a regression for a bug where the dispatch function would // loop forever after dispatching a request to the last peer, since the // last peer was not updated - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); let peer2 = PeerId::random(); let peer3 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.remote_header(RemoteHeaderRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, - }); + }, oneshot::channel().0)); - on_demand.on_connect(peer1.clone(), Roles::FULL, 200); - on_demand.on_connect(peer2.clone(), Roles::FULL, 200); - on_demand.on_connect(peer3.clone(), Roles::FULL, 250); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 200); + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 200); + on_demand.on_connect(&mut network_interface, peer3.clone(), Roles::FULL, 250); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 1); } #[test] fn tries_to_send_all_pending_requests() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); let peer1 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.remote_header(RemoteHeaderRequest { + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 300, retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { cht_root: Default::default(), block: 250, retry_count: None, - }); + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + assert!(on_demand.idle_peers.iter().cloned().collect::>().is_empty()); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn remote_body_with_one_block_body_should_succeed() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + let header = dummy_header(); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }, oneshot::channel().0)); + + assert!(on_demand.pending_requests.is_empty()); + assert_eq!(on_demand.active_peers.len(), 1); + + let block = message::BlockData:: { + hash: primitives::H256::random(), + header: None, + body: Some(Vec::new()), + message_queue: None, + receipt: None, + justification: None, + }; - on_demand.on_connect(peer1.clone(), Roles::FULL, 250); + let response = message::generic::BlockResponse { + id: 0, + blocks: vec![block], + }; + + on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + + assert!(on_demand.active_peers.is_empty()); + assert_eq!(on_demand.idle_peers.len(), 1); + } + + #[test] + fn remote_body_with_three_bodies_should_fail() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + let header = dummy_header(); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }, oneshot::channel().0)); + + assert!(on_demand.pending_requests.is_empty()); + assert_eq!(on_demand.active_peers.len(), 1); + + let response = { + let blocks: Vec<_> = (0..3).map(|_| message::BlockData:: { + hash: primitives::H256::random(), + header: None, + body: Some(Vec::new()), + message_queue: None, + receipt: None, + justification: None, + }).collect(); + + message::generic::BlockResponse { + id: 0, + blocks, + } + }; - assert!(on_demand.core.lock().idle_peers.iter().cloned().collect::>().is_empty()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); + on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + assert!(on_demand.active_peers.is_empty()); + assert!(on_demand.idle_peers.is_empty(), "peer should be disconnected after bad response"); } } diff --git a/core/network/src/on_demand_layer.rs b/core/network/src/on_demand_layer.rs new file mode 100644 index 0000000000000000000000000000000000000000..95f9f4d67b40d74b04e3b0bf6727d6f9d4941f92 --- /dev/null +++ b/core/network/src/on_demand_layer.rs @@ -0,0 +1,149 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! On-demand requests service. + +use crate::on_demand::RequestData; +use std::sync::Arc; +use futures::{prelude::*, sync::mpsc, sync::oneshot}; +use parking_lot::Mutex; +use client::error::Error as ClientError; +use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, + RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, + RemoteReadChildRequest, RemoteBodyRequest}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; + +/// Implements the `Fetcher` trait of the client. Makes it possible for the light client to perform +/// network requests for some state. +/// +/// This implementation stores all the requests in a queue. The network, in parallel, is then +/// responsible for pulling elements out of that queue and fulfilling them. +pub struct OnDemand { + /// Objects that checks whether what has been retrieved is correct. + checker: Arc>, + + /// Queue of requests. Set to `Some` at initialization, then extracted by the network. + /// + /// Note that a better alternative would be to use a MPMC queue here, and add a `poll` method + /// from the `OnDemand`. However there exists no popular implementation of MPMC channels in + /// asynchronous Rust at the moment + requests_queue: Mutex>>>, + + /// Sending side of `requests_queue`. + requests_send: mpsc::UnboundedSender>, +} + +impl OnDemand where + B::Header: HeaderT, +{ + /// Creates new on-demand service. + pub fn new(checker: Arc>) -> Self { + let (requests_send, requests_queue) = mpsc::unbounded(); + let requests_queue = Mutex::new(Some(requests_queue)); + + OnDemand { + checker, + requests_queue, + requests_send, + } + } + + /// Get checker reference. + pub fn checker(&self) -> &Arc> { + &self.checker + } + + /// Extracts the queue of requests. + /// + /// Whenever one of the methods of the `Fetcher` trait is called, an element is pushed on this + /// channel. + /// + /// If this function returns `None`, that means that the receiver has already been extracted in + /// the past, and therefore that something already handles the requests. + pub(crate) fn extract_receiver(&self) -> Option>> { + self.requests_queue.lock().take() + } +} + +impl Fetcher for OnDemand where + B: BlockT, + B::Header: HeaderT, +{ + type RemoteHeaderResult = RemoteResponse; + type RemoteReadResult = RemoteResponse>>; + type RemoteCallResult = RemoteResponse>; + type RemoteChangesResult = RemoteResponse, u32)>>; + type RemoteBodyResult = RemoteResponse>; + + fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteHeader(request, sender)); + RemoteResponse { receiver } + } + + fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteRead(request, sender)); + RemoteResponse { receiver } + } + + fn remote_read_child( + &self, + request: RemoteReadChildRequest + ) -> Self::RemoteReadResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteReadChild(request, sender)); + RemoteResponse { receiver } + } + + fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteCall(request, sender)); + RemoteResponse { receiver } + } + + fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteChanges(request, sender)); + RemoteResponse { receiver } + } + + fn remote_body(&self, request: RemoteBodyRequest) -> Self::RemoteBodyResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteBody(request, sender)); + RemoteResponse { receiver } + } +} + +/// Future for an on-demand remote call response. +pub struct RemoteResponse { + receiver: oneshot::Receiver>, +} + +impl Future for RemoteResponse { + type Item = T; + type Error = ClientError; + + fn poll(&mut self) -> Poll { + self.receiver.poll() + .map_err(|_| ClientError::RemoteFetchCancelled.into()) + .and_then(|r| match r { + Async::Ready(Ok(ready)) => Ok(Async::Ready(ready)), + Async::Ready(Err(error)) => Err(error), + Async::NotReady => Ok(Async::NotReady), + }) + } +} diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index 99520ea99a7a28e8f0ba144975a1454e271c8b07..b3102e588e0a7f33d7a7ef22de954e32c1d0db30 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -14,31 +14,34 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use crossbeam_channel::{self as channel, Receiver, Sender, select}; -use futures::sync::mpsc; -use parking_lot::Mutex; -use network_libp2p::{PeerId, Severity}; +use futures::prelude::*; +use network_libp2p::PeerId; use primitives::storage::StorageKey; -use runtime_primitives::{generic::BlockId, ConsensusEngineId}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, NumberFor, Zero}; -use consensus::import_queue::ImportQueue; -use crate::message::{self, Message}; +use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; +use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, + CheckedSub, SaturatedConversion +}; +use consensus::import_queue::SharedFinalityProofRequestBuilder; +use crate::message::{ + self, BlockRequest as BlockRequestMessage, + FinalityProofRequest as FinalityProofRequestMessage, Message, +}; use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::on_demand::OnDemandService; +use crate::on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; use crate::specialization::NetworkSpecialization; -use crate::sync::{ChainSync, Status as SyncStatus, SyncState}; -use crate::service::{NetworkChan, NetworkMsg, TransactionPool, ExHashT}; +use crate::sync::{ChainSync, Context as SyncContext, Status as SyncStatus, SyncState}; +use crate::service::{TransactionPool, ExHashT}; use crate::config::{ProtocolConfig, Roles}; -use parking_lot::RwLock; use rustc_hex::ToHex; use std::collections::{BTreeMap, HashMap}; use std::sync::Arc; -use std::sync::atomic::AtomicBool; -use std::{cmp, num::NonZeroUsize, thread, time}; -use log::{trace, debug, warn}; -use crate::chain::Client; -use client::light::fetcher::ChangesProof; +use std::{cmp, num::NonZeroUsize, time}; +use log::{trace, debug, warn, error}; +use crate::chain::{Client, FinalityProofProvider}; +use client::light::fetcher::{FetchChecker, ChangesProof}; use crate::{error, util::LruHashSet}; const REQUEST_TIMEOUT_SEC: u64 = 40; @@ -46,13 +49,11 @@ const REQUEST_TIMEOUT_SEC: u64 = 40; const TICK_TIMEOUT: time::Duration = time::Duration::from_millis(1100); /// Interval at which we propagate exstrinsics; const PROPAGATE_TIMEOUT: time::Duration = time::Duration::from_millis(2900); -/// Interval at which we send status updates on the SyncProvider status stream. -const STATUS_INTERVAL: time::Duration = time::Duration::from_millis(5000); /// Current protocol version. -pub(crate) const CURRENT_VERSION: u32 = 2; +pub(crate) const CURRENT_VERSION: u32 = 3; /// Lowest version we support -const MIN_VERSION: u32 = 2; +pub(crate) const MIN_VERSION: u32 = 2; // Maximum allowed entries in `BlockResponse` const MAX_BLOCK_DATA_RESPONSE: u32 = 128; @@ -61,14 +62,29 @@ const MAX_BLOCK_DATA_RESPONSE: u32 = 128; /// and disconnect to free connection slot. const LIGHT_MAXIMAL_BLOCKS_DIFFERENCE: u64 = 8192; +/// Reputation change when a peer is "clogged", meaning that it's not fast enough to process our +/// messages. +const CLOGGED_PEER_REPUTATION_CHANGE: i32 = -(1 << 12); +/// Reputation change when a peer doesn't respond in time to our messages. +const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 10); +/// Reputation change when a peer sends us a status message while we already received one. +const UNEXPECTED_STATUS_REPUTATION_CHANGE: i32 = -(1 << 20); +/// Reputation change when we are a light client and a peer is behind us. +const PEER_BEHIND_US_LIGHT_REPUTATION_CHANGE: i32 = -(1 << 8); +/// Reputation change when a peer sends us an extrinsic that we didn't know about. +const NEW_EXTRINSIC_REPUTATION_CHANGE: i32 = 1 << 7; +/// We sent an RPC query to the given node, but it failed. +const RPC_FAILED_REPUTATION_CHANGE: i32 = -(1 << 12); + // Lock must always be taken in order declared here. pub struct Protocol, H: ExHashT> { - status_sinks: Arc>>>>, - network_chan: NetworkChan, - port: Receiver>, - from_network_port: Receiver>, + /// Interval at which we call `tick`. + tick_timeout: tokio::timer::Interval, + /// Interval at which we call `propagate_extrinsics`. + propagate_timeout: tokio::timer::Interval, config: ProtocolConfig, - on_demand: Option>>, + /// Handler for on-demand requests. + on_demand_core: OnDemandCore, genesis_hash: B::Hash, sync: ChainSync, specialization: S, @@ -76,10 +92,6 @@ pub struct Protocol, H: ExHashT> { context_data: ContextData, // Connected peers pending Status message. handshaking_peers: HashMap, - // Connected peers from whom we received a Status message, - // similar to context_data.peers but shared with the SyncProvider. - connected_peers: Arc>>>, - transaction_pool: Arc>, } /// A peer from whom we have received a Status message. @@ -134,40 +146,97 @@ pub struct PeerInfo { pub best_number: ::Number, } +/// Context passed as input to the methods of `protocol.rs` and that is used to communicate back +/// with the network. +pub trait NetworkOut { + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); + + /// Force disconnecting from a peer. + fn disconnect_peer(&mut self, who: PeerId); + + /// Send a message to a peer. + fn send_message(&mut self, who: PeerId, message: Message); +} + +impl<'a, 'b, B: BlockT> OnDemandNetwork for &'a mut &'b mut dyn NetworkOut { + fn report_peer(&mut self, who: &PeerId, reputation: i32) { + NetworkOut::report_peer(**self, who.clone(), reputation) + } + + fn disconnect_peer(&mut self, who: &PeerId) { + NetworkOut::disconnect_peer(**self, who.clone()) + } + + fn send_request(&mut self, who: &PeerId, message: Message) { + NetworkOut::send_message(**self, who.clone(), message) + } +} + /// Context for a network-specific handler. pub trait Context { - /// Get a reference to the client. - fn client(&self) -> &crate::chain::Client; + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); - /// Point out that a peer has been malign or irresponsible or appeared lazy. - fn report_peer(&mut self, who: PeerId, reason: Severity); + /// Force disconnecting from a peer. Use this when a peer misbehaved. + fn disconnect_peer(&mut self, who: PeerId); - /// Get peer info. - fn peer_info(&self, peer: &PeerId) -> Option>; + /// Send a consensus message to a peer. + fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage); - /// Send a message to a peer. - fn send_message(&mut self, who: PeerId, data: crate::message::Message); + /// Send a chain-specific message to a peer. + fn send_chain_specific(&mut self, who: PeerId, message: Vec); } /// Protocol context. struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { - network_chan: &'a NetworkChan, + network_out: &'a mut dyn NetworkOut, context_data: &'a mut ContextData, } impl<'a, B: BlockT + 'a, H: 'a + ExHashT> ProtocolContext<'a, B, H> { - fn new(context_data: &'a mut ContextData, network_chan: &'a NetworkChan) -> Self { - ProtocolContext { network_chan, context_data } + fn new(context_data: &'a mut ContextData, network_out: &'a mut dyn NetworkOut) -> Self { + ProtocolContext { network_out, context_data } } } impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, H> { - fn send_message(&mut self, who: PeerId, message: Message) { - send_message(&mut self.context_data.peers, &self.network_chan, who, message) + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.network_out.report_peer(who, reputation) + } + + fn disconnect_peer(&mut self, who: PeerId) { + self.network_out.disconnect_peer(who) + } + + fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::Consensus(consensus) + ) } - fn report_peer(&mut self, who: PeerId, reason: Severity) { - self.network_chan.send(NetworkMsg::ReportPeer(who, reason)) + fn send_chain_specific(&mut self, who: PeerId, message: Vec) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::ChainSpecific(message) + ) + } +} + +impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SyncContext for ProtocolContext<'a, B, H> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.network_out.report_peer(who, reputation) + } + + fn disconnect_peer(&mut self, who: PeerId) { + self.network_out.disconnect_peer(who) } fn peer_info(&self, who: &PeerId) -> Option> { @@ -177,6 +246,24 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, fn client(&self) -> &Client { &*self.context_data.chain } + + fn send_finality_proof_request(&mut self, who: PeerId, request: FinalityProofRequestMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::FinalityProofRequest(request) + ) + } + + fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::BlockRequest(request) + ) + } } /// Data necessary to create a context. @@ -186,248 +273,91 @@ struct ContextData { pub chain: Arc>, } -/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. -pub trait SpecTask> { - fn call_box(self: Box, spec: &mut S, context: &mut Context); -} - -impl, F: FnOnce(&mut S, &mut Context)> SpecTask for F { - fn call_box(self: Box, spec: &mut S, context: &mut Context) { - (*self)(spec, context) - } -} - -/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. -pub trait GossipTask { - fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context); -} - -impl, &mut Context)> GossipTask for F { - fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context) { - (*self)(gossip, context) - } -} - -/// Messages sent to Protocol from elsewhere inside the system. -pub enum ProtocolMsg> { - /// A batch of blocks has been processed, with or without errors. - BlocksProcessed(Vec, bool), - /// Tell protocol to restart sync. - RestartSync, - /// Propagate status updates. - Status, - /// Tell protocol to propagate extrinsics. - PropagateExtrinsics, - /// Tell protocol that a block was imported (sent by the import-queue). - BlockImportedSync(B::Hash, NumberFor), - /// Tell protocol to clear all pending justification requests. - ClearJustificationRequests, - /// Tell protocol to request justification for a block. - RequestJustification(B::Hash, NumberFor), - /// Inform protocol whether a justification was successfully imported. - JustificationImportResult(B::Hash, NumberFor, bool), - /// Propagate a block to peers. - AnnounceBlock(B::Hash), - /// A block has been imported (sent by the client). - BlockImported(B::Hash, B::Header), - /// A block has been finalized (sent by the client). - BlockFinalized(B::Hash, B::Header), - /// Execute a closure with the chain-specific network specialization. - ExecuteWithSpec(Box + Send + 'static>), - /// Execute a closure with the consensus gossip. - ExecuteWithGossip(Box + Send + 'static>), - /// Incoming gossip consensus message. - GossipConsensusMessage(B::Hash, ConsensusEngineId, Vec, GossipMessageRecipient), - /// Tell protocol to abort sync (does not stop protocol). - /// Only used in tests. - #[cfg(any(test, feature = "test-helpers"))] - Abort, - /// Tell protocol to abort sync and stop. - Stop, - /// Tell protocol to perform regular maintenance. - Tick, -} - -/// Messages sent to Protocol from Network-libp2p. -pub enum FromNetworkMsg { - /// A peer connected, with debug info. - PeerConnected(PeerId, String), - /// A peer disconnected, with debug info. - PeerDisconnected(PeerId, String), - /// A custom message from another peer. - CustomMessage(PeerId, Message), - /// Let protocol know a peer is currenlty clogged. - PeerClogged(PeerId, Option>), -} - -enum Incoming> { - FromNetwork(FromNetworkMsg), - FromClient(ProtocolMsg) -} - impl, H: ExHashT> Protocol { /// Create a new instance. pub fn new( - status_sinks: Arc>>>>, - is_offline: Arc, - is_major_syncing: Arc, - connected_peers: Arc>>>, - network_chan: NetworkChan, config: ProtocolConfig, chain: Arc>, - import_queue: Box>, - on_demand: Option>>, - transaction_pool: Arc>, + checker: Arc>, specialization: S, - ) -> error::Result<(Sender>, Sender>)> { - let (protocol_sender, port) = channel::unbounded(); - let (from_network_sender, from_network_port) = channel::bounded(4); + ) -> error::Result> { let info = chain.info()?; - let sync = ChainSync::new(is_offline, is_major_syncing, config.roles, &info, import_queue); - let _ = thread::Builder::new() - .name("Protocol".into()) - .spawn(move || { - let mut protocol = Protocol { - status_sinks, - network_chan, - from_network_port, - port, - config: config, - context_data: ContextData { - peers: HashMap::new(), - chain, - }, - on_demand, - genesis_hash: info.chain.genesis_hash, - sync, - specialization: specialization, - consensus_gossip: ConsensusGossip::new(), - handshaking_peers: HashMap::new(), - connected_peers, - transaction_pool: transaction_pool, - }; - let tick_timeout = channel::tick(TICK_TIMEOUT); - let propagate_timeout = channel::tick(PROPAGATE_TIMEOUT); - let status_interval = channel::tick(STATUS_INTERVAL); - while protocol.run(&tick_timeout, &propagate_timeout, &status_interval) { - // Running until all senders have been dropped... - } - }) - .expect("Protocol thread spawning failed"); - Ok((protocol_sender, from_network_sender)) - } - - fn run( - &mut self, - tick_timeout: &Receiver, - propagate_timeout: &Receiver, - status_interval: &Receiver, - ) -> bool { - let msg = select! { - recv(self.port) -> event => { - match event { - Ok(msg) => Incoming::FromClient(msg), - // Our sender has been dropped, quit. - Err(_) => { - Incoming::FromClient(ProtocolMsg::Stop) - }, - } - }, - recv(self.from_network_port) -> event => { - match event { - Ok(msg) => Incoming::FromNetwork(msg), - // Our sender has been dropped, quit. - Err(_) => { - Incoming::FromClient(ProtocolMsg::Stop) - }, - } + let sync = ChainSync::new(config.roles, &info); + Ok(Protocol { + tick_timeout: tokio::timer::Interval::new_interval(TICK_TIMEOUT), + propagate_timeout: tokio::timer::Interval::new_interval(PROPAGATE_TIMEOUT), + config: config, + context_data: ContextData { + peers: HashMap::new(), + chain, }, - recv(tick_timeout) -> _ => { - Incoming::FromClient(ProtocolMsg::Tick) - }, - recv(propagate_timeout) -> _ => { - Incoming::FromClient(ProtocolMsg::PropagateExtrinsics) - }, - recv(status_interval) -> _ => { - Incoming::FromClient(ProtocolMsg::Status) - }, - }; - self.handle_msg(msg) + on_demand_core: OnDemandCore::new(checker), + genesis_hash: info.chain.genesis_hash, + sync, + specialization: specialization, + consensus_gossip: ConsensusGossip::new(), + handshaking_peers: HashMap::new(), + }) } - fn handle_msg(&mut self, msg: Incoming) -> bool { - match msg { - Incoming::FromNetwork(msg) => self.handle_network_msg(msg), - Incoming::FromClient(msg) => self.handle_client_msg(msg), + /// Returns an object representing the status of the protocol. + pub fn status(&self) -> ProtocolStatus { + ProtocolStatus { + sync: self.sync.status(), + num_peers: self.context_data.peers.values().count(), + num_active_peers: self + .context_data + .peers + .values() + .filter(|p| p.block_request.is_some()) + .count(), } } - fn handle_client_msg(&mut self, msg: ProtocolMsg) -> bool { - match msg { - ProtocolMsg::Status => self.on_status(), - ProtocolMsg::BlockImported(hash, header) => self.on_block_imported(hash, &header), - ProtocolMsg::BlockFinalized(hash, header) => self.on_block_finalized(hash, &header), - ProtocolMsg::ExecuteWithSpec(task) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - task.call_box(&mut self.specialization, &mut context); - }, - ProtocolMsg::ExecuteWithGossip(task) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - task.call_box(&mut self.consensus_gossip, &mut context); - } - ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => { - self.gossip_consensus_message(topic, engine_id, message, recipient) - } - ProtocolMsg::BlocksProcessed(hashes, has_error) => { - self.sync.blocks_processed(hashes, has_error); - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.maintain_sync(&mut context); - }, - ProtocolMsg::RestartSync => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.restart(&mut context); - } - ProtocolMsg::AnnounceBlock(hash) => self.announce_block(hash), - ProtocolMsg::BlockImportedSync(hash, number) => self.sync.block_imported(&hash, number), - ProtocolMsg::ClearJustificationRequests => self.sync.clear_justification_requests(), - ProtocolMsg::RequestJustification(hash, number) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.request_justification(&hash, number, &mut context); - }, - ProtocolMsg::JustificationImportResult(hash, number, success) => self.sync.justification_import_result(hash, number, success), - ProtocolMsg::PropagateExtrinsics => self.propagate_extrinsics(), - ProtocolMsg::Tick => self.tick(), - #[cfg(any(test, feature = "test-helpers"))] - ProtocolMsg::Abort => self.abort(), - ProtocolMsg::Stop => { - self.stop(); - return false; - }, - } - true + pub fn is_major_syncing(&self) -> bool { + self.sync.status().is_major_syncing() } - fn handle_network_msg(&mut self, msg: FromNetworkMsg) -> bool { - match msg { - FromNetworkMsg::PeerDisconnected(who, debug_info) => self.on_peer_disconnected(who, debug_info), - FromNetworkMsg::PeerConnected(who, debug_info) => self.on_peer_connected(who, debug_info), - FromNetworkMsg::PeerClogged(who, message) => self.on_clogged_peer(who, message), - FromNetworkMsg::CustomMessage(who, message) => { - self.on_custom_message(who, message) - }, + pub fn is_offline(&self) -> bool { + self.sync.status().is_offline() + } + + /// Starts a new data demand request. + /// + /// The parameter contains a `Sender` where the result, once received, must be sent. + pub(crate) fn add_on_demand_request(&mut self, mut network_out: &mut dyn NetworkOut, rq: RequestData) { + self.on_demand_core.add_request(&mut network_out, rq); + } + + pub fn poll( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized) + ) -> Poll { + while let Ok(Async::Ready(_)) = self.tick_timeout.poll() { + self.tick(network_out); + } + + while let Ok(Async::Ready(_)) = self.propagate_timeout.poll() { + self.propagate_extrinsics(network_out, transaction_pool); } - true + + Ok(Async::NotReady) + } + + fn is_on_demand_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { + self.on_demand_core.is_on_demand_response(&who, response_id) } - fn handle_response(&mut self, who: PeerId, response: &message::BlockResponse) -> Option> { + fn handle_response( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + response: &message::BlockResponse + ) -> Option> { if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { if let Some(_) = peer.obsolete_requests.remove(&response.id) { - trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id,); + trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id); return None; } // Clear the request. If the response is invalid peer will be disconnected anyway. @@ -435,9 +365,9 @@ impl, H: ExHashT> Protocol { if request.as_ref().map_or(false, |(_, r)| r.id == response.id) { return request.map(|(_, r)| r) } - trace!(target: "sync", "Unexpected response packet from {} ({})", who, response.id,); - let severity = Severity::Bad("Unexpected response packet received from peer".to_string()); - self.network_chan.send(NetworkMsg::ReportPeer(who, severity)) + trace!(target: "sync", "Unexpected response packet from {} ({})", who, response.id); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); } None } @@ -448,84 +378,118 @@ impl, H: ExHashT> Protocol { peer.info.best_hash = info.best_hash; peer.info.best_number = info.best_number; } - let mut peers = self.connected_peers.write(); - if let Some(ref mut peer) = peers.get_mut(who) { - peer.peer_info.best_hash = info.best_hash; - peer.peer_info.best_number = info.best_number; - } } } - /// Propagates protocol statuses. - fn on_status(&mut self) { - let status = ProtocolStatus { - sync: self.sync.status(), - num_peers: self.context_data.peers.values().count(), - num_active_peers: self - .context_data - .peers - .values() - .filter(|p| p.block_request.is_some()) - .count(), - }; - self.status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); + /// Returns information about all the peers we are connected to after the handshake message. + pub fn peers_info(&self) -> impl Iterator)> { + self.context_data.peers.iter().map(|(id, peer)| (id, &peer.info)) } - fn on_custom_message(&mut self, who: PeerId, message: Message) { + pub fn on_custom_message( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), + who: PeerId, + message: Message, + finality_proof_provider: Option<&FinalityProofProvider> + ) -> CustomMessageOutcome { match message { - GenericMessage::Status(s) => self.on_status_message(who, s), - GenericMessage::BlockRequest(r) => self.on_block_request(who, r), + GenericMessage::Status(s) => self.on_status_message(network_out, who, s), + GenericMessage::BlockRequest(r) => self.on_block_request(network_out, who, r), GenericMessage::BlockResponse(r) => { - if let Some(request) = self.handle_response(who.clone(), &r) { - self.on_block_response(who.clone(), request, r); - self.update_peer_info(&who); + // Note, this is safe because only `ordinary bodies` and `remote bodies` are received in this matter. + if self.is_on_demand_response(&who, r.id) { + self.on_remote_body_response(network_out, who, r); + } else { + if let Some(request) = self.handle_response(network_out, who.clone(), &r) { + let outcome = self.on_block_response(network_out, who.clone(), request, r); + self.update_peer_info(&who); + return outcome + } } }, GenericMessage::BlockAnnounce(announce) => { - self.on_block_announce(who.clone(), announce); + self.on_block_announce(network_out, who.clone(), announce); self.update_peer_info(&who); }, - GenericMessage::Transactions(m) => self.on_extrinsics(who, m), - GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(who, request), - GenericMessage::RemoteCallResponse(response) => self.on_remote_call_response(who, response), - GenericMessage::RemoteReadRequest(request) => self.on_remote_read_request(who, request), - GenericMessage::RemoteReadResponse(response) => self.on_remote_read_response(who, response), - GenericMessage::RemoteHeaderRequest(request) => self.on_remote_header_request(who, request), - GenericMessage::RemoteHeaderResponse(response) => self.on_remote_header_response(who, response), - GenericMessage::RemoteChangesRequest(request) => self.on_remote_changes_request(who, request), - GenericMessage::RemoteChangesResponse(response) => self.on_remote_changes_response(who, response), + GenericMessage::Transactions(m) => + self.on_extrinsics(network_out, transaction_pool, who, m), + GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(network_out, who, request), + GenericMessage::RemoteCallResponse(response) => + self.on_remote_call_response(network_out, who, response), + GenericMessage::RemoteReadRequest(request) => + self.on_remote_read_request(network_out, who, request), + GenericMessage::RemoteReadResponse(response) => + self.on_remote_read_response(network_out, who, response), + GenericMessage::RemoteHeaderRequest(request) => + self.on_remote_header_request(network_out, who, request), + GenericMessage::RemoteHeaderResponse(response) => + self.on_remote_header_response(network_out, who, response), + GenericMessage::RemoteChangesRequest(request) => + self.on_remote_changes_request(network_out, who, request), + GenericMessage::RemoteChangesResponse(response) => + self.on_remote_changes_response(network_out, who, response), + GenericMessage::FinalityProofRequest(request) => + self.on_finality_proof_request(network_out, who, request, finality_proof_provider), + GenericMessage::FinalityProofResponse(response) => + return self.on_finality_proof_response(network_out, who, response), GenericMessage::Consensus(msg) => { - self.consensus_gossip.on_incoming( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), - who, - msg, - ); + if self.context_data.peers.get(&who).map_or(false, |peer| peer.info.protocol_version > 2) { + self.consensus_gossip.on_incoming( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who, + msg, + ); + } } other => self.specialization.on_message( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), who, &mut Some(other), ), } + + CustomMessageOutcome::None } - fn send_message(&mut self, who: PeerId, message: Message) { + fn send_message(&mut self, network_out: &mut dyn NetworkOut, who: PeerId, message: Message) { send_message::( &mut self.context_data.peers, - &self.network_chan, + network_out, who, message, ); } - fn gossip_consensus_message( + /// Locks `self` and returns a context plus the `ConsensusGossip` struct. + pub fn consensus_gossip_lock<'a>( + &'a mut self, + network_out: &'a mut dyn NetworkOut + ) -> (impl Context + 'a, &'a mut ConsensusGossip) { + let context = ProtocolContext::new(&mut self.context_data, network_out); + (context, &mut self.consensus_gossip) + } + + /// Locks `self` and returns a context plus the network specialization. + pub fn specialization_lock<'a>( + &'a mut self, + network_out: &'a mut dyn NetworkOut + ) -> (impl Context + 'a, &'a mut S) { + let context = ProtocolContext::new(&mut self.context_data, network_out); + (context, &mut self.specialization) + } + + /// Gossip a consensus message to the network. + pub fn gossip_consensus_message( &mut self, + network_out: &mut dyn NetworkOut, topic: B::Hash, engine_id: ConsensusEngineId, message: Vec, recipient: GossipMessageRecipient, ) { - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); let message = ConsensusMessage { data: message, engine_id }; match recipient { GossipMessageRecipient::BroadcastToAll => @@ -533,39 +497,42 @@ impl, H: ExHashT> Protocol { GossipMessageRecipient::BroadcastNew => self.consensus_gossip.multicast(&mut context, topic, message, false), GossipMessageRecipient::Peer(who) => - self.send_message(who, GenericMessage::Consensus(message)), + self.send_message(network_out, who, GenericMessage::Consensus(message)), } } /// Called when a new peer is connected - fn on_peer_connected(&mut self, who: PeerId, debug_info: String) { + pub fn on_peer_connected(&mut self, network_out: &mut dyn NetworkOut, who: PeerId, debug_info: String) { trace!(target: "sync", "Connecting {}: {}", who, debug_info); self.handshaking_peers.insert(who.clone(), HandshakingPeer { timestamp: time::Instant::now() }); - self.send_status(who); + self.send_status(network_out, who); } /// Called by peer when it is disconnecting - fn on_peer_disconnected(&mut self, peer: PeerId, debug_info: String) { + pub fn on_peer_disconnected(&mut self, mut network_out: &mut dyn NetworkOut, peer: PeerId, debug_info: String) { trace!(target: "sync", "Disconnecting {}: {}", peer, debug_info); // lock all the the peer lists so that add/remove peer events are in order let removed = { self.handshaking_peers.remove(&peer); - self.connected_peers.write().remove(&peer); - self.context_data.peers.remove(&peer).is_some() + self.context_data.peers.remove(&peer) }; - if removed { - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.consensus_gossip.peer_disconnected(&mut context, peer.clone()); + if let Some(peer_data) = removed { + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + if peer_data.info.protocol_version > 2 { + self.consensus_gossip.peer_disconnected(&mut context, peer.clone()); + } self.sync.peer_disconnected(&mut context, peer.clone()); self.specialization.on_disconnect(&mut context, peer.clone()); - self.on_demand.as_ref().map(|s| s.on_disconnect(peer)); + self.on_demand_core.on_disconnect(&mut network_out, peer); } } /// Called as a back-pressure mechanism if the networking detects that the peer cannot process /// our messaging rate fast enough. - pub fn on_clogged_peer(&self, who: PeerId, _msg: Option>) { - // We don't do anything but print some diagnostics for now. + pub fn on_clogged_peer(&self, network_out: &mut dyn NetworkOut, who: PeerId, _msg: Option>) { + network_out.report_peer(who.clone(), CLOGGED_PEER_REPUTATION_CHANGE); + + // Print some diagnostics. if let Some(peer) = self.context_data.peers.get(&who) { debug!(target: "sync", "Clogged peer {} (protocol_version: {:?}; roles: {:?}; \ known_extrinsics: {:?}; known_blocks: {:?}; best_hash: {:?}; best_number: {:?})", @@ -576,13 +543,27 @@ impl, H: ExHashT> Protocol { } } - fn on_block_request(&mut self, peer: PeerId, request: message::BlockRequest) { + fn on_block_request( + &mut self, + network_out: &mut dyn NetworkOut, + peer: PeerId, + request: message::BlockRequest + ) { trace!(target: "sync", "BlockRequest {} from {}: from {:?} to {:?} max {:?}", request.id, peer, request.from, request.to, request.max); + + // sending block requests to the node that is unable to serve it is considered a bad behavior + if !self.config.roles.is_full() { + trace!(target: "sync", "Peer {} is trying to sync from the light node", peer); + network_out.disconnect_peer(peer.clone()); + network_out.report_peer(peer, i32::min_value()); + return; + } + let mut blocks = Vec::new(); let mut id = match request.from { message::FromBlock::Hash(h) => BlockId::Hash(h), @@ -623,9 +604,9 @@ impl, H: ExHashT> Protocol { }; blocks.push(block_data); match request.direction { - message::Direction::Ascending => id = BlockId::Number(number + As::sa(1)), + message::Direction::Ascending => id = BlockId::Number(number + One::one()), message::Direction::Descending => { - if number == As::sa(0) { + if number.is_zero() { break; } id = BlockId::Hash(parent_hash) @@ -637,105 +618,126 @@ impl, H: ExHashT> Protocol { blocks: blocks, }; trace!(target: "sync", "Sending BlockResponse with {} blocks", response.blocks.len()); - self.send_message(peer, GenericMessage::BlockResponse(response)) + self.send_message(network_out, peer, GenericMessage::BlockResponse(response)) } fn on_block_response( &mut self, + network_out: &mut dyn NetworkOut, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse, - ) { + ) -> CustomMessageOutcome { let blocks_range = match ( - response.blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), - response.blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), - ) { - (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), - (Some(first), Some(_)) => format!(" ({})", first), - _ => Default::default(), - }; + response.blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), + response.blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), + ) { + (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), + (Some(first), Some(_)) => format!(" ({})", first), + _ => Default::default(), + }; trace!(target: "sync", "BlockResponse {} from {} with {} blocks {}", - response.id, peer, response.blocks.len(), blocks_range); + response.id, + peer, + response.blocks.len(), + blocks_range + ); // TODO [andre]: move this logic to the import queue so that // justifications are imported asynchronously (#1482) if request.fields == message::BlockAttributes::JUSTIFICATION { - self.sync.on_block_justification_data( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + let outcome = self.sync.on_block_justification_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), peer, request, response, ); + + if let Some((origin, hash, nb, just)) = outcome { + CustomMessageOutcome::JustificationImport(origin, hash, nb, just) + } else { + CustomMessageOutcome::None + } + } else { - self.sync.on_block_data(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan), peer, request, response); + let outcome = self.sync.on_block_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + peer, + request, + response + ); + if let Some((origin, blocks)) = outcome { + CustomMessageOutcome::BlockImport(origin, blocks) + } else { + CustomMessageOutcome::None + } } } /// Perform time based maintenance. - fn tick(&mut self) { - self.consensus_gossip.tick(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); - self.maintain_peers(); - self.sync.tick(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); - self.on_demand - .as_ref() - .map(|s| s.maintain_peers()); + /// + /// > **Note**: This method normally doesn't have to be called except for testing purposes. + pub fn tick(&mut self, mut network_out: &mut dyn NetworkOut) { + self.consensus_gossip.tick(&mut ProtocolContext::new(&mut self.context_data, network_out)); + self.maintain_peers(network_out); + self.sync.tick(&mut ProtocolContext::new(&mut self.context_data, network_out)); + self.on_demand_core.maintain_peers(&mut network_out); } - fn maintain_peers(&mut self) { + fn maintain_peers(&mut self, network_out: &mut dyn NetworkOut) { let tick = time::Instant::now(); let mut aborting = Vec::new(); { for (who, peer) in self.context_data.peers.iter() { if peer.block_request.as_ref().map_or(false, |(t, _)| (tick - *t).as_secs() > REQUEST_TIMEOUT_SEC) { - trace!(target: "sync", "Reqeust timeout {}", who); + trace!(target: "sync", "Request timeout {}", who); aborting.push(who.clone()); } else if peer.obsolete_requests.values().any(|t| (tick - *t).as_secs() > REQUEST_TIMEOUT_SEC) { trace!(target: "sync", "Obsolete timeout {}", who); aborting.push(who.clone()); } } - for (who, _) in self.handshaking_peers.iter().filter(|(_, handshaking)| (tick - handshaking.timestamp).as_secs() > REQUEST_TIMEOUT_SEC) { + for (who, _) in self.handshaking_peers.iter() + .filter(|(_, handshaking)| (tick - handshaking.timestamp).as_secs() > REQUEST_TIMEOUT_SEC) + { trace!(target: "sync", "Handshake timeout {}", who); aborting.push(who.clone()); } } - self.specialization.maintain_peers(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); + self.specialization.maintain_peers(&mut ProtocolContext::new(&mut self.context_data, network_out)); for p in aborting { - let _ = self - .network_chan - .send(NetworkMsg::ReportPeer(p, Severity::Timeout)); + network_out.disconnect_peer(p.clone()); + network_out.report_peer(p, TIMEOUT_REPUTATION_CHANGE); } } /// Called by peer to report status - fn on_status_message(&mut self, who: PeerId, status: message::Status) { + fn on_status_message(&mut self, mut network_out: &mut dyn NetworkOut, who: PeerId, status: message::Status) { trace!(target: "sync", "New peer {} {:?}", who, status); - { + let protocol_version = { if self.context_data.peers.contains_key(&who) { debug!("Unexpected status packet from {}", who); + network_out.report_peer(who, UNEXPECTED_STATUS_REPUTATION_CHANGE); return; } if status.genesis_hash != self.genesis_hash { - let reason = format!( + trace!( + target: "protocol", "Peer is on different chain (our genesis: {} theirs: {})", self.genesis_hash, status.genesis_hash ); - self.network_chan.send(NetworkMsg::ReportPeer( - who, - Severity::Bad(reason), - )); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); return; } if status.version < MIN_VERSION && CURRENT_VERSION < status.min_supported_version { - let reason = format!("Peer using unsupported protocol version {}", status.version); - self.network_chan.send(NetworkMsg::ReportPeer( - who, - Severity::Bad(reason), - )); + trace!(target: "protocol", "Peer {:?} using unsupported protocol version {}", who, status.version); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); return; } - if self.config.roles & Roles::LIGHT == Roles::LIGHT { + if self.config.roles.is_light() { let self_best_block = self .context_data .chain @@ -744,17 +746,13 @@ impl, H: ExHashT> Protocol { .and_then(|info| info.best_queued_number) .unwrap_or_else(|| Zero::zero()); let blocks_difference = self_best_block - .as_() - .checked_sub(status.best_number.as_()) - .unwrap_or(0); + .checked_sub(&status.best_number) + .unwrap_or_else(Zero::zero) + .saturated_into::(); if blocks_difference > LIGHT_MAXIMAL_BLOCKS_DIFFERENCE { - self.network_chan.send(NetworkMsg::ReportPeer( - who, - Severity::Useless( - "Peer is far behind us and will unable to serve light requests" - .to_string(), - ), - )); + debug!(target: "sync", "Peer {} is far behind us and will unable to serve light requests", who); + network_out.report_peer(who.clone(), PEER_BEHIND_US_LIGHT_REPUTATION_CHANGE); + network_out.disconnect_peer(who); return; } } @@ -763,19 +761,15 @@ impl, H: ExHashT> Protocol { let info = match self.handshaking_peers.remove(&who) { Some(_handshaking) => { - let peer_info = PeerInfo { + PeerInfo { protocol_version: status.version, roles: status.roles, best_hash: status.best_hash, best_number: status.best_number - }; - self.connected_peers - .write() - .insert(who.clone(), ConnectedPeer { peer_info: peer_info.clone() }); - peer_info + } }, None => { - debug!(target: "sync", "Received status from previously unconnected node {}", who); + error!(target: "sync", "Received status from previously unconnected node {}", who); return; }, }; @@ -791,20 +785,26 @@ impl, H: ExHashT> Protocol { self.context_data.peers.insert(who.clone(), peer); debug!(target: "sync", "Connected {}", who); - } + status.version + }; - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.on_demand - .as_ref() - .map(|s| s.on_connect(who.clone(), status.roles, status.best_number)); + self.on_demand_core.on_connect(&mut network_out, who.clone(), status.roles, status.best_number); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); self.sync.new_peer(&mut context, who.clone()); - self.consensus_gossip - .new_peer(&mut context, who.clone(), status.roles); + if protocol_version > 2 { + self.consensus_gossip.new_peer(&mut context, who.clone(), status.roles); + } self.specialization.on_connect(&mut context, who, status); } /// Called when peer sends us new extrinsics - fn on_extrinsics(&mut self, who: PeerId, extrinsics: message::Transactions) { + fn on_extrinsics( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), + who: PeerId, + extrinsics: message::Transactions + ) { // Accept extrinsics only when fully synced if self.sync.status().state != SyncState::Idle { trace!(target: "sync", "{} Ignoring extrinsics while syncing", who); @@ -813,7 +813,8 @@ impl, H: ExHashT> Protocol { trace!(target: "sync", "Received {} extrinsics from {}", extrinsics.len(), who); if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { for t in extrinsics { - if let Some(hash) = self.transaction_pool.import(&t) { + if let Some(hash) = transaction_pool.import(&t) { + network_out.report_peer(who.clone(), NEW_EXTRINSIC_REPUTATION_CHANGE); peer.known_extrinsics.insert(hash); } else { trace!(target: "sync", "Extrinsic rejected"); @@ -822,8 +823,12 @@ impl, H: ExHashT> Protocol { } } - /// Called when we propagate ready extrinsics to peers. - fn propagate_extrinsics(&mut self) { + /// Call when we must propagate ready extrinsics to peers. + pub fn propagate_extrinsics( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized) + ) { debug!(target: "sync", "Propagating extrinsics"); // Accept transactions only when fully synced @@ -831,7 +836,7 @@ impl, H: ExHashT> Protocol { return; } - let extrinsics = self.transaction_pool.transactions(); + let extrinsics = transaction_pool.transactions(); let mut propagated_to = HashMap::new(); for (who, peer) in self.context_data.peers.iter_mut() { let (hashes, to_send): (Vec<_>, Vec<_>) = extrinsics @@ -848,17 +853,18 @@ impl, H: ExHashT> Protocol { .push(who.to_base58()); } trace!(target: "sync", "Sending {} transactions to {}", to_send.len(), who); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), GenericMessage::Transactions(to_send))) + network_out.send_message(who.clone(), GenericMessage::Transactions(to_send)) } } - self.transaction_pool.on_broadcasted(propagated_to); + + transaction_pool.on_broadcasted(propagated_to); } /// Make sure an important block is propagated to peers. /// /// In chain-based consensus, we often need to make sure non-best forks are /// at least temporarily synced. - pub fn announce_block(&mut self, hash: B::Hash) { + pub fn announce_block(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash) { let header = match self.context_data.chain.header(&BlockId::Hash(hash)) { Ok(Some(header)) => header, Ok(None) => { @@ -877,12 +883,12 @@ impl, H: ExHashT> Protocol { for (who, ref mut peer) in self.context_data.peers.iter_mut() { trace!(target: "sync", "Reannouncing block {:?} to {}", hash, who); peer.known_blocks.insert(hash); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), message.clone())) + network_out.send_message(who.clone(), message.clone()) } } /// Send Status message - fn send_status(&mut self, who: PeerId) { + fn send_status(&mut self, network_out: &mut dyn NetworkOut, who: PeerId) { if let Ok(info) = self.context_data.chain.info() { let status = message::generic::Status { version: CURRENT_VERSION, @@ -893,27 +899,16 @@ impl, H: ExHashT> Protocol { best_hash: info.chain.best_hash, chain_status: self.specialization.status(), }; - self.send_message(who, GenericMessage::Status(status)) + self.send_message(network_out, who, GenericMessage::Status(status)) } } - fn abort(&mut self) { - self.sync.clear(); - self.specialization.on_abort(); - self.context_data.peers.clear(); - self.handshaking_peers.clear(); - self.consensus_gossip.abort(); - } - - fn stop(&mut self) { - // stop processing import requests first (without holding a sync lock) - self.sync.stop(); - - // and then clear all the sync data - self.abort(); - } - - fn on_block_announce(&mut self, who: PeerId, announce: message::BlockAnnounce) { + fn on_block_announce( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + announce: message::BlockAnnounce + ) { let header = announce.header; let hash = header.hash(); { @@ -921,27 +916,27 @@ impl, H: ExHashT> Protocol { peer.known_blocks.insert(hash.clone()); } } - self.on_demand - .as_ref() - .map(|s| s.on_block_announce(who.clone(), *header.number())); + self.on_demand_core.on_block_announce(&mut network_out, who.clone(), *header.number()); self.sync.on_block_announce( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), - who, + &mut ProtocolContext::new(&mut self.context_data, network_out), + who.clone(), hash, &header, ); } - fn on_block_imported(&mut self, hash: B::Hash, header: &B::Header) { + /// Call this when a block has been imported in the import queue and we should announce it on + /// the network. + pub fn on_block_imported(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash, header: &B::Header) { self.sync.update_chain_info(header); self.specialization.on_block_imported( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), hash.clone(), header, ); // blocks are not announced by light clients - if self.config.roles & Roles::LIGHT == Roles::LIGHT { + if self.config.roles.is_light() { return; } @@ -952,25 +947,33 @@ impl, H: ExHashT> Protocol { for (who, ref mut peer) in self.context_data.peers.iter_mut() { if peer.known_blocks.insert(hash.clone()) { trace!(target: "sync", "Announcing block {:?} to {}", hash, who); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), message.clone())) + network_out.send_message(who.clone(), message.clone()) } } } - fn on_block_finalized(&mut self, hash: B::Hash, header: &B::Header) { + /// Call this when a block has been finalized. The sync layer may have some additional + /// requesting to perform. + pub fn on_block_finalized(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash, header: &B::Header) { self.sync.on_block_finalized( &hash, *header.number(), - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), ); } fn on_remote_call_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteCallRequest, ) { - trace!(target: "sync", "Remote call request {} from {} ({} at {})", request.id, who, request.method, request.block); + trace!(target: "sync", "Remote call request {} from {} ({} at {})", + request.id, + who, + request.method, + request.block + ); let proof = match self.context_data.chain.execution_proof( &request.block, &request.method, @@ -979,12 +982,19 @@ impl, H: ExHashT> Protocol { Ok((_, proof)) => proof, Err(error) => { trace!(target: "sync", "Remote call request {} from {} ({} at {}) failed with: {}", - request.id, who, request.method, request.block, error); + request.id, + who, + request.method, + request.block, + error + ); + network_out.report_peer(who.clone(), RPC_FAILED_REPUTATION_CHANGE); Default::default() } }; self.send_message( + network_out, who, GenericMessage::RemoteCallResponse(message::RemoteCallResponse { id: request.id, @@ -993,15 +1003,91 @@ impl, H: ExHashT> Protocol { ); } - fn on_remote_call_response(&mut self, who: PeerId, response: message::RemoteCallResponse) { + /// Request a justification for the given block. + /// + /// Uses `protocol` to queue a new justification request and tries to dispatch all pending + /// requests. + pub fn request_justification(&mut self, network_out: &mut dyn NetworkOut, hash: &B::Hash, number: NumberFor) { + let mut context = + ProtocolContext::new(&mut self.context_data, network_out); + self.sync.request_justification(&hash, number, &mut context); + } + + /// Clears all pending justification requests. + pub fn clear_justification_requests(&mut self) { + self.sync.clear_justification_requests() + } + + /// A batch of blocks have been processed, with or without errors. + /// Call this when a batch of blocks have been processed by the import queue, with or without + /// errors. + pub fn blocks_processed( + &mut self, + network_out: &mut dyn NetworkOut, + processed_blocks: Vec, + has_error: bool + ) { + self.sync.blocks_processed(processed_blocks, has_error); + let mut context = + ProtocolContext::new(&mut self.context_data, network_out); + self.sync.maintain_sync(&mut context); + } + + /// Restart the sync process. + pub fn restart(&mut self, network_out: &mut dyn NetworkOut) { + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.restart(&mut context); + } + + /// Notify about successful import of the given block. + pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + self.sync.block_imported(hash, number) + } + + pub fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + self.sync.set_finality_proof_request_builder(request_builder) + } + + /// Call this when a justification has been processed by the import queue, with or without + /// errors. + pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { + self.sync.justification_import_result(hash, number, success) + } + + /// Request a finality proof for the given block. + /// + /// Queues a new finality proof request and tries to dispatch all pending requests. + pub fn request_finality_proof( + &mut self, + network_out: &mut dyn NetworkOut, + hash: &B::Hash, + number: NumberFor + ) { + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.request_finality_proof(&hash, number, &mut context); + } + + pub fn finality_proof_import_result( + &mut self, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + self.sync.finality_proof_import_result(request_block, finalization_result) + } + + fn on_remote_call_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::RemoteCallResponse + ) { trace!(target: "sync", "Remote call response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_call_response(who, response)); + self.on_demand_core.on_remote_call_response(&mut network_out, who, response); } fn on_remote_read_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteReadRequest, ) { @@ -1011,11 +1097,17 @@ impl, H: ExHashT> Protocol { Ok(proof) => proof, Err(error) => { trace!(target: "sync", "Remote read request {} from {} ({} at {}) failed with: {}", - request.id, who, request.key.to_hex::(), request.block, error); + request.id, + who, + request.key.to_hex::(), + request.block, + error + ); Default::default() } }; self.send_message( + network_out, who, GenericMessage::RemoteReadResponse(message::RemoteReadResponse { id: request.id, @@ -1023,15 +1115,20 @@ impl, H: ExHashT> Protocol { }), ); } - fn on_remote_read_response(&mut self, who: PeerId, response: message::RemoteReadResponse) { + + fn on_remote_read_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::RemoteReadResponse + ) { trace!(target: "sync", "Remote read response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_read_response(who, response)); + self.on_demand_core.on_remote_read_response(&mut network_out, who, response); } fn on_remote_header_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteHeaderRequest>, ) { @@ -1041,11 +1138,16 @@ impl, H: ExHashT> Protocol { Ok((header, proof)) => (Some(header), proof), Err(error) => { trace!(target: "sync", "Remote header proof request {} from {} ({}) failed with: {}", - request.id, who, request.block, error); + request.id, + who, + request.block, + error + ); (Default::default(), Default::default()) } }; self.send_message( + network_out, who, GenericMessage::RemoteHeaderResponse(message::RemoteHeaderResponse { id: request.id, @@ -1057,28 +1159,45 @@ impl, H: ExHashT> Protocol { fn on_remote_header_response( &mut self, + mut network_out: &mut dyn NetworkOut, who: PeerId, response: message::RemoteHeaderResponse, ) { trace!(target: "sync", "Remote header proof response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_header_response(who, response)); + self.on_demand_core.on_remote_header_response(&mut network_out, who, response); } fn on_remote_changes_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteChangesRequest, ) { trace!(target: "sync", "Remote changes proof request {} from {} for key {} ({}..{})", - request.id, who, request.key.to_hex::(), request.first, request.last); + request.id, + who, + request.key.to_hex::(), + request.first, + request.last + ); let key = StorageKey(request.key); - let proof = match self.context_data.chain.key_changes_proof(request.first, request.last, request.min, request.max, &key) { + let proof = match self.context_data.chain.key_changes_proof( + request.first, + request.last, + request.min, + request.max, + &key + ) { Ok(proof) => proof, Err(error) => { trace!(target: "sync", "Remote changes proof request {} from {} for key {} ({}..{}) failed with: {}", - request.id, who, key.0.to_hex::(), request.first, request.last, error); + request.id, + who, + key.0.to_hex::(), + request.first, + request.last, + error + ); ChangesProof:: { max_block: Zero::zero(), proof: vec![], @@ -1088,6 +1207,7 @@ impl, H: ExHashT> Protocol { } }; self.send_message( + network_out, who, GenericMessage::RemoteChangesResponse(message::RemoteChangesResponse { id: request.id, @@ -1101,20 +1221,95 @@ impl, H: ExHashT> Protocol { fn on_remote_changes_response( &mut self, + mut network_out: &mut dyn NetworkOut, who: PeerId, response: message::RemoteChangesResponse, B::Hash>, ) { trace!(target: "sync", "Remote changes proof response {} from {} (max={})", - response.id, who, response.max); - self.on_demand - .as_ref() - .map(|s| s.on_remote_changes_response(who, response)); + response.id, + who, + response.max + ); + self.on_demand_core.on_remote_changes_response(&mut network_out, who, response); + } + + fn on_finality_proof_request( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + request: message::FinalityProofRequest, + finality_proof_provider: Option<&FinalityProofProvider> + ) { + trace!(target: "sync", "Finality proof request from {} for {}", who, request.block); + let finality_proof = finality_proof_provider.as_ref() + .ok_or_else(|| String::from("Finality provider is not configured")) + .and_then(|provider| + provider.prove_finality(request.block, &request.request).map_err(|e| e.to_string()) + ); + let finality_proof = match finality_proof { + Ok(finality_proof) => finality_proof, + Err(error) => { + trace!(target: "sync", "Finality proof request from {} for {} failed with: {}", + who, + request.block, + error + ); + None + }, + }; + self.send_message( + network_out, + who, + GenericMessage::FinalityProofResponse(message::FinalityProofResponse { + id: 0, + block: request.block, + proof: finality_proof, + }), + ); } + + fn on_finality_proof_response( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::FinalityProofResponse, + ) -> CustomMessageOutcome { + trace!(target: "sync", "Finality proof response from {} for {}", who, response.block); + let outcome = self.sync.on_block_finality_proof_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who, + response, + ); + + if let Some((origin, hash, nb, proof)) = outcome { + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) + } else { + CustomMessageOutcome::None + } + } + + fn on_remote_body_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + peer: PeerId, + response: message::BlockResponse + ) { + self.on_demand_core.on_remote_body_response(&mut network_out, peer, response); + } +} + +/// Outcome of an incoming custom message. +#[derive(Debug)] +pub enum CustomMessageOutcome { + BlockImport(BlockOrigin, Vec>), + JustificationImport(Origin, B::Hash, NumberFor, Justification), + FinalityProofImport(Origin, B::Hash, NumberFor, Vec), + None, } fn send_message( peers: &mut HashMap>, - network_chan: &NetworkChan, + network_out: &mut dyn NetworkOut, who: PeerId, mut message: Message, ) { @@ -1129,104 +1324,5 @@ fn send_message( peer.block_request = Some((time::Instant::now(), r.clone())); } } - network_chan.send(NetworkMsg::Outgoing(who, message)); -} - -/// Construct a simple protocol that is composed of several sub protocols. -/// Each "sub protocol" needs to implement `Specialization` and needs to provide a `new()` function. -/// For more fine grained implementations, this macro is not usable. -/// -/// # Example -/// -/// ```nocompile -/// construct_simple_protocol! { -/// pub struct MyProtocol where Block = MyBlock { -/// consensus_gossip: ConsensusGossip, -/// other_protocol: MyCoolStuff, -/// } -/// } -/// ``` -/// -/// You can also provide an optional parameter after `where Block = MyBlock`, so it looks like -/// `where Block = MyBlock, Status = consensus_gossip`. This will instruct the implementation to -/// use the `status()` function from the `ConsensusGossip` protocol. By default, `status()` returns -/// an empty vector. -#[macro_export] -macro_rules! construct_simple_protocol { - ( - $( #[ $attr:meta ] )* - pub struct $protocol:ident where - Block = $block:ident - $( , Status = $status_protocol_name:ident )* - { - $( $sub_protocol_name:ident : $sub_protocol:ident $( <$protocol_block:ty> )*, )* - } - ) => { - $( #[$attr] )* - pub struct $protocol { - $( $sub_protocol_name: $sub_protocol $( <$protocol_block> )*, )* - } - - impl $protocol { - /// Instantiate a node protocol handler. - pub fn new() -> Self { - Self { - $( $sub_protocol_name: $sub_protocol::new(), )* - } - } - } - - impl $crate::specialization::NetworkSpecialization<$block> for $protocol { - fn status(&self) -> Vec { - $( - let status = self.$status_protocol_name.status(); - - if !status.is_empty() { - return status; - } - )* - - Vec::new() - } - - fn on_connect( - &mut self, - _ctx: &mut $crate::Context<$block>, - _who: $crate::PeerId, - _status: $crate::StatusMessage<$block> - ) { - $( self.$sub_protocol_name.on_connect(_ctx, _who, _status); )* - } - - fn on_disconnect(&mut self, _ctx: &mut $crate::Context<$block>, _who: $crate::PeerId) { - $( self.$sub_protocol_name.on_disconnect(_ctx, _who); )* - } - - fn on_message( - &mut self, - _ctx: &mut $crate::Context<$block>, - _who: $crate::PeerId, - _message: &mut Option<$crate::message::Message<$block>> - ) { - $( self.$sub_protocol_name.on_message(_ctx, _who, _message); )* - } - - fn on_abort(&mut self) { - $( self.$sub_protocol_name.on_abort(); )* - } - - fn maintain_peers(&mut self, _ctx: &mut $crate::Context<$block>) { - $( self.$sub_protocol_name.maintain_peers(_ctx); )* - } - - fn on_block_imported( - &mut self, - _ctx: &mut $crate::Context<$block>, - _hash: <$block as $crate::BlockT>::Hash, - _header: &<$block as $crate::BlockT>::Header - ) { - $( self.$sub_protocol_name.on_block_imported(_ctx, _hash, _header); )* - } - } - } + network_out.send_message(who, message); } diff --git a/core/network/src/service.rs b/core/network/src/service.rs index 7244080bf7954a154cb95b2b0b664461225007cd..b2e56a83bd2ef944b498dd5519e012515d4e30ba 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -17,43 +17,54 @@ use std::collections::HashMap; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; -use std::{io, thread}; +use std::{io, thread, time::Duration}; -use log::{warn, debug, error, trace, info}; -use futures::{Async, Future, Stream, stream, sync::oneshot, sync::mpsc}; +use log::{warn, debug, error, info}; +use futures::{Async, Future, Stream, sync::oneshot, sync::mpsc}; use parking_lot::{Mutex, RwLock}; -use network_libp2p::{ProtocolId, NetworkConfiguration, Severity}; +use network_libp2p::{ProtocolId, NetworkConfiguration}; use network_libp2p::{start_service, parse_str_addr, Service as NetworkService, ServiceEvent as NetworkServiceEvent}; -use network_libp2p::{multiaddr, RegisteredProtocol, NetworkState}; +use network_libp2p::{RegisteredProtocol, NetworkState}; use peerset::PeersetHandle; -use consensus::import_queue::{ImportQueue, Link}; +use consensus::import_queue::{ImportQueue, Link, SharedFinalityProofRequestBuilder}; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; +use crate::AlwaysBadChecker; +use crate::chain::FinalityProofProvider; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; use crate::message::Message; -use crate::protocol::{self, Context, FromNetworkMsg, Protocol, ConnectedPeer, ProtocolMsg, ProtocolStatus, PeerInfo}; +use crate::on_demand::RequestData; +use crate::protocol::{self, Context, CustomMessageOutcome, Protocol, ConnectedPeer}; +use crate::protocol::{ProtocolStatus, PeerInfo, NetworkOut}; use crate::config::Params; use crate::error::Error; use crate::specialization::NetworkSpecialization; -use crossbeam_channel::{self as channel, Receiver, Sender, TryRecvError}; -use tokio::prelude::task::AtomicTask; use tokio::runtime::Builder as RuntimeBuilder; +/// Interval at which we send status updates on the SyncProvider status stream. +const STATUS_INTERVAL: Duration = Duration::from_millis(5000); +/// Interval at which we update the `peers` field on the main thread. +const CONNECTED_PEERS_INTERVAL: Duration = Duration::from_millis(500); + pub use network_libp2p::PeerId; /// Type that represents fetch completion future. pub type FetchFuture = oneshot::Receiver>; - /// Sync status pub trait SyncProvider: Send + Sync { /// Get a stream of sync statuses. fn status(&self) -> mpsc::UnboundedReceiver>; /// Get network state. fn network_state(&self) -> NetworkState; - /// Get currently connected peers - fn peers(&self) -> Vec<(PeerId, PeerInfo)>; + + /// Get currently connected peers. + /// + /// > **Warning**: This method can return outdated information and should only ever be used + /// > when obtaining outdated information is acceptable. + fn peers_debug_info(&self) -> Vec<(PeerId, PeerInfo)>; + /// Are we in the process of downloading the chain? fn is_major_syncing(&self) -> bool; } @@ -82,50 +93,86 @@ pub trait TransactionPool: Send + Sync { #[derive(Clone)] pub struct NetworkLink> { /// The protocol sender - pub(crate) protocol_sender: Sender>, + pub(crate) protocol_sender: mpsc::UnboundedSender>, /// The network sender - pub(crate) network_sender: NetworkChan, + pub(crate) network_sender: mpsc::UnboundedSender>, } impl> Link for NetworkLink { fn block_imported(&self, hash: &B::Hash, number: NumberFor) { - let _ = self.protocol_sender.send(ProtocolMsg::BlockImportedSync(hash.clone(), number)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlockImportedSync(hash.clone(), number)); } fn blocks_processed(&self, processed_blocks: Vec, has_error: bool) { - let _ = self.protocol_sender.send(ProtocolMsg::BlocksProcessed(processed_blocks, has_error)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlocksProcessed(processed_blocks, has_error)); } fn justification_imported(&self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) { - let _ = self.protocol_sender.send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success)); if !success { - let reason = Severity::Bad(format!("Invalid justification provided for #{}", hash).to_string()); - let _ = self.network_sender.send(NetworkMsg::ReportPeer(who, reason)); + info!("Invalid justification provided by {} for #{}", who, hash); + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); + let _ = self.network_sender.unbounded_send(NetworkMsg::DisconnectPeer(who.clone())); } } fn clear_justification_requests(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::ClearJustificationRequests); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::ClearJustificationRequests); } fn request_justification(&self, hash: &B::Hash, number: NumberFor) { - let _ = self.protocol_sender.send(ProtocolMsg::RequestJustification(hash.clone(), number)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestJustification(hash.clone(), number)); } - fn useless_peer(&self, who: PeerId, reason: &str) { - trace!(target:"sync", "Useless peer {}, {}", who, reason); - self.network_sender.send(NetworkMsg::ReportPeer(who, Severity::Useless(reason.to_string()))); + fn request_finality_proof(&self, hash: &B::Hash, number: NumberFor) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestFinalityProof( + hash.clone(), + number, + )); } - fn note_useless_and_restart_sync(&self, who: PeerId, reason: &str) { - trace!(target:"sync", "Bad peer {}, {}", who, reason); - // is this actually malign or just useless? - self.network_sender.send(NetworkMsg::ReportPeer(who, Severity::Useless(reason.to_string()))); - let _ = self.protocol_sender.send(ProtocolMsg::RestartSync); + fn finality_proof_imported( + &self, + who: PeerId, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + let success = finalization_result.is_ok(); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::FinalityProofImportResult( + request_block, + finalization_result, + )); + if !success { + info!("Invalid finality proof provided by {} for #{}", who, request_block.0); + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); + let _ = self.network_sender.unbounded_send(NetworkMsg::DisconnectPeer(who.clone())); + } + } + + fn report_peer(&self, who: PeerId, reputation_change: i32) { + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who, reputation_change)); } fn restart(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::RestartSync); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RestartSync); + } + + fn set_finality_proof_request_builder(&self, request_builder: SharedFinalityProofRequestBuilder) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::SetFinalityProofRequestBuilder(request_builder)); + } +} + +/// A cloneable handle for reporting cost/benefits of peers. +#[derive(Clone)] +pub struct ReportHandle { + inner: PeersetHandle, // wraps it so we don't have to worry about breaking API. +} + +impl ReportHandle { + /// Report a given peer as either beneficial (+) or costly (-) according to the + /// given scalar. + pub fn report_peer(&self, who: PeerId, cost_benefit: i32) { + self.inner.report_peer(who, cost_benefit); } } @@ -139,13 +186,15 @@ pub struct Service> { is_major_syncing: Arc, /// Peers whom we are connected with. peers: Arc>>>, + /// Channel for networking messages processed by the background thread. + network_chan: mpsc::UnboundedSender>, /// Network service network: Arc>>>, /// Peerset manager (PSM); manages the reputation of nodes and indicates the network which /// nodes it should be connected to or not. peerset: PeersetHandle, /// Protocol sender - protocol_sender: Sender>, + protocol_sender: mpsc::UnboundedSender>, /// Sender for messages to the background service task, and handle for the background thread. /// Dropping the sender should close the task and the thread. /// This is an `Option` because we need to extract it in the destructor. @@ -158,39 +207,44 @@ impl> Service { params: Params, protocol_id: ProtocolId, import_queue: Box>, - ) -> Result<(Arc>, NetworkChan), Error> { - let (network_chan, network_port) = network_channel(); + ) -> Result>, Error> { + let (network_chan, network_port) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); let status_sinks = Arc::new(Mutex::new(Vec::new())); // Start in off-line mode, since we're not connected to any nodes yet. let is_offline = Arc::new(AtomicBool::new(true)); let is_major_syncing = Arc::new(AtomicBool::new(false)); let peers: Arc>>> = Arc::new(Default::default()); - let (protocol_sender, network_to_protocol_sender) = Protocol::new( - status_sinks.clone(), - is_offline.clone(), - is_major_syncing.clone(), - peers.clone(), - network_chan.clone(), + let protocol = Protocol::new( params.config, params.chain, - import_queue.clone(), - params.on_demand, - params.transaction_pool, + params.on_demand.as_ref().map(|od| od.checker().clone()) + .unwrap_or(Arc::new(AlwaysBadChecker)), params.specialization, )?; - let versions = [(protocol::CURRENT_VERSION as u8)]; - let registered = RegisteredProtocol::new(protocol_id, &versions[..]); + let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); + let registered = RegisteredProtocol::new(protocol_id, &versions); let (thread, network, peerset) = start_thread( - network_to_protocol_sender, + is_offline.clone(), + is_major_syncing.clone(), + protocol, + peers.clone(), + import_queue.clone(), + params.transaction_pool, + params.finality_proof_provider, network_port, + protocol_rx, + status_sinks.clone(), params.network_config, registered, + params.on_demand.and_then(|od| od.extract_receiver()), )?; let service = Arc::new(Service { status_sinks, is_offline, is_major_syncing, + network_chan: network_chan.clone(), peers, peerset, network, @@ -201,12 +255,12 @@ impl> Service { // connect the import-queue to the network service. let link = NetworkLink { protocol_sender, - network_sender: network_chan.clone(), + network_sender: network_chan, }; import_queue.start(Box::new(link))?; - Ok((service, network_chan)) + Ok(service) } /// Returns the downloaded bytes per second averaged over the past few seconds. @@ -230,19 +284,19 @@ impl> Service { pub fn on_block_imported(&self, hash: B::Hash, header: B::Header) { let _ = self .protocol_sender - .send(ProtocolMsg::BlockImported(hash, header)); + .unbounded_send(ProtocolMsg::BlockImported(hash, header)); } /// Called when a new block is finalized by the client. pub fn on_block_finalized(&self, hash: B::Hash, header: B::Header) { let _ = self .protocol_sender - .send(ProtocolMsg::BlockFinalized(hash, header)); + .unbounded_send(ProtocolMsg::BlockFinalized(hash, header)); } /// Called when new transactons are imported by the client. pub fn trigger_repropagate(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::PropagateExtrinsics); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::PropagateExtrinsics); } /// Make sure an important block is propagated to peers. @@ -250,7 +304,7 @@ impl> Service { /// In chain-based consensus, we often need to make sure non-best forks are /// at least temporarily synced. pub fn announce_block(&self, hash: B::Hash) { - let _ = self.protocol_sender.send(ProtocolMsg::AnnounceBlock(hash)); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::AnnounceBlock(hash)); } /// Send a consensus message through the gossip @@ -263,18 +317,38 @@ impl> Service { ) { let _ = self .protocol_sender - .send(ProtocolMsg::GossipConsensusMessage( + .unbounded_send(ProtocolMsg::GossipConsensusMessage( topic, engine_id, message, recipient, )); } + /// Report a given peer as either beneficial (+) or costly (-) according to the + /// given scalar. + pub fn report_peer(&self, who: PeerId, cost_benefit: i32) { + self.peerset.report_peer(who, cost_benefit); + } + + /// Send a message to the given peer. Has no effect if we're not connected to this peer. + /// + /// This method is extremely poor in terms of API and should be eventually removed. + pub fn disconnect_peer(&self, who: PeerId) { + let _ = self.network_chan.unbounded_send(NetworkMsg::DisconnectPeer(who)); + } + + /// Send a message to the given peer. Has no effect if we're not connected to this peer. + /// + /// This method is extremely poor in terms of API and should be eventually removed. + pub fn send_request(&self, who: PeerId, message: Message) { + let _ = self.network_chan.unbounded_send(NetworkMsg::Outgoing(who, message)); + } + /// Execute a closure with the chain-specific network specialization. pub fn with_spec(&self, f: F) where F: FnOnce(&mut S, &mut Context) + Send + 'static { let _ = self .protocol_sender - .send(ProtocolMsg::ExecuteWithSpec(Box::new(f))); + .unbounded_send(ProtocolMsg::ExecuteWithSpec(Box::new(f))); } /// Execute a closure with the consensus gossip. @@ -283,7 +357,7 @@ impl> Service { { let _ = self .protocol_sender - .send(ProtocolMsg::ExecuteWithGossip(Box::new(f))); + .unbounded_send(ProtocolMsg::ExecuteWithGossip(Box::new(f))); } /// Are we in the process of downloading the chain? @@ -330,7 +404,7 @@ impl> SyncProvider for Servi self.network.lock().state() } - fn peers(&self) -> Vec<(PeerId, PeerInfo)> { + fn peers_debug_info(&self) -> Vec<(PeerId, PeerInfo)> { let peers = (*self.peers.read()).clone(); peers.into_iter().map(|(idx, connected)| (idx, connected.peer_info)).collect() } @@ -346,8 +420,6 @@ pub trait ManageNetwork { fn remove_reserved_peer(&self, peer: PeerId); /// Add reserved peer fn add_reserved_peer(&self, peer: String) -> Result<(), String>; - /// Returns a user-friendly identifier of our node. - fn node_id(&self) -> Option; } impl> ManageNetwork for Service { @@ -369,111 +441,101 @@ impl> ManageNetwork for Service self.network.lock().add_known_address(peer_id, addr); Ok(()) } - - fn node_id(&self) -> Option { - let network = self.network.lock(); - let ret = network - .listeners() - .next() - .map(|addr| { - let mut addr = addr.clone(); - addr.append(multiaddr::Protocol::P2p(network.peer_id().clone().into())); - addr.to_string() - }); - ret - } } - -/// Create a NetworkPort/Chan pair. -pub fn network_channel() -> (NetworkChan, NetworkPort) { - let (network_sender, network_receiver) = channel::unbounded(); - let task_notify = Arc::new(AtomicTask::new()); - let network_port = NetworkPort::new(network_receiver, task_notify.clone()); - let network_chan = NetworkChan::new(network_sender, task_notify); - (network_chan, network_port) +/// Messages to be handled by NetworkService. +#[derive(Debug)] +pub enum NetworkMsg { + /// Send an outgoing custom message. + Outgoing(PeerId, Message), + /// Disconnect a peer we're connected to, or do nothing if we're not connected. + DisconnectPeer(PeerId), + /// Performs a reputation adjustement on a peer. + ReportPeer(PeerId, i32), + /// Synchronization response. + #[cfg(any(test, feature = "test-helpers"))] + Synchronized, } - -/// A sender of NetworkMsg that notifies a task when a message has been sent. -#[derive(Clone)] -pub struct NetworkChan { - sender: Sender>, - task_notify: Arc, +/// Messages sent to Protocol from elsewhere inside the system. +pub enum ProtocolMsg> { + /// A batch of blocks has been processed, with or without errors. + BlocksProcessed(Vec, bool), + /// Tell protocol to restart sync. + RestartSync, + /// Tell protocol to propagate extrinsics. + PropagateExtrinsics, + /// Tell protocol that a block was imported (sent by the import-queue). + BlockImportedSync(B::Hash, NumberFor), + /// Tell protocol to clear all pending justification requests. + ClearJustificationRequests, + /// Tell protocol to request justification for a block. + RequestJustification(B::Hash, NumberFor), + /// Inform protocol whether a justification was successfully imported. + JustificationImportResult(B::Hash, NumberFor, bool), + /// Set finality proof request builder. + SetFinalityProofRequestBuilder(SharedFinalityProofRequestBuilder), + /// Tell protocol to request finality proof for a block. + RequestFinalityProof(B::Hash, NumberFor), + /// Inform protocol whether a finality proof was successfully imported. + FinalityProofImportResult((B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>), + /// Propagate a block to peers. + AnnounceBlock(B::Hash), + /// A block has been imported (sent by the client). + BlockImported(B::Hash, B::Header), + /// A block has been finalized (sent by the client). + BlockFinalized(B::Hash, B::Header), + /// Execute a closure with the chain-specific network specialization. + ExecuteWithSpec(Box + Send + 'static>), + /// Execute a closure with the consensus gossip. + ExecuteWithGossip(Box + Send + 'static>), + /// Incoming gossip consensus message. + GossipConsensusMessage(B::Hash, ConsensusEngineId, Vec, GossipMessageRecipient), + /// Tell protocol to perform regular maintenance. + #[cfg(any(test, feature = "test-helpers"))] + Tick, + /// Synchronization request. + #[cfg(any(test, feature = "test-helpers"))] + Synchronize, } -impl NetworkChan { - /// Create a new network chan. - pub fn new(sender: Sender>, task_notify: Arc) -> Self { - NetworkChan { - sender, - task_notify, - } - } - - /// Send a messaging, to be handled on a stream. Notify the task handling the stream. - pub fn send(&self, msg: NetworkMsg) { - let _ = self.sender.send(msg); - self.task_notify.notify(); - } +/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. +pub trait SpecTask> { + fn call_box(self: Box, spec: &mut S, context: &mut Context); } -impl Drop for NetworkChan { - /// Notifying the task when a sender is dropped(when all are dropped, the stream is finished). - fn drop(&mut self) { - self.task_notify.notify(); +impl, F: FnOnce(&mut S, &mut Context)> SpecTask for F { + fn call_box(self: Box, spec: &mut S, context: &mut Context) { + (*self)(spec, context) } } - -/// A receiver of NetworkMsg that makes the protocol-id available with each message. -pub struct NetworkPort { - receiver: Receiver>, - task_notify: Arc, +/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. +pub trait GossipTask { + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context); } -impl NetworkPort { - /// Create a new network port for a given protocol-id. - pub fn new(receiver: Receiver>, task_notify: Arc) -> Self { - Self { - receiver, - task_notify, - } - } - - /// Receive a message, if any is currently-enqueued. - /// Register the current tokio task for notification when a new message is available. - pub fn take_one_message(&self) -> Result>, ()> { - self.task_notify.register(); - match self.receiver.try_recv() { - Ok(msg) => Ok(Some(msg)), - Err(TryRecvError::Empty) => Ok(None), - Err(TryRecvError::Disconnected) => Err(()), - } - } - - /// Get a reference to the underlying crossbeam receiver. - #[cfg(any(test, feature = "test-helpers"))] - pub fn receiver(&self) -> &Receiver> { - &self.receiver +impl, &mut Context)> GossipTask for F { + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context) { + (*self)(gossip, context) } } -/// Messages to be handled by NetworkService. -#[derive(Debug)] -pub enum NetworkMsg { - /// Send an outgoing custom message. - Outgoing(PeerId, Message), - /// Report a peer. - ReportPeer(PeerId, Severity), -} - /// Starts the background thread that handles the networking. -fn start_thread( - protocol_sender: Sender>, - network_port: NetworkPort, +fn start_thread, H: ExHashT>( + is_offline: Arc, + is_major_syncing: Arc, + protocol: Protocol, + peers: Arc>>>, + import_queue: Box>, + transaction_pool: Arc>, + finality_proof_provider: Option>>, + network_port: mpsc::UnboundedReceiver>, + protocol_rx: mpsc::UnboundedReceiver>, + status_sinks: Arc>>>>, config: NetworkConfiguration, registered: RegisteredProtocol>, + on_demand_in: Option>>, ) -> Result<((oneshot::Sender<()>, thread::JoinHandle<()>), Arc>>>, PeersetHandle), Error> { // Start the main service. let (service, peerset) = match start_service(config, registered) { @@ -489,7 +551,21 @@ fn start_thread( let mut runtime = RuntimeBuilder::new().name_prefix("libp2p-").build()?; let peerset_clone = peerset.clone(); let thread = thread::Builder::new().name("network".to_string()).spawn(move || { - let fut = run_thread(protocol_sender, service_clone, network_port, peerset_clone) + let fut = run_thread( + is_offline, + is_major_syncing, + protocol, + service_clone, + peers, + import_queue, + transaction_pool, + finality_proof_provider, + network_port, + protocol_rx, + status_sinks, + peerset_clone, + on_demand_in + ) .select(close_rx.then(|_| Ok(()))) .map(|(val, _)| val) .map_err(|(err,_ )| err); @@ -506,94 +582,193 @@ fn start_thread( } /// Runs the background thread that handles the networking. -fn run_thread( - protocol_sender: Sender>, +fn run_thread, H: ExHashT>( + is_offline: Arc, + is_major_syncing: Arc, + mut protocol: Protocol, network_service: Arc>>>, - network_port: NetworkPort, + peers: Arc>>>, + import_queue: Box>, + transaction_pool: Arc>, + finality_proof_provider: Option>>, + mut network_port: mpsc::UnboundedReceiver>, + mut protocol_rx: mpsc::UnboundedReceiver>, + status_sinks: Arc>>>>, peerset: PeersetHandle, + mut on_demand_in: Option>>, ) -> impl Future { + // Implementation of `protocol::NetworkOut` using the available local variables. + struct Ctxt<'a, B: BlockT>(&'a mut NetworkService>, &'a PeersetHandle); + impl<'a, B: BlockT> NetworkOut for Ctxt<'a, B> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.1.report_peer(who, reputation) + } + fn disconnect_peer(&mut self, who: PeerId) { + self.0.drop_node(&who) + } + fn send_message(&mut self, who: PeerId, message: Message) { + self.0.send_custom_message(&who, message) + } + } - let network_service_2 = network_service.clone(); + // Interval at which we send status updates on the `status_sinks`. + let mut status_interval = tokio::timer::Interval::new_interval(STATUS_INTERVAL); + // Interval at which we update the `connected_peers` Arc. + let mut connected_peers_interval = tokio::timer::Interval::new_interval(CONNECTED_PEERS_INTERVAL); - // Protocol produces a stream of messages about what happens in sync. - let protocol = stream::poll_fn(move || { - match network_port.take_one_message() { - Ok(Some(message)) => Ok(Async::Ready(Some(message))), - Ok(None) => Ok(Async::NotReady), - Err(_) => Err(()) + futures::future::poll_fn(move || { + while let Ok(Async::Ready(_)) = status_interval.poll() { + let status = protocol.status(); + status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); } - }).for_each(move |msg| { - // Handle message from Protocol. - match msg { - NetworkMsg::Outgoing(who, outgoing_message) => { - network_service_2 - .lock() - .send_custom_message(&who, outgoing_message); - }, - NetworkMsg::ReportPeer(who, severity) => { - match severity { - Severity::Bad(message) => { - info!(target: "sync", "Banning {:?} because {:?}", who, message); - network_service_2.lock().drop_node(&who); - // temporary: make sure the peer gets dropped from the peerset - peerset.report_peer(who, i32::min_value()); - }, - Severity::Useless(message) => { - debug!(target: "sync", "Dropping {:?} because {:?}", who, message); - network_service_2.lock().drop_node(&who) - }, - Severity::Timeout => { - debug!(target: "sync", "Dropping {:?} because it timed out", who); - network_service_2.lock().drop_node(&who) - }, - } - }, + + while let Ok(Async::Ready(_)) = connected_peers_interval.poll() { + let infos = protocol.peers_info().map(|(id, info)| { + (id.clone(), ConnectedPeer { peer_info: info.clone() }) + }).collect(); + *peers.write() = infos; } - Ok(()) - }) - .then(|res| { - match res { - Ok(()) => (), - Err(_) => error!("Protocol disconnected"), - }; - Ok(()) - }); - - // The network service produces events about what happens on the network. Let's process them. - let network = stream::poll_fn(move || network_service.lock().poll()).for_each(move |event| { - match event { - NetworkServiceEvent::OpenedCustomProtocol { peer_id, version, debug_info, .. } => { - debug_assert_eq!(version, protocol::CURRENT_VERSION as u8); - let _ = protocol_sender.send(FromNetworkMsg::PeerConnected(peer_id, debug_info)); + + match protocol.poll(&mut Ctxt(&mut network_service.lock(), &peerset), &*transaction_pool) { + Ok(Async::Ready(v)) => void::unreachable(v), + Ok(Async::NotReady) => {} + Err(err) => void::unreachable(err), + } + + // Check for new incoming on-demand requests. + if let Some(on_demand_in) = on_demand_in.as_mut() { + while let Ok(Async::Ready(Some(rq))) = on_demand_in.poll() { + protocol.add_on_demand_request(&mut Ctxt(&mut network_service.lock(), &peerset), rq); } - NetworkServiceEvent::ClosedCustomProtocol { peer_id, debug_info, .. } => { - let _ = protocol_sender.send(FromNetworkMsg::PeerDisconnected(peer_id, debug_info)); + } + + loop { + match network_port.poll() { + Ok(Async::NotReady) => break, + Ok(Async::Ready(Some(NetworkMsg::Outgoing(who, outgoing_message)))) => + network_service.lock().send_custom_message(&who, outgoing_message), + Ok(Async::Ready(Some(NetworkMsg::ReportPeer(who, reputation)))) => + peerset.report_peer(who, reputation), + Ok(Async::Ready(Some(NetworkMsg::DisconnectPeer(who)))) => + network_service.lock().drop_node(&who), + + #[cfg(any(test, feature = "test-helpers"))] + Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => {} + + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), } - NetworkServiceEvent::CustomMessage { peer_id, message, .. } => { - let _ = protocol_sender.send(FromNetworkMsg::CustomMessage(peer_id, message)); - return Ok(()) + } + + loop { + let msg = match protocol_rx.poll() { + Ok(Async::Ready(Some(msg))) => msg, + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), + Ok(Async::NotReady) => break, + }; + + let mut network_service = network_service.lock(); + let mut network_out = Ctxt(&mut network_service, &peerset); + + match msg { + ProtocolMsg::BlockImported(hash, header) => + protocol.on_block_imported(&mut network_out, hash, &header), + ProtocolMsg::BlockFinalized(hash, header) => + protocol.on_block_finalized(&mut network_out, hash, &header), + ProtocolMsg::ExecuteWithSpec(task) => { + let (mut context, spec) = protocol.specialization_lock(&mut network_out); + task.call_box(spec, &mut context); + }, + ProtocolMsg::ExecuteWithGossip(task) => { + let (mut context, gossip) = protocol.consensus_gossip_lock(&mut network_out); + task.call_box(gossip, &mut context); + } + ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => + protocol.gossip_consensus_message(&mut network_out, topic, engine_id, message, recipient), + ProtocolMsg::BlocksProcessed(hashes, has_error) => + protocol.blocks_processed(&mut network_out, hashes, has_error), + ProtocolMsg::RestartSync => + protocol.restart(&mut network_out), + ProtocolMsg::AnnounceBlock(hash) => + protocol.announce_block(&mut network_out, hash), + ProtocolMsg::BlockImportedSync(hash, number) => + protocol.block_imported(&hash, number), + ProtocolMsg::ClearJustificationRequests => + protocol.clear_justification_requests(), + ProtocolMsg::RequestJustification(hash, number) => + protocol.request_justification(&mut network_out, &hash, number), + ProtocolMsg::JustificationImportResult(hash, number, success) => + protocol.justification_import_result(hash, number, success), + ProtocolMsg::SetFinalityProofRequestBuilder(builder) => + protocol.set_finality_proof_request_builder(builder), + ProtocolMsg::RequestFinalityProof(hash, number) => + protocol.request_finality_proof(&mut network_out, &hash, number), + ProtocolMsg::FinalityProofImportResult(requested_block, finalziation_result) => + protocol.finality_proof_import_result(requested_block, finalziation_result), + ProtocolMsg::PropagateExtrinsics => + protocol.propagate_extrinsics(&mut network_out, &*transaction_pool), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Tick => protocol.tick(&mut network_out), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Synchronize => {}, } - NetworkServiceEvent::Clogged { peer_id, messages, .. } => { - debug!(target: "sync", "{} clogging messages:", messages.len()); - for msg in messages.into_iter().take(5) { - debug!(target: "sync", "{:?}", msg); - let _ = protocol_sender.send(FromNetworkMsg::PeerClogged(peer_id.clone(), Some(msg))); + } + + loop { + let mut network_service = network_service.lock(); + let poll_value = network_service.poll(); + let mut network_out = Ctxt(&mut network_service, &peerset); + + let outcome = match poll_value { + Ok(Async::NotReady) => break, + Ok(Async::Ready(Some(NetworkServiceEvent::OpenedCustomProtocol { peer_id, version, debug_info, .. }))) => { + debug_assert!( + version <= protocol::CURRENT_VERSION as u8 + && version >= protocol::MIN_VERSION as u8 + ); + protocol.on_peer_connected(&mut network_out, peer_id, debug_info); + CustomMessageOutcome::None + } + Ok(Async::Ready(Some(NetworkServiceEvent::ClosedCustomProtocol { peer_id, debug_info, .. }))) => { + protocol.on_peer_disconnected(&mut network_out, peer_id, debug_info); + CustomMessageOutcome::None + }, + Ok(Async::Ready(Some(NetworkServiceEvent::CustomMessage { peer_id, message, .. }))) => + protocol.on_custom_message( + &mut network_out, + &*transaction_pool, + peer_id, + message, + finality_proof_provider.as_ref().map(|p| &**p) + ), + Ok(Async::Ready(Some(NetworkServiceEvent::Clogged { peer_id, messages, .. }))) => { + debug!(target: "sync", "{} clogging messages:", messages.len()); + for msg in messages.into_iter().take(5) { + debug!(target: "sync", "{:?}", msg); + protocol.on_clogged_peer(&mut network_out, peer_id.clone(), Some(msg)); + } + CustomMessageOutcome::None } + Ok(Async::Ready(None)) => return Ok(Async::Ready(())), + Err(err) => { + error!(target: "sync", "Error in the network: {:?}", err); + return Err(err) + } + }; + + match outcome { + CustomMessageOutcome::BlockImport(origin, blocks) => + import_queue.import_blocks(origin, blocks), + CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) => + import_queue.import_justification(origin, hash, nb, justification), + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) => + import_queue.import_finality_proof(origin, hash, nb, proof), + CustomMessageOutcome::None => {} } - }; - Ok(()) - }); - - // Merge all futures into one. - let futures: Vec + Send>> = vec![ - Box::new(protocol) as Box<_>, - Box::new(network) as Box<_> - ]; - - futures::select_all(futures) - .and_then(move |_| { - debug!("Networking ended"); - Ok(()) - }) - .map_err(|(r, _, _)| r) + } + + is_offline.store(protocol.is_offline(), Ordering::Relaxed); + is_major_syncing.store(protocol.is_major_syncing(), Ordering::Relaxed); + + Ok(Async::NotReady) + }) } diff --git a/core/network/src/specialization.rs b/core/network/src/specialization.rs index e440097dd1f674cc5e0afc41751e9b12dd1dcce9..58a63bb7a3b53b7357399bab99880769ca28bdd9 100644 --- a/core/network/src/specialization.rs +++ b/core/network/src/specialization.rs @@ -44,3 +44,102 @@ pub trait NetworkSpecialization: Send + Sync + 'static { /// Not guaranteed to be called for every block, but will be most of the after major sync. fn on_block_imported(&mut self, _ctx: &mut Context, _hash: B::Hash, _header: &B::Header) { } } + +/// Construct a simple protocol that is composed of several sub protocols. +/// Each "sub protocol" needs to implement `Specialization` and needs to provide a `new()` function. +/// For more fine grained implementations, this macro is not usable. +/// +/// # Example +/// +/// ```nocompile +/// construct_simple_protocol! { +/// pub struct MyProtocol where Block = MyBlock { +/// consensus_gossip: ConsensusGossip, +/// other_protocol: MyCoolStuff, +/// } +/// } +/// ``` +/// +/// You can also provide an optional parameter after `where Block = MyBlock`, so it looks like +/// `where Block = MyBlock, Status = consensus_gossip`. This will instruct the implementation to +/// use the `status()` function from the `ConsensusGossip` protocol. By default, `status()` returns +/// an empty vector. +#[macro_export] +macro_rules! construct_simple_protocol { + ( + $( #[ $attr:meta ] )* + pub struct $protocol:ident where + Block = $block:ident + $( , Status = $status_protocol_name:ident )* + { + $( $sub_protocol_name:ident : $sub_protocol:ident $( <$protocol_block:ty> )*, )* + } + ) => { + $( #[$attr] )* + pub struct $protocol { + $( $sub_protocol_name: $sub_protocol $( <$protocol_block> )*, )* + } + + impl $protocol { + /// Instantiate a node protocol handler. + pub fn new() -> Self { + Self { + $( $sub_protocol_name: $sub_protocol::new(), )* + } + } + } + + impl $crate::specialization::NetworkSpecialization<$block> for $protocol { + fn status(&self) -> Vec { + $( + let status = self.$status_protocol_name.status(); + + if !status.is_empty() { + return status; + } + )* + + Vec::new() + } + + fn on_connect( + &mut self, + _ctx: &mut $crate::Context<$block>, + _who: $crate::PeerId, + _status: $crate::StatusMessage<$block> + ) { + $( self.$sub_protocol_name.on_connect(_ctx, _who, _status); )* + } + + fn on_disconnect(&mut self, _ctx: &mut $crate::Context<$block>, _who: $crate::PeerId) { + $( self.$sub_protocol_name.on_disconnect(_ctx, _who); )* + } + + fn on_message( + &mut self, + _ctx: &mut $crate::Context<$block>, + _who: $crate::PeerId, + _message: &mut Option<$crate::message::Message<$block>> + ) { + $( self.$sub_protocol_name.on_message(_ctx, _who, _message); )* + } + + fn on_abort(&mut self) { + $( self.$sub_protocol_name.on_abort(); )* + } + + fn maintain_peers(&mut self, _ctx: &mut $crate::Context<$block>) { + $( self.$sub_protocol_name.maintain_peers(_ctx); )* + } + + fn on_block_imported( + &mut self, + _ctx: &mut $crate::Context<$block>, + _hash: <$block as $crate::BlockT>::Hash, + _header: &<$block as $crate::BlockT>::Header + ) { + $( self.$sub_protocol_name.on_block_imported(_ctx, _hash, _header); )* + } + } + } +} diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs index 80ff8221a1a02fb844c1fcc8874c0fe27223f68a..fdd36a024d83c629fa21cda8fdbdb180f9c3e9c2 100644 --- a/core/network/src/sync.rs +++ b/core/network/src/sync.rs @@ -14,26 +14,42 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +//! Contains the state of the chain synchronization process +//! +//! At any given point in time, a running node tries as much as possible to be at the head of the +//! chain. This module handles the logic of which blocks to request from remotes, and processing +//! responses. It yields blocks to check and potentially move to the database. +//! +//! # Usage +//! +//! The `ChainSync` struct maintains the state of the block requests. Whenever something happens on +//! the network, or whenever a block has been successfully verified, call the appropriate method in +//! order to update it. You must also regularly call `tick()`. +//! +//! To each of these methods, you must pass a `Context` object that the `ChainSync` will use to +//! send its new outgoing requests. +//! + use std::cmp::max; use std::collections::{HashMap, VecDeque}; -use std::time::{Duration, Instant}; -use log::{debug, trace, warn}; -use crate::protocol::Context; -use fork_tree::ForkTree; -use network_libp2p::{Severity, PeerId}; +use log::{debug, trace, warn, info}; +use crate::protocol::PeerInfo as ProtocolPeerInfo; +use network_libp2p::PeerId; use client::{BlockStatus, ClientInfo}; -use consensus::BlockOrigin; -use consensus::import_queue::{ImportQueue, IncomingBlock}; +use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRequestBuilder}}; use client::error::Error as ClientError; use crate::blocks::BlockCollection; -use runtime_primitives::Justification; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, CheckedSub}; -use runtime_primitives::generic::BlockId; -use crate::message::{self, generic::Message as GenericMessage}; +use crate::sync::extra_requests::ExtraRequestsAggregator; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, + CheckedSub, SaturatedConversion +}; +use runtime_primitives::{Justification, generic::BlockId}; +use crate::message; use crate::config::Roles; use std::collections::HashSet; -use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; + +mod extra_requests; // Maximum blocks to request in a single packet. const MAX_BLOCKS_TO_REQUEST: usize = 128; @@ -41,15 +57,41 @@ const MAX_BLOCKS_TO_REQUEST: usize = 128; const MAX_IMPORTING_BLOCKS: usize = 2048; // Number of blocks in the queue that prevents ancestry search. const MAJOR_SYNC_BLOCKS: usize = 5; -// Time to wait before trying to get a justification from the same peer. -const JUSTIFICATION_RETRY_WAIT: Duration = Duration::from_secs(10); // Number of recently announced blocks to track for each peer. const ANNOUNCE_HISTORY_SIZE: usize = 64; // Max number of blocks to download for unknown forks. const MAX_UNKNOWN_FORK_DOWNLOAD_LEN: u32 = 32; +/// Reputation change when a peer sent us a status message that led to a database read error. +const BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE: i32 = -(1 << 16); +/// Reputation change when a peer failed to answer our legitimate ancestry block search. +const ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE: i32 = -(1 << 9); +/// Reputation change when a peer sent us a status message with a different genesis than us. +const GENESIS_MISMATCH_REPUTATION_CHANGE: i32 = i32::min_value() + 1; + +/// Context for a network-specific handler. +pub trait Context { + /// Get a reference to the client. + fn client(&self) -> &crate::chain::Client; + + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); + + /// Force disconnecting from a peer. Use this when a peer misbehaved. + fn disconnect_peer(&mut self, who: PeerId); + + /// Get peer info. + fn peer_info(&self, peer: &PeerId) -> Option>; + + /// Request a finality proof from a peer. + fn send_finality_proof_request(&mut self, who: PeerId, request: message::FinalityProofRequest); + + /// Request a block from a peer. + fn send_block_request(&mut self, who: PeerId, request: message::BlockRequest); +} #[derive(Debug)] -struct PeerSync { +pub(crate) struct PeerSync { pub common_number: NumberFor, pub best_hash: B::Hash, pub best_number: NumberFor, @@ -67,7 +109,7 @@ pub(crate) struct PeerInfo { } #[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum AncestorSearchState { +pub(crate) enum AncestorSearchState { /// Use exponential backoff to find an ancestor, then switch to binary search. /// We keep track of the exponent. ExponentialBackoff(NumberFor), @@ -77,267 +119,13 @@ enum AncestorSearchState { } #[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum PeerSyncState { +pub(crate) enum PeerSyncState { AncestorSearch(NumberFor, AncestorSearchState), Available, DownloadingNew(NumberFor), DownloadingStale(B::Hash), DownloadingJustification(B::Hash), -} - -/// Pending justification request for the given block (hash and number). -type PendingJustification = (::Hash, NumberFor); - -/// Manages pending block justification requests. Multiple justifications may be -/// requested for competing forks, or for the same branch at different -/// (increasing) heights. This structure will guarantee that justifications are -/// fetched in-order, and that obsolete changes are pruned (when finalizing a -/// competing fork). -struct PendingJustifications { - justifications: ForkTree, ()>, - pending_requests: VecDeque>, - peer_requests: HashMap>, - previous_requests: HashMap, Vec<(PeerId, Instant)>>, - importing_requests: HashSet>, -} - -impl PendingJustifications { - fn new() -> PendingJustifications { - PendingJustifications { - justifications: ForkTree::new(), - pending_requests: VecDeque::new(), - peer_requests: HashMap::new(), - previous_requests: HashMap::new(), - importing_requests: HashSet::new(), - } - } - - /// Dispatches all possible pending requests to the given peers. Peers are - /// filtered according to the current known best block (i.e. we won't send a - /// justification request for block #10 to a peer at block #2), and we also - /// throttle requests to the same peer if a previous justification request - /// yielded no results. - fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut Context) { - if self.pending_requests.is_empty() { - return; - } - - let initial_pending_requests = self.pending_requests.len(); - - // clean up previous failed requests so we can retry again - for (_, requests) in self.previous_requests.iter_mut() { - requests.retain(|(_, instant)| instant.elapsed() < JUSTIFICATION_RETRY_WAIT); - } - - let mut available_peers = peers.iter().filter_map(|(peer, sync)| { - // don't request to any peers that already have pending requests or are unavailable - if sync.state != PeerSyncState::Available || self.peer_requests.contains_key(&peer) { - None - } else { - Some((peer.clone(), sync.best_number)) - } - }).collect::>(); - - let mut last_peer = available_peers.back().map(|p| p.0.clone()); - let mut unhandled_requests = VecDeque::new(); - - loop { - let (peer, peer_best_number) = match available_peers.pop_front() { - Some(p) => p, - _ => break, - }; - - // only ask peers that have synced past the block number that we're - // asking the justification for and to whom we haven't already made - // the same request recently - let peer_eligible = { - let request = match self.pending_requests.front() { - Some(r) => r.clone(), - _ => break, - }; - - peer_best_number >= request.1 && - !self.previous_requests - .get(&request) - .map(|requests| requests.iter().any(|i| i.0 == peer)) - .unwrap_or(false) - }; - - if !peer_eligible { - available_peers.push_back((peer.clone(), peer_best_number)); - - // we tried all peers and none can answer this request - if Some(peer) == last_peer { - last_peer = available_peers.back().map(|p| p.0.clone()); - - let request = self.pending_requests.pop_front() - .expect("verified to be Some in the beginning of the loop; qed"); - - unhandled_requests.push_back(request); - } - - continue; - } - - last_peer = available_peers.back().map(|p| p.0.clone()); - - let request = self.pending_requests.pop_front() - .expect("verified to be Some in the beginning of the loop; qed"); - - self.peer_requests.insert(peer.clone(), request); - - peers.get_mut(&peer) - .expect("peer was is taken from available_peers; available_peers is a subset of peers; qed") - .state = PeerSyncState::DownloadingJustification(request.0); - - trace!(target: "sync", "Requesting justification for block #{} from {}", request.0, peer); - let request = message::generic::BlockRequest { - id: 0, - fields: message::BlockAttributes::JUSTIFICATION, - from: message::FromBlock::Hash(request.0), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - - protocol.send_message(peer, GenericMessage::BlockRequest(request)); - } - - self.pending_requests.append(&mut unhandled_requests); - - trace!(target: "sync", "Dispatched {} justification requests ({} pending)", - initial_pending_requests - self.pending_requests.len(), - self.pending_requests.len(), - ); - } - - /// Queue a justification request (without dispatching it). - fn queue_request( - &mut self, - justification: &PendingJustification, - is_descendent_of: F, - ) where F: Fn(&B::Hash, &B::Hash) -> Result { - match self.justifications.import(justification.0.clone(), justification.1.clone(), (), &is_descendent_of) { - Ok(true) => { - // this is a new root so we add it to the current `pending_requests` - self.pending_requests.push_back((justification.0, justification.1)); - }, - Err(err) => { - warn!(target: "sync", "Failed to insert requested justification {:?} {:?} into tree: {:?}", - justification.0, - justification.1, - err, - ); - return; - }, - _ => {}, - }; - } - - /// Retry any pending request if a peer disconnected. - fn peer_disconnected(&mut self, who: PeerId) { - if let Some(request) = self.peer_requests.remove(&who) { - self.pending_requests.push_front(request); - } - } - - /// Process the import of a justification. - /// Queues a retry in case the import failed. - fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { - let request = (hash, number); - - if !self.importing_requests.remove(&request) { - debug!(target: "sync", "Got justification import result for unknown justification {:?} {:?} request.", - request.0, - request.1, - ); - - return; - }; - - if success { - if self.justifications.finalize_root(&request.0).is_none() { - warn!(target: "sync", "Imported justification for {:?} {:?} which isn't a root in the tree: {:?}", - request.0, - request.1, - self.justifications.roots().collect::>(), - ); - - return; - }; - - self.previous_requests.clear(); - self.peer_requests.clear(); - self.pending_requests = - self.justifications.roots().map(|(h, n, _)| (h.clone(), n.clone())).collect(); - - return; - } - self.pending_requests.push_front(request); - } - - /// Processes the response for the request previously sent to the given - /// peer. Queues a retry in case the given justification - /// was `None`. - fn on_response( - &mut self, - who: PeerId, - justification: Option, - import_queue: &ImportQueue, - ) { - // we assume that the request maps to the given response, this is - // currently enforced by the outer network protocol before passing on - // messages to chain sync. - if let Some(request) = self.peer_requests.remove(&who) { - if let Some(justification) = justification { - import_queue.import_justification(who.clone(), request.0, request.1, justification); - self.importing_requests.insert(request); - return - } - - self.previous_requests - .entry(request) - .or_insert(Vec::new()) - .push((who, Instant::now())); - - self.pending_requests.push_front(request); - } - } - - /// Removes any pending justification requests for blocks lower than the - /// given best finalized. - fn on_block_finalized( - &mut self, - best_finalized_hash: &B::Hash, - best_finalized_number: NumberFor, - is_descendent_of: F, - ) -> Result<(), fork_tree::Error> - where F: Fn(&B::Hash, &B::Hash) -> Result - { - if self.importing_requests.contains(&(*best_finalized_hash, best_finalized_number)) { - // we imported this justification ourselves, so we should get back a response - // from the import queue through `justification_import_result` - return Ok(()); - } - - self.justifications.finalize(best_finalized_hash, best_finalized_number, &is_descendent_of)?; - - let roots = self.justifications.roots().collect::>(); - - self.pending_requests.retain(|(h, n)| roots.contains(&(h, n, &()))); - self.peer_requests.retain(|_, (h, n)| roots.contains(&(h, n, &()))); - self.previous_requests.retain(|(h, n), _| roots.contains(&(h, n, &()))); - - Ok(()) - } - - /// Clear all data. - fn clear(&mut self) { - self.justifications = ForkTree::new(); - self.pending_requests.clear(); - self.peer_requests.clear(); - self.previous_requests.clear(); - } + DownloadingFinalityProof(B::Hash), } /// Relay chain sync strategy. @@ -348,13 +136,9 @@ pub struct ChainSync { best_queued_number: NumberFor, best_queued_hash: B::Hash, required_block_attributes: message::BlockAttributes, - justifications: PendingJustifications, - import_queue: Box>, + extra_requests: ExtraRequestsAggregator, queue_blocks: HashSet, best_importing_number: NumberFor, - is_stopping: AtomicBool, - is_offline: Arc, - is_major_syncing: Arc, } /// Reported sync state. @@ -394,16 +178,13 @@ impl Status { } impl ChainSync { - /// Create a new instance. + /// Create a new instance. Pass the initial known state of the chain. pub(crate) fn new( - is_offline: Arc, - is_major_syncing: Arc, role: Roles, info: &ClientInfo, - import_queue: Box> ) -> Self { let mut required_block_attributes = message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION; - if role.intersects(Roles::FULL | Roles::AUTHORITY) { + if role.is_full() { required_block_attributes |= message::BlockAttributes::BODY; } @@ -413,14 +194,10 @@ impl ChainSync { blocks: BlockCollection::new(), best_queued_hash: info.best_queued_hash.unwrap_or(info.chain.best_hash), best_queued_number: info.best_queued_number.unwrap_or(info.chain.best_number), - justifications: PendingJustifications::new(), + extra_requests: ExtraRequestsAggregator::new(), required_block_attributes, - import_queue, queue_blocks: Default::default(), best_importing_number: Zero::zero(), - is_stopping: Default::default(), - is_offline, - is_major_syncing, } } @@ -430,12 +207,12 @@ impl ChainSync { fn state(&self, best_seen: &Option>) -> SyncState { match best_seen { - &Some(n) if n > self.best_queued_number && n - self.best_queued_number > As::sa(5) => SyncState::Downloading, + &Some(n) if n > self.best_queued_number && n - self.best_queued_number > 5.into() => SyncState::Downloading, _ => SyncState::Idle, } } - /// Returns peer sync status (if any). + /// Returns the state of the sync of the given peer. Returns `None` if the peer is unknown. pub(crate) fn peer_info(&self, who: &PeerId) -> Option> { self.peers.get(who).map(|peer| { PeerInfo { @@ -456,30 +233,31 @@ impl ChainSync { } } - /// Handle new connected peer. + /// Handle new connected peer. Call this method whenever we connect to a new peer. pub(crate) fn new_peer(&mut self, protocol: &mut Context, who: PeerId) { - // Initialize some variables to determine if - // is_offline or is_major_syncing should be updated - // after processing this new peer. - let previous_len = self.peers.len(); - let previous_best_seen = self.best_seen_block(); - let previous_state = self.state(&previous_best_seen); - if let Some(info) = protocol.peer_info(&who) { + // there's nothing sync can get from the node that has no blockchain data + // (the opposite is not true, but all requests are served at protocol level) + if !info.roles.is_full() { + return; + } + let status = block_status(&*protocol.client(), &self.queue_blocks, info.best_hash); match (status, info.best_number) { (Err(e), _) => { debug!(target:"sync", "Error reading blockchain: {:?}", e); - let reason = format!("Error legimimately reading blockchain status: {:?}", e); - protocol.report_peer(who, Severity::Useless(reason)); + protocol.report_peer(who.clone(), BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE); + protocol.disconnect_peer(who); }, (Ok(BlockStatus::KnownBad), _) => { - let reason = format!("New peer with known bad best block {} ({}).", info.best_hash, info.best_number); - protocol.report_peer(who, Severity::Bad(reason)); + info!("New peer with known bad best block {} ({}).", info.best_hash, info.best_number); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); }, - (Ok(BlockStatus::Unknown), b) if b == As::sa(0) => { - let reason = format!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); - protocol.report_peer(who, Severity::Bad(reason)); + (Ok(BlockStatus::Unknown), b) if b.is_zero() => { + info!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); }, (Ok(BlockStatus::Unknown), _) if self.queue_blocks.len() > MAJOR_SYNC_BLOCKS => { // when actively syncing the common point moves too fast. @@ -494,28 +272,32 @@ impl ChainSync { } (Ok(BlockStatus::Unknown), _) => { let our_best = self.best_queued_number; - if our_best > As::sa(0) { - let common_best = ::std::cmp::min(our_best, info.best_number); - debug!(target:"sync", "New peer with unknown best hash {} ({}), searching for common ancestor.", info.best_hash, info.best_number); + if our_best.is_zero() { + // We are at genesis, just start downloading + debug!(target:"sync", "New peer with best hash {} ({}).", info.best_hash, info.best_number); self.peers.insert(who.clone(), PeerSync { - common_number: As::sa(0), + common_number: Zero::zero(), best_hash: info.best_hash, best_number: info.best_number, - state: PeerSyncState::AncestorSearch(common_best, AncestorSearchState::ExponentialBackoff(As::sa(1))), + state: PeerSyncState::Available, recently_announced: Default::default(), }); - Self::request_ancestry(protocol, who, common_best) + self.download_new(protocol, who) } else { - // We are at genesis, just start downloading - debug!(target:"sync", "New peer with best hash {} ({}).", info.best_hash, info.best_number); + let common_best = ::std::cmp::min(our_best, info.best_number); + debug!(target:"sync", + "New peer with unknown best hash {} ({}), searching for common ancestor.", + info.best_hash, + info.best_number + ); self.peers.insert(who.clone(), PeerSync { - common_number: As::sa(0), + common_number: Zero::zero(), best_hash: info.best_hash, best_number: info.best_number, - state: PeerSyncState::Available, + state: PeerSyncState::AncestorSearch(common_best, AncestorSearchState::ExponentialBackoff(One::one())), recently_announced: Default::default(), }); - self.download_new(protocol, who) + Self::request_ancestry(protocol, who, common_best) } }, (Ok(BlockStatus::Queued), _) | (Ok(BlockStatus::InChainWithState), _) | (Ok(BlockStatus::InChainPruned), _) => { @@ -530,22 +312,6 @@ impl ChainSync { } } } - - let current_best_seen = self.best_seen_block(); - let current_state = self.state(¤t_best_seen); - let current_len = self.peers.len(); - if previous_len == 0 && current_len > 0 { - // We were offline, and now we're connected to at least one peer. - self.is_offline.store(false, Ordering::Relaxed); - } - if previous_len < current_len { - // We added a peer, let's see if major_syncing should be updated. - match (previous_state, current_state) { - (SyncState::Idle, SyncState::Downloading) => self.is_major_syncing.store(true, Ordering::Relaxed), - (SyncState::Downloading, SyncState::Idle) => self.is_major_syncing.store(false, Ordering::Relaxed), - _ => {}, - } - } } fn handle_ancestor_search_state( @@ -553,20 +319,22 @@ impl ChainSync { curr_block_num: NumberFor, block_hash_match: bool, ) -> Option<(AncestorSearchState, NumberFor)> { + let two = >::one() + >::one(); match state { AncestorSearchState::ExponentialBackoff(next_distance_to_tip) => { - if block_hash_match && next_distance_to_tip == As::sa(1) { + if block_hash_match && next_distance_to_tip == One::one() { // We found the ancestor in the first step so there is no need to execute binary search. return None; } if block_hash_match { let left = curr_block_num; - let right = left + next_distance_to_tip / As::sa(2); - let middle = left + (right - left) / As::sa(2); + let right = left + next_distance_to_tip / two; + let middle = left + (right - left) / two; Some((AncestorSearchState::BinarySearch(left, right), middle)) } else { - let next_block_num = curr_block_num.checked_sub(&next_distance_to_tip).unwrap_or(As::sa(0)); - let next_distance_to_tip = next_distance_to_tip * As::sa(2); + let next_block_num = curr_block_num.checked_sub(&next_distance_to_tip) + .unwrap_or_else(Zero::zero); + let next_distance_to_tip = next_distance_to_tip * two; Some((AncestorSearchState::ExponentialBackoff(next_distance_to_tip), next_block_num)) } }, @@ -580,20 +348,26 @@ impl ChainSync { right = curr_block_num; } assert!(right >= left); - let middle = left + (right - left) / As::sa(2); + let middle = left + (right - left) / two; Some((AncestorSearchState::BinarySearch(left, right), middle)) }, } } - /// Handle new block data. + /// Handle a response from the remote to a block request that we made. + /// + /// `request` must be the original request that triggered `response`. + /// + /// If this corresponds to a valid block, this outputs the block that must be imported in the + /// import queue. + #[must_use] pub(crate) fn on_block_data( &mut self, protocol: &mut Context, who: PeerId, request: message::BlockRequest, response: message::BlockResponse - ) { + ) -> Option<(BlockOrigin, Vec>)> { let new_blocks: Vec> = if let Some(ref mut peer) = self.peers.get_mut(&who) { let mut blocks = response.blocks; if request.direction == message::Direction::Descending { @@ -607,7 +381,7 @@ impl ChainSync { peer.state = PeerSyncState::Available; self.blocks.insert(start_block, blocks, who); self.blocks - .drain(self.best_queued_number + As::sa(1)) + .drain(self.best_queued_number + One::one()) .into_iter() .map(|block_data| { IncomingBlock { @@ -638,34 +412,37 @@ impl ChainSync { maybe_our_block_hash.map_or(false, |x| x == block.hash) }, (None, _) => { - trace!(target:"sync", "Invalid response when searching for ancestor from {}", who); - protocol.report_peer(who, Severity::Bad("Invalid response when searching for ancestor".to_string())); - return; + debug!(target: "sync", "Invalid response when searching for ancestor from {}", who); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None }, (_, Err(e)) => { - let reason = format!("Error answering legitimate blockchain query: {:?}", e); - protocol.report_peer(who, Severity::Useless(reason)); - return; + info!("Error answering legitimate blockchain query: {:?}", e); + protocol.report_peer(who.clone(), ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + return None }, }; if block_hash_match && peer.common_number < num { peer.common_number = num; } - if !block_hash_match && num == As::sa(0) { + if !block_hash_match && num.is_zero() { trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); - protocol.report_peer(who, Severity::Bad("Ancestry search: genesis mismatch for peer".to_string())); - return; + protocol.report_peer(who.clone(), GENESIS_MISMATCH_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + return None } if let Some((next_state, next_block_num)) = Self::handle_ancestor_search_state(state, num, block_hash_match) { peer.state = PeerSyncState::AncestorSearch(next_block_num, next_state); Self::request_ancestry(protocol, who, next_block_num); - return; + return None } else { peer.state = PeerSyncState::Available; vec![] } }, - PeerSyncState::Available | PeerSyncState::DownloadingJustification(..) => Vec::new(), + PeerSyncState::Available | PeerSyncState::DownloadingJustification(..) | PeerSyncState::DownloadingFinalityProof(..) => Vec::new(), } } else { Vec::new() @@ -691,17 +468,23 @@ impl ChainSync { self.queue_blocks .extend(new_blocks.iter().map(|b| b.hash.clone())); self.best_importing_number = max(new_best_importing_number, self.best_importing_number); - self.import_queue.import_blocks(origin, new_blocks); + Some((origin, new_blocks)) } - /// Handle new justification data. + /// Handle a response from the remote to a justification request that we made. + /// + /// `request` must be the original request that triggered `response`. + /// + /// Returns `Some` if this produces a justification that must be imported into the import + /// queue. + #[must_use] pub(crate) fn on_block_justification_data( &mut self, protocol: &mut Context, who: PeerId, _request: message::BlockRequest, response: message::BlockResponse, - ) { + ) -> Option<(PeerId, B::Hash, NumberFor, Justification)> { if let Some(ref mut peer) = self.peers.get_mut(&who) { if let PeerSyncState::DownloadingJustification(hash) = peer.state { peer.state = PeerSyncState::Available; @@ -710,20 +493,16 @@ impl ChainSync { match response.blocks.into_iter().next() { Some(response) => { if hash != response.hash { - let msg = format!( - "Invalid block justification provided: requested: {:?} got: {:?}", - hash, - response.hash, - ); - - protocol.report_peer(who, Severity::Bad(msg)); - return; + info!("Invalid block justification provided by {}: requested: {:?} got: {:?}", + who, hash, response.hash); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None; } - self.justifications.on_response( + return self.extra_requests.justifications().on_response( who, response.justification, - &*self.import_queue, ); }, None => { @@ -733,16 +512,54 @@ impl ChainSync { who, hash, ); - return; + return None; }, } } } self.maintain_sync(protocol); + None + } + + /// Handle new finality proof data. + pub(crate) fn on_block_finality_proof_data( + &mut self, + protocol: &mut Context, + who: PeerId, + response: message::FinalityProofResponse, + ) -> Option<(PeerId, B::Hash, NumberFor, Vec)> { + if let Some(ref mut peer) = self.peers.get_mut(&who) { + if let PeerSyncState::DownloadingFinalityProof(hash) = peer.state { + peer.state = PeerSyncState::Available; + + // we only request one finality proof at a time + if hash != response.block { + info!( + "Invalid block finality proof provided: requested: {:?} got: {:?}", + hash, + response.block, + ); + + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None; + } + + return self.extra_requests.finality_proofs().on_response( + who, + response.proof, + ); + } + } + + self.maintain_sync(protocol); + None } /// A batch of blocks have been processed, with or without errors. + /// Call this when a batch of blocks have been processed by the import queue, with or without + /// errors. pub fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) { for hash in processed_blocks { self.queue_blocks.remove(&hash); @@ -754,45 +571,71 @@ impl ChainSync { /// Maintain the sync process (download new blocks, fetch justifications). pub fn maintain_sync(&mut self, protocol: &mut Context) { - if self.is_stopping.load(Ordering::SeqCst) { - return - } let peers: Vec = self.peers.keys().map(|p| p.clone()).collect(); for peer in peers { self.download_new(protocol, peer); } - self.justifications.dispatch(&mut self.peers, protocol); + self.extra_requests.dispatch(&mut self.peers, protocol); } - /// Called periodically to perform any time-based actions. + /// Called periodically to perform any time-based actions. Must be called at a regular + /// interval. pub fn tick(&mut self, protocol: &mut Context) { - self.justifications.dispatch(&mut self.peers, protocol); + self.extra_requests.dispatch(&mut self.peers, protocol); } /// Request a justification for the given block. /// - /// Queues a new justification request and tries to dispatch all pending requests. + /// Uses `protocol` to queue a new justification request and tries to dispatch all pending + /// requests. pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { - self.justifications.queue_request( - &(*hash, number), + self.extra_requests.justifications().queue_request( + (*hash, number), |base, block| protocol.client().is_descendent_of(base, block), ); - self.justifications.dispatch(&mut self.peers, protocol); + self.extra_requests.justifications().dispatch(&mut self.peers, protocol); } /// Clears all pending justification requests. pub fn clear_justification_requests(&mut self) { - self.justifications.clear(); + self.extra_requests.justifications().clear(); } + /// Call this when a justification has been processed by the import queue, with or without + /// errors. pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { - self.justifications.justification_import_result(hash, number, success); + let finalization_result = if success { Ok((hash, number)) } else { Err(()) }; + if !self.extra_requests.justifications().on_import_result((hash, number), finalization_result) { + debug!(target: "sync", "Got justification import result for unknown justification {:?} {:?} request.", + hash, + number, + ); + } } - pub fn stop(&self) { - self.is_stopping.store(true, Ordering::SeqCst); - self.import_queue.stop(); + /// Request a finality proof for the given block. + /// + /// Queues a new finality proof request and tries to dispatch all pending requests. + pub fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { + self.extra_requests.finality_proofs().queue_request( + (*hash, number), + |base, block| protocol.client().is_descendent_of(base, block), + ); + + self.extra_requests.finality_proofs().dispatch(&mut self.peers, protocol); + } + + pub fn finality_proof_import_result( + &mut self, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + self.extra_requests.finality_proofs().on_import_result(request_block, finalization_result); + } + + pub fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + self.extra_requests.finality_proofs().essence().0 = Some(request_builder); } /// Notify about successful import of the given block. @@ -802,29 +645,20 @@ impl ChainSync { /// Notify about finalization of the given block. pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { - if let Err(err) = self.justifications.on_block_finalized( + if let Err(err) = self.extra_requests.on_block_finalized( hash, number, - |base, block| protocol.client().is_descendent_of(base, block), + &|base, block| protocol.client().is_descendent_of(base, block), ) { - warn!(target: "sync", "Error cleaning up pending justification requests: {:?}", err); + warn!(target: "sync", "Error cleaning up pending extra data requests: {:?}", err); }; } fn block_queued(&mut self, hash: &B::Hash, number: NumberFor) { - let best_seen = self.best_seen_block(); - let previous_state = self.state(&best_seen); if number > self.best_queued_number { self.best_queued_number = number; self.best_queued_hash = *hash; } - let current_state = self.state(&best_seen); - // If the latest queued block changed our state, update is_major_syncing. - match (previous_state, current_state) { - (SyncState::Idle, SyncState::Downloading) => self.is_major_syncing.store(true, Ordering::Relaxed), - (SyncState::Downloading, SyncState::Idle) => self.is_major_syncing.store(false, Ordering::Relaxed), - _ => {}, - } // Update common blocks for (n, peer) in self.peers.iter_mut() { if let PeerSyncState::AncestorSearch(_, _) = peer.state { @@ -840,16 +674,18 @@ impl ChainSync { } } + /// Sets the new head of chain. pub(crate) fn update_chain_info(&mut self, best_header: &B::Header) { let hash = best_header.hash(); self.block_queued(&hash, best_header.number().clone()) } - /// Handle new block announcement. + /// Call when a node announces a new block. pub(crate) fn on_block_announce(&mut self, protocol: &mut Context, who: PeerId, hash: B::Hash, header: &B::Header) { let number = *header.number(); - if number <= As::sa(0) { - trace!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); + debug!(target: "sync", "Received block announcement with number {:?}", number); + if number.is_zero() { + warn!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); return; } let parent_status = block_status(&*protocol.client(), &self.queue_blocks, header.parent_hash().clone()).ok() @@ -872,7 +708,7 @@ impl ChainSync { return; } if header.parent_hash() == &self.best_queued_hash || known_parent { - peer.common_number = number - As::sa(1); + peer.common_number = number - One::one(); } else if known { peer.common_number = number } @@ -920,24 +756,11 @@ impl ChainSync { block_status(&*protocol.client(), &self.queue_blocks, *hash).ok().map_or(false, |s| s != BlockStatus::Unknown) } - /// Handle disconnected peer. + /// Call when a peer has disconnected. pub(crate) fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { - let previous_best_seen = self.best_seen_block(); - let previous_state = self.state(&previous_best_seen); self.blocks.clear_peer_download(&who); self.peers.remove(&who); - if self.peers.len() == 0 { - // We're not connected to any peer anymore. - self.is_offline.store(true, Ordering::Relaxed); - } - let current_best_seen = self.best_seen_block(); - let current_state = self.state(¤t_best_seen); - // We removed a peer, let's see if this put us in idle state and is_major_syncing should be updated. - match (previous_state, current_state) { - (SyncState::Downloading, SyncState::Idle) => self.is_major_syncing.store(false, Ordering::Relaxed), - _ => {}, - } - self.justifications.peer_disconnected(who); + self.extra_requests.peer_disconnected(who); self.maintain_sync(protocol); } @@ -955,7 +778,7 @@ impl ChainSync { Err(e) => { debug!(target:"sync", "Error reading blockchain: {:?}", e); self.best_queued_hash = self.genesis_hash; - self.best_queued_number = As::sa(0); + self.best_queued_number = Zero::zero(); } } let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); @@ -964,12 +787,6 @@ impl ChainSync { } } - /// Clear all sync data. - pub(crate) fn clear(&mut self) { - self.blocks.clear(); - self.peers.clear(); - } - // Download old block with known parent. fn download_stale(&mut self, protocol: &mut Context, who: PeerId, hash: &B::Hash) { if let Some(ref mut peer) = self.peers.get_mut(&who) { @@ -984,7 +801,7 @@ impl ChainSync { max: Some(1), }; peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_message(who, GenericMessage::BlockRequest(request)); + protocol.send_block_request(who, request); }, _ => (), } @@ -1005,7 +822,7 @@ impl ChainSync { max: Some(MAX_UNKNOWN_FORK_DOWNLOAD_LEN), }; peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_message(who, GenericMessage::BlockRequest(request)); + protocol.send_block_request(who, request); }, _ => (), } @@ -1031,10 +848,10 @@ impl ChainSync { from: message::FromBlock::Number(range.start), to: None, direction: message::Direction::Ascending, - max: Some((range.end - range.start).as_() as u32), + max: Some((range.end - range.start).saturated_into::()), }; peer.state = PeerSyncState::DownloadingNew(range.start); - protocol.send_message(who, GenericMessage::BlockRequest(request)); + protocol.send_block_request(who, request); } else { trace!(target: "sync", "Nothing to request"); } @@ -1054,7 +871,7 @@ impl ChainSync { direction: message::Direction::Ascending, max: Some(1), }; - protocol.send_message(who, GenericMessage::BlockRequest(request)); + protocol.send_block_request(who, request); } } diff --git a/core/network/src/sync/extra_requests.rs b/core/network/src/sync/extra_requests.rs new file mode 100644 index 0000000000000000000000000000000000000000..3ebf2b2509bab994c360e29627c03ca9d255403c --- /dev/null +++ b/core/network/src/sync/extra_requests.rs @@ -0,0 +1,467 @@ +// Copyright 2017-2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use std::collections::{HashMap, HashSet, VecDeque}; +use std::time::{Duration, Instant}; +use log::{trace, warn}; +use client::error::Error as ClientError; +use consensus::import_queue::SharedFinalityProofRequestBuilder; +use fork_tree::ForkTree; +use network_libp2p::PeerId; +use runtime_primitives::Justification; +use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use crate::message; +use crate::sync::{Context, PeerSync, PeerSyncState}; + +// Time to wait before trying to get the same extra data from the same peer. +const EXTRA_RETRY_WAIT: Duration = Duration::from_secs(10); + +/// Pending extra data request for the given block (hash and number). +type ExtraRequest = (::Hash, NumberFor); + +/// Extra requests processor. +pub(crate) trait ExtraRequestsEssence { + type Response; + + /// Name of request type to display in logs. + fn type_name(&self) -> &'static str; + /// Send network message corresponding to the request. + fn send_network_request(&self, protocol: &mut Context, peer: PeerId, request: ExtraRequest); + /// Create peer state for peer that is downloading extra data. + fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState; +} + +/// Manages all extra data requests required for sync. +pub(crate) struct ExtraRequestsAggregator { + /// Manages justifications requests. + justifications: ExtraRequests, + /// Manages finality proof requests. + finality_proofs: ExtraRequests>, +} + +impl ExtraRequestsAggregator { + pub(crate) fn new() -> Self { + ExtraRequestsAggregator { + justifications: ExtraRequests::new(JustificationsRequestsEssence), + finality_proofs: ExtraRequests::new(FinalityProofRequestsEssence(None)), + } + } + + pub(crate) fn justifications(&mut self) -> &mut ExtraRequests { + &mut self.justifications + } + + pub(crate) fn finality_proofs(&mut self) -> &mut ExtraRequests> { + &mut self.finality_proofs + } + + /// Dispatches all possible pending requests to the given peers. + pub(crate) fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut Context) { + self.justifications.dispatch(peers, protocol); + self.finality_proofs.dispatch(peers, protocol); + } + + /// Removes any pending extra requests for blocks lower than the + /// given best finalized. + pub(crate) fn on_block_finalized( + &mut self, + best_finalized_hash: &B::Hash, + best_finalized_number: NumberFor, + is_descendent_of: &F, + ) -> Result<(), fork_tree::Error> + where F: Fn(&B::Hash, &B::Hash) -> Result + { + self.justifications.on_block_finalized(best_finalized_hash, best_finalized_number, is_descendent_of)?; + self.finality_proofs.on_block_finalized(best_finalized_hash, best_finalized_number, is_descendent_of)?; + Ok(()) + } + + /// Retry any pending request if a peer disconnected. + pub(crate) fn peer_disconnected(&mut self, who: PeerId) { + self.justifications.peer_disconnected(&who); + self.finality_proofs.peer_disconnected(&who); + } +} + +/// Manages pending block extra data (e.g. justification) requests. +/// Multiple extras may be requested for competing forks, or for the same branch +/// at different (increasing) heights. This structure will guarantee that extras +/// are fetched in-order, and that obsolete changes are pruned (when finalizing a +/// competing fork). +pub(crate) struct ExtraRequests { + tree: ForkTree, ()>, + pending_requests: VecDeque>, + peer_requests: HashMap>, + previous_requests: HashMap, Vec<(PeerId, Instant)>>, + importing_requests: HashSet>, + essence: Essence, +} + +impl> ExtraRequests { + fn new(essence: Essence) -> Self { + ExtraRequests { + tree: ForkTree::new(), + pending_requests: VecDeque::new(), + peer_requests: HashMap::new(), + previous_requests: HashMap::new(), + importing_requests: HashSet::new(), + essence, + } + } + + /// Get mutable reference to the requests essence. + pub(crate) fn essence(&mut self) -> &mut Essence { + &mut self.essence + } + + /// Dispatches all possible pending requests to the given peers. Peers are + /// filtered according to the current known best block (i.e. we won't send a + /// extra request for block #10 to a peer at block #2), and we also + /// throttle requests to the same peer if a previous justification request + /// yielded no results. + pub(crate) fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut Context) { + if self.pending_requests.is_empty() { + return; + } + + let initial_pending_requests = self.pending_requests.len(); + + // clean up previous failed requests so we can retry again + for (_, requests) in self.previous_requests.iter_mut() { + requests.retain(|(_, instant)| instant.elapsed() < EXTRA_RETRY_WAIT); + } + + let mut available_peers = peers.iter().filter_map(|(peer, sync)| { + // don't request to any peers that already have pending requests or are unavailable + if sync.state != PeerSyncState::Available || self.peer_requests.contains_key(&peer) { + None + } else { + Some((peer.clone(), sync.best_number)) + } + }).collect::>(); + + let mut last_peer = available_peers.back().map(|p| p.0.clone()); + let mut unhandled_requests = VecDeque::new(); + + loop { + let (peer, peer_best_number) = match available_peers.pop_front() { + Some(p) => p, + _ => break, + }; + + // only ask peers that have synced past the block number that we're + // asking the extra for and to whom we haven't already made + // the same request recently + let peer_eligible = { + let request = match self.pending_requests.front() { + Some(r) => r.clone(), + _ => break, + }; + + peer_best_number >= request.1 && + !self.previous_requests + .get(&request) + .map(|requests| requests.iter().any(|i| i.0 == peer)) + .unwrap_or(false) + }; + + if !peer_eligible { + available_peers.push_back((peer.clone(), peer_best_number)); + + // we tried all peers and none can answer this request + if Some(peer) == last_peer { + last_peer = available_peers.back().map(|p| p.0.clone()); + + let request = self.pending_requests.pop_front() + .expect("verified to be Some in the beginning of the loop; qed"); + + unhandled_requests.push_back(request); + } + + continue; + } + + last_peer = available_peers.back().map(|p| p.0.clone()); + + let request = self.pending_requests.pop_front() + .expect("verified to be Some in the beginning of the loop; qed"); + + self.peer_requests.insert(peer.clone(), request); + + peers.get_mut(&peer) + .expect("peer was is taken from available_peers; available_peers is a subset of peers; qed") + .state = self.essence.peer_downloading_state(request.0.clone()); + + trace!(target: "sync", "Requesting {} for block #{} from {}", self.essence.type_name(), request.0, peer); + self.essence.send_network_request(protocol, peer, request); + } + + self.pending_requests.append(&mut unhandled_requests); + + trace!(target: "sync", "Dispatched {} {} requests ({} pending)", + initial_pending_requests - self.pending_requests.len(), + self.essence.type_name(), + self.pending_requests.len(), + ); + } + + /// Queue a extra data request (without dispatching it). + pub(crate) fn queue_request(&mut self, request: ExtraRequest, is_descendent_of: F) + where F: Fn(&B::Hash, &B::Hash) -> Result + { + match self.tree.import(request.0.clone(), request.1.clone(), (), &is_descendent_of) { + Ok(true) => { + // this is a new root so we add it to the current `pending_requests` + self.pending_requests.push_back((request.0, request.1)); + }, + Err(err) => { + warn!(target: "sync", "Failed to insert requested {} {:?} {:?} into tree: {:?}", + self.essence.type_name(), + request.0, + request.1, + err, + ); + return; + }, + _ => {}, + } + } + + /// Retry any pending request if a peer disconnected. + fn peer_disconnected(&mut self, who: &PeerId) { + if let Some(request) = self.peer_requests.remove(who) { + self.pending_requests.push_front(request); + } + } + + /// Process the import result of an extra. + /// Queues a retry in case the import failed. + /// Returns true if import has been queued. + pub(crate) fn on_import_result( + &mut self, + request: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) -> bool { + self.try_finalize_root(request, finalization_result, true) + } + + /// Processes the response for the request previously sent to the given + /// peer. Queues a retry in case the given justification + /// was `None`. + pub(crate) fn on_response( + &mut self, + who: PeerId, + response: Option, + ) -> Option<(PeerId, B::Hash, NumberFor, Essence::Response)> { + // we assume that the request maps to the given response, this is + // currently enforced by the outer network protocol before passing on + // messages to chain sync. + if let Some(request) = self.peer_requests.remove(&who) { + if let Some(response) = response { + self.importing_requests.insert(request); + return Some((who, request.0, request.1, response)); + } + + self.previous_requests + .entry(request) + .or_insert(Vec::new()) + .push((who, Instant::now())); + self.pending_requests.push_front(request); + } + + None + } + + /// Removes any pending extra requests for blocks lower than the + /// given best finalized. + fn on_block_finalized( + &mut self, + best_finalized_hash: &B::Hash, + best_finalized_number: NumberFor, + is_descendent_of: F, + ) -> Result<(), fork_tree::Error> + where F: Fn(&B::Hash, &B::Hash) -> Result + { + let is_scheduled_root = self.try_finalize_root( + (*best_finalized_hash, best_finalized_number), + Ok((*best_finalized_hash, best_finalized_number)), + false, + ); + if is_scheduled_root { + return Ok(()); + } + + self.tree.finalize(best_finalized_hash, best_finalized_number, &is_descendent_of)?; + + let roots = self.tree.roots().collect::>(); + + self.pending_requests.retain(|(h, n)| roots.contains(&(h, n, &()))); + self.peer_requests.retain(|_, (h, n)| roots.contains(&(h, n, &()))); + self.previous_requests.retain(|(h, n), _| roots.contains(&(h, n, &()))); + + Ok(()) + } + + /// Clear all data. + pub(crate) fn clear(&mut self) { + self.tree = ForkTree::new(); + self.pending_requests.clear(); + self.peer_requests.clear(); + self.previous_requests.clear(); + } + + /// Try to finalize pending root. + /// Returns true if import of this request has been scheduled. + fn try_finalize_root( + &mut self, + request: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + reschedule_on_failure: bool, + ) -> bool { + if !self.importing_requests.remove(&request) { + return false; + } + + let (finalized_hash, finalized_number) = match finalization_result { + Ok((finalized_hash, finalized_number)) => (finalized_hash, finalized_number), + Err(_) => { + if reschedule_on_failure { + self.pending_requests.push_front(request); + } + return true; + }, + }; + + if self.tree.finalize_root(&finalized_hash).is_none() { + warn!(target: "sync", "Imported {} for {:?} {:?} which isn't a root in the tree: {:?}", + self.essence.type_name(), + finalized_hash, + finalized_number, + self.tree.roots().collect::>(), + ); + return true; + }; + + self.previous_requests.clear(); + self.peer_requests.clear(); + self.pending_requests = + self.tree.roots().map(|(h, n, _)| (h.clone(), n.clone())).collect(); + + true + } +} + +pub(crate) struct JustificationsRequestsEssence; + +impl ExtraRequestsEssence for JustificationsRequestsEssence { + type Response = Justification; + + fn type_name(&self) -> &'static str { + "justification" + } + + fn send_network_request(&self, protocol: &mut Context, peer: PeerId, request: ExtraRequest) { + protocol.send_block_request(peer, message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::JUSTIFICATION, + from: message::FromBlock::Hash(request.0), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }) + } + + fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState { + PeerSyncState::DownloadingJustification(block) + } +} + +pub(crate) struct FinalityProofRequestsEssence(pub Option>); + +impl ExtraRequestsEssence for FinalityProofRequestsEssence { + type Response = Vec; + + fn type_name(&self) -> &'static str { + "finality proof" + } + + fn send_network_request(&self, protocol: &mut Context, peer: PeerId, request: ExtraRequest) { + protocol.send_finality_proof_request(peer, message::generic::FinalityProofRequest { + id: 0, + block: request.0, + request: self.0.as_ref() + .map(|builder| builder.build_request_data(&request.0)) + .unwrap_or_default(), + }) + } + + fn peer_downloading_state(&self, block: B::Hash) -> PeerSyncState { + PeerSyncState::DownloadingFinalityProof(block) + } +} + +#[cfg(test)] +mod tests { + use client::error::Error as ClientError; + use test_client::runtime::{Block, Hash}; + use super::ExtraRequestsAggregator; + + #[test] + fn request_is_rescheduled_when_earlier_block_is_finalized() { + let _ = ::env_logger::try_init(); + + let mut extra_requests = ExtraRequestsAggregator::::new(); + + let hash4 = [4; 32].into(); + let hash5 = [5; 32].into(); + let hash6 = [6; 32].into(); + let hash7 = [7; 32].into(); + + fn is_descendent_of(base: &Hash, target: &Hash) -> Result { + Ok(target[0] >= base[0]) + } + + // make #4 last finalized block + extra_requests.finality_proofs().tree.import(hash4, 4, (), &is_descendent_of).unwrap(); + extra_requests.finality_proofs().tree.finalize_root(&hash4); + + // schedule request for #6 + extra_requests.finality_proofs().queue_request((hash6, 6), is_descendent_of); + + // receive finality proof for #5 + extra_requests.finality_proofs().importing_requests.insert((hash6, 6)); + extra_requests.finality_proofs().on_block_finalized(&hash5, 5, is_descendent_of).unwrap(); + extra_requests.finality_proofs().on_import_result((hash6, 6), Ok((hash5, 5))); + + // ensure that request for #6 is still pending + assert_eq!( + extra_requests.finality_proofs().pending_requests.iter().collect::>(), + vec![&(hash6, 6)], + ); + + // receive finality proof for #7 + extra_requests.finality_proofs().importing_requests.insert((hash6, 6)); + extra_requests.finality_proofs().on_block_finalized(&hash6, 6, is_descendent_of).unwrap(); + extra_requests.finality_proofs().on_block_finalized(&hash7, 7, is_descendent_of).unwrap(); + extra_requests.finality_proofs().on_import_result((hash6, 6), Ok((hash7, 7))); + + // ensure that there's no request for #6 + assert_eq!( + extra_requests.finality_proofs().pending_requests.iter().collect::>(), + Vec::<&(Hash, u64)>::new(), + ); + } +} diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index 3b5e44cc47e5a76d1b2b65de3ded66a0f78abdfa..550d3c75ed0ef9815d67fe1cc770317a1c485386 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -77,7 +77,7 @@ fn async_import_queue_drops() { // Perform this test multiple times since it exhibits non-deterministic behavior. for _ in 0..100 { let verifier = Arc::new(PassThroughVerifier(true)); - let queue = BasicQueue::new(verifier, Arc::new(test_client::new()), None); + let queue = BasicQueue::new(verifier, Arc::new(test_client::new()), None, None, None); queue.start(Box::new(TestLink{})).unwrap(); drop(queue); } diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index 6f50967bba9d3ad7761caae3996aded8b13aaf71..ac9e9a98eb3f09142c3ed712ec37874f44744a89 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -21,34 +21,35 @@ mod block_import; #[cfg(test)] mod sync; -use std::collections::{HashMap, HashSet}; +use std::collections::{HashMap, HashSet, VecDeque}; use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::thread; -use std::time::Duration; +use crate::AlwaysBadChecker; use log::trace; -use client; +use crate::chain::FinalityProofProvider; +use client::{self, ClientInfo, BlockchainEvents, FinalityNotifications}; +use client::{in_mem::Backend as InMemoryBackend, error::Result as ClientResult}; use client::block_builder::BlockBuilder; -use crate::config::ProtocolConfig; +use client::backend::AuxStore; +use crate::config::{ProtocolConfig, Roles}; use consensus::import_queue::{BasicQueue, ImportQueue, IncomingBlock}; -use consensus::import_queue::{Link, SharedBlockImport, SharedJustificationImport, Verifier}; -use consensus::{Error as ConsensusError, ErrorKind as ConsensusErrorKind}; +use consensus::import_queue::{ + Link, SharedBlockImport, SharedJustificationImport, Verifier, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, +}; +use consensus::{Error as ConsensusError}; use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient, TopicNotification}; -use crossbeam_channel::{self as channel, Sender, select}; -use futures::Future; -use futures::sync::{mpsc, oneshot}; +use futures::{prelude::*, sync::{mpsc, oneshot}}; use crate::message::Message; use network_libp2p::PeerId; -use parity_codec::Encode; use parking_lot::{Mutex, RwLock}; -use primitives::{H256, ed25519::Public as AuthorityId}; -use crate::protocol::{ConnectedPeer, Context, FromNetworkMsg, Protocol, ProtocolMsg}; +use primitives::{H256, sr25519::Public as AuthorityId, Blake2Hasher}; +use crate::protocol::{Context, Protocol, ProtocolStatus, CustomMessageOutcome, NetworkOut}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT, Digest, DigestItem, Header, NumberFor}; use runtime_primitives::{Justification, ConsensusEngineId}; -use crate::service::{network_channel, NetworkChan, NetworkLink, NetworkMsg, NetworkPort, TransactionPool}; +use crate::service::{NetworkLink, NetworkMsg, ProtocolMsg, TransactionPool}; use crate::specialization::NetworkSpecialization; use test_client::{self, AccountKeyring}; @@ -61,7 +62,7 @@ pub use test_client::TestClient; pub struct PassThroughVerifier(pub bool); #[cfg(any(test, feature = "test-helpers"))] -/// This Verifiyer accepts all data as valid +/// This `Verifier` accepts all data as valid. impl Verifier for PassThroughVerifier { fn verify( &self, @@ -115,66 +116,114 @@ impl NetworkSpecialization for DummySpecialization { } } -pub type PeersClient = client::Client; +pub type PeersFullClient = + client::Client; +pub type PeersLightClient = + client::Client; + +#[derive(Clone)] +pub enum PeersClient { + Full(Arc), + Light(Arc), +} + +impl PeersClient { + pub fn as_full(&self) -> Option> { + match *self { + PeersClient::Full(ref client) => Some(client.clone()), + _ => None, + } + } + + pub fn as_block_import(&self) -> SharedBlockImport { + match *self { + PeersClient::Full(ref client) => client.clone() as _, + PeersClient::Light(ref client) => client.clone() as _, + } + } + + pub fn as_in_memory_backend(&self) -> InMemoryBackend { + match *self { + PeersClient::Full(ref client) => client.backend().as_in_memory(), + PeersClient::Light(_) => unimplemented!("TODO"), + } + } + + pub fn get_aux(&self, key: &[u8]) -> ClientResult>> { + match *self { + PeersClient::Full(ref client) => client.backend().get_aux(key), + PeersClient::Light(ref client) => client.backend().get_aux(key), + } + } + + pub fn info(&self) -> ClientResult> { + match *self { + PeersClient::Full(ref client) => client.info(), + PeersClient::Light(ref client) => client.info(), + } + } + + pub fn header(&self, block: &BlockId) -> ClientResult::Header>> { + match *self { + PeersClient::Full(ref client) => client.header(block), + PeersClient::Light(ref client) => client.header(block), + } + } + + pub fn justification(&self, block: &BlockId) -> ClientResult> { + match *self { + PeersClient::Full(ref client) => client.justification(block), + PeersClient::Light(ref client) => client.justification(block), + } + } + + pub fn finality_notification_stream(&self) -> FinalityNotifications { + match *self { + PeersClient::Full(ref client) => client.finality_notification_stream(), + PeersClient::Light(ref client) => client.finality_notification_stream(), + } + } + + pub fn finalize_block( + &self, + id: BlockId, + justification: Option, + notify: bool + ) -> ClientResult<()> { + match *self { + PeersClient::Full(ref client) => client.finalize_block(id, justification, notify), + PeersClient::Light(ref client) => client.finalize_block(id, justification, notify), + } + } +} /// A Link that can wait for a block to have been imported. pub struct TestLink> { - import_done: Arc, - hash: Arc>, link: NetworkLink, - protocol_sender: Sender>, - network_sender: NetworkChan, + + #[cfg(any(test, feature = "test-helpers"))] + network_to_protocol_sender: mpsc::UnboundedSender>, } impl> TestLink { fn new( - protocol_sender: Sender>, - network_sender: NetworkChan + protocol_sender: mpsc::UnboundedSender>, + _network_to_protocol_sender: mpsc::UnboundedSender>, + network_sender: mpsc::UnboundedSender> ) -> TestLink { TestLink { - protocol_sender: protocol_sender.clone(), - network_sender: network_sender.clone(), - import_done: Arc::new(AtomicBool::new(false)), - hash: Arc::new(Mutex::new(Default::default())), + #[cfg(any(test, feature = "test-helpers"))] + network_to_protocol_sender: _network_to_protocol_sender, link: NetworkLink { protocol_sender, network_sender, } } } - - fn clone_link(&self) -> Self { - TestLink { - protocol_sender: self.protocol_sender.clone(), - network_sender: self.network_sender.clone(), - import_done: self.import_done.clone(), - hash: self.hash.clone(), - link: NetworkLink { - protocol_sender: self.protocol_sender.clone(), - network_sender: self.network_sender.clone(), - } - } - } - - /// Set the hash which will be awaited for import. - fn with_hash(&self, hash: Hash) { - self.import_done.store(false, Ordering::SeqCst); - *self.hash.lock() = hash; - } - - /// Simulate a synchronous import. - fn wait_for_import(&self) { - while !self.import_done.load(Ordering::SeqCst) { - thread::sleep(Duration::from_millis(20)); - } - } } impl> Link for TestLink { fn block_imported(&self, hash: &Hash, number: NumberFor) { - if hash == &*self.hash.lock() { - self.import_done.store(true, Ordering::SeqCst); - } self.link.block_imported(hash, number); } @@ -190,62 +239,217 @@ impl> Link for TestLink { self.link.request_justification(hash, number); } - fn useless_peer(&self, who: PeerId, reason: &str) { - self.link.useless_peer(who, reason); + fn finality_proof_imported( + &self, + who: PeerId, + request_block: (Hash, NumberFor), + finalization_result: Result<(Hash, NumberFor), ()>, + ) { + self.link.finality_proof_imported(who, request_block, finalization_result); + } + + fn request_finality_proof(&self, hash: &Hash, number: NumberFor) { + self.link.request_finality_proof(hash, number); + } + + fn set_finality_proof_request_builder(&self, request_builder: SharedFinalityProofRequestBuilder) { + self.link.set_finality_proof_request_builder(request_builder); } - fn note_useless_and_restart_sync(&self, who: PeerId, reason: &str) { - self.link.note_useless_and_restart_sync(who, reason); + fn report_peer(&self, who: PeerId, reputation_change: i32) { + self.link.report_peer(who, reputation_change); } fn restart(&self) { self.link.restart(); } + + /// Send synchronization request to the block import channel. + /// + /// The caller should wait for the `Link::synchronized` call to ensure that it has synchronized + /// with `ImportQueue`. + #[cfg(any(test, feature = "test-helpers"))] + fn synchronized(&self) { + drop(self.network_to_protocol_sender.unbounded_send(FromNetworkMsg::Synchronize)) + } } pub struct Peer> { - pub is_offline: Arc, - pub is_major_syncing: Arc, - pub peers: Arc>>>, - pub peer_id: PeerId, - client: Arc, - network_to_protocol_sender: Sender>, - pub protocol_sender: Sender>, - network_link: TestLink, - network_port: Arc>>, - pub import_queue: Box>, + peer_id: PeerId, + client: PeersClient, + net_proto_channel: ProtocolChannel, + protocol_status: Arc>>, + import_queue: Box>, pub data: D, best_hash: Mutex>, finalized_hash: Mutex>, } +type MessageFilter = Fn(&NetworkMsg) -> bool; + +pub enum FromNetworkMsg { + /// A peer connected, with debug info. + PeerConnected(PeerId, String), + /// A peer disconnected, with debug info. + PeerDisconnected(PeerId, String), + /// A custom message from another peer. + CustomMessage(PeerId, Message), + /// Synchronization request. + Synchronize, +} + +struct ProtocolChannel> { + /// If true, we expect a tokio executor to be available. If false, we spawn our own. + use_tokio: bool, + buffered_messages: Mutex>>, + network_to_protocol_sender: mpsc::UnboundedSender>, + client_to_protocol_sender: mpsc::UnboundedSender>, + protocol_to_network_receiver: Mutex>>, +} + +impl> ProtocolChannel { + /// Create new buffered network port. + pub fn new( + use_tokio: bool, + network_to_protocol_sender: mpsc::UnboundedSender>, + client_to_protocol_sender: mpsc::UnboundedSender>, + protocol_to_network_receiver: mpsc::UnboundedReceiver>, + ) -> Self { + ProtocolChannel { + use_tokio, + buffered_messages: Mutex::new(VecDeque::new()), + network_to_protocol_sender, + client_to_protocol_sender, + protocol_to_network_receiver: Mutex::new(protocol_to_network_receiver), + } + } + + /// Send message from network to protocol. + pub fn send_from_net(&self, message: FromNetworkMsg) { + let _ = self.network_to_protocol_sender.unbounded_send(message); + + let _ = self.network_to_protocol_sender.unbounded_send(FromNetworkMsg::Synchronize); + let _ = self.wait_sync(); + } + + /// Send message from client to protocol. + pub fn send_from_client(&self, message: ProtocolMsg) { + let _ = self.client_to_protocol_sender.unbounded_send(message); + + let _ = self.client_to_protocol_sender.unbounded_send(ProtocolMsg::Synchronize); + let _ = self.wait_sync(); + } + + /// Wait until synchronization response is generated by the protocol. + pub fn wait_sync(&self) -> Result<(), ()> { + let fut = futures::future::poll_fn(|| { + loop { + let mut protocol_to_network_receiver = self.protocol_to_network_receiver.lock(); + match protocol_to_network_receiver.poll() { + Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => return Ok(Async::Ready(())), + Ok(Async::Ready(None)) | Err(_) => return Err(()), + Ok(Async::NotReady) => return Ok(Async::NotReady), + Ok(Async::Ready(Some(msg))) => self.buffered_messages.lock().push_back(msg), + } + } + }); + + if self.use_tokio { + fut.wait() + } else { + tokio::runtime::current_thread::block_on_all(fut) + } + } + + /// Produce the next pending message to send to another peer. + fn pending_message(&self, message_filter: &MessageFilter) -> Option> { + if let Some(message) = self.buffered_message(message_filter) { + return Some(message); + } + + while let Some(message) = self.channel_message() { + if message_filter(&message) { + return Some(message) + } else { + self.buffered_messages.lock().push_back(message); + } + } + + None + } + + /// Whether this peer is done syncing (has no messages to send). + fn is_done(&self) -> bool { + let mut buffered_messages = self.buffered_messages.lock(); + if let Some(msg) = self.channel_message() { + buffered_messages.push_back(msg); + false + } else { + buffered_messages.is_empty() + } + } + + /// Return oldest buffered message if it exists. + fn buffered_message(&self, message_filter: &MessageFilter) -> Option> { + let mut buffered_messages = self.buffered_messages.lock(); + for i in 0..buffered_messages.len() { + if message_filter(&buffered_messages[i]) { + return buffered_messages.remove(i); + } + } + + None + } + + /// Receive message from the channel. + fn channel_message(&self) -> Option> { + let fut = futures::future::poll_fn(|| -> Result<_, ()> { + Ok(Async::Ready(match self.protocol_to_network_receiver.lock().poll() { + Ok(Async::Ready(Some(m))) => Some(m), + Ok(Async::NotReady) => None, + Err(_) => None, + Ok(Async::Ready(None)) => None, + })) + }); + + if self.use_tokio { + fut.wait() + } else { + tokio::runtime::current_thread::block_on_all(fut) + }.ok().and_then(|a| a) + } +} + impl> Peer { fn new( - is_offline: Arc, - is_major_syncing: Arc, - peers: Arc>>>, - client: Arc, - import_queue: Box>, - network_to_protocol_sender: Sender>, - protocol_sender: Sender>, - network_sender: NetworkChan, - network_port: NetworkPort, + protocol_status: Arc>>, + client: PeersClient, + import_queue: Box>, + use_tokio: bool, + network_to_protocol_sender: mpsc::UnboundedSender>, + protocol_sender: mpsc::UnboundedSender>, + network_sender: mpsc::UnboundedSender>, + network_port: mpsc::UnboundedReceiver>, data: D, ) -> Self { - let network_port = Arc::new(Mutex::new(network_port)); - let network_link = TestLink::new(protocol_sender.clone(), network_sender.clone()); - import_queue.start(Box::new(network_link.clone_link())).expect("Test ImportQueue always starts"); + let net_proto_channel = ProtocolChannel::new( + use_tokio, + network_to_protocol_sender.clone(), + protocol_sender.clone(), + network_port, + ); + let network_link = TestLink::new( + protocol_sender.clone(), + network_to_protocol_sender.clone(), + network_sender.clone(), + ); + import_queue.start(Box::new(network_link)).expect("Test ImportQueue always starts"); Peer { - is_offline, - is_major_syncing, - peers, + protocol_status, peer_id: PeerId::random(), client, - network_to_protocol_sender, - protocol_sender, import_queue, - network_link, - network_port, + net_proto_channel, data, best_hash: Mutex::new(None), finalized_hash: Mutex::new(None), @@ -260,72 +464,69 @@ impl> Peer { .header(&BlockId::Hash(info.chain.best_hash)) .unwrap() .unwrap(); - let _ = self - .protocol_sender - .send(ProtocolMsg::BlockImported(info.chain.best_hash, header)); + self.net_proto_channel.send_from_client(ProtocolMsg::BlockImported(info.chain.best_hash, header)); } - pub fn on_block_imported( + fn on_block_imported( &self, hash: ::Hash, header: &::Header, ) { - let _ = self - .protocol_sender - .send(ProtocolMsg::BlockImported(hash, header.clone())); + self.net_proto_channel.send_from_client(ProtocolMsg::BlockImported(hash, header.clone())); } - // SyncOracle: are we connected to any peer? - pub fn is_offline(&self) -> bool { - self.is_offline.load(Ordering::Relaxed) + /// SyncOracle: are we connected to any peer? + #[cfg(test)] + fn is_offline(&self) -> bool { + self.protocol_status.read().sync.is_offline() + } + + /// SyncOracle: are we in the process of catching-up with the chain? + #[cfg(test)] + fn is_major_syncing(&self) -> bool { + self.protocol_status.read().sync.is_major_syncing() } - // SyncOracle: are we in the process of catching-up with the chain? - pub fn is_major_syncing(&self) -> bool { - self.is_major_syncing.load(Ordering::Relaxed) + /// Get protocol status. + fn protocol_status(&self) -> ProtocolStatus { + self.protocol_status.read().clone() } /// Called on connection to other indicated peer. fn on_connect(&self, other: &Self) { - let _ = self.network_to_protocol_sender.send(FromNetworkMsg::PeerConnected(other.peer_id.clone(), String::new())); + self.net_proto_channel.send_from_net(FromNetworkMsg::PeerConnected(other.peer_id.clone(), String::new())); } /// Called on disconnect from other indicated peer. fn on_disconnect(&self, other: &Self) { - let _ = self - .network_to_protocol_sender - .send(FromNetworkMsg::PeerDisconnected(other.peer_id.clone(), String::new())); + self.net_proto_channel.send_from_net(FromNetworkMsg::PeerDisconnected(other.peer_id.clone(), String::new())); } /// Receive a message from another peer. Return a set of peers to disconnect. - fn receive_message(&self, from: &Self, msg: Message) { - let _ = self - .network_to_protocol_sender - .send(FromNetworkMsg::CustomMessage(from.peer_id.clone(), msg)); + fn receive_message(&self, from: &PeerId, msg: Message) { + self.net_proto_channel.send_from_net(FromNetworkMsg::CustomMessage(from.clone(), msg)); } /// Produce the next pending message to send to another peer. - fn pending_message(&self) -> Option> { - select! { - recv(self.network_port.lock().receiver()) -> msg => return msg.ok(), - // If there are no messages ready, give protocol a change to send one. - recv(channel::after(Duration::from_millis(100))) -> _ => return None, - } - } - - /// Produce the next pending message to send to another peer, without waiting. - fn pending_message_fast(&self) -> Option> { - self.network_port.lock().receiver().try_recv().ok() + fn pending_message(&self, message_filter: &MessageFilter) -> Option> { + self.net_proto_channel.pending_message(message_filter) } /// Whether this peer is done syncing (has no messages to send). fn is_done(&self) -> bool { - self.network_port.lock().receiver().is_empty() + self.net_proto_channel.is_done() + } + + /// Synchronize with import queue. + #[cfg(any(test, feature = "test-helpers"))] + fn import_queue_sync(&self) { + self.import_queue.synchronize(); + let _ = self.net_proto_channel.wait_sync(); } /// Execute a "sync step". This is called for each peer after it sends a packet. fn sync_step(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::Tick); + self.net_proto_channel.send_from_client(ProtocolMsg::Tick); } /// Send block import notifications. @@ -340,15 +541,12 @@ impl> Peer { } let header = self.client.header(&BlockId::Hash(info.chain.best_hash)).unwrap().unwrap(); - let _ = self - .protocol_sender - .send(ProtocolMsg::BlockImported(info.chain.best_hash, header)); - + self.net_proto_channel.send_from_client(ProtocolMsg::BlockImported(info.chain.best_hash, header)); *best_hash = Some(info.chain.best_hash); } /// Send block finalization notifications. - pub fn send_finality_notifications(&self) { + fn send_finality_notifications(&self) { let info = self.client.info().expect("In-mem client does not fail"); let mut finalized_hash = self.finalized_hash.lock(); @@ -359,18 +557,12 @@ impl> Peer { } let header = self.client.header(&BlockId::Hash(info.chain.finalized_hash)).unwrap().unwrap(); - let _ = self - .protocol_sender - .send(ProtocolMsg::BlockFinalized(info.chain.finalized_hash, header.clone())); - + self.net_proto_channel.send_from_client( + ProtocolMsg::BlockFinalized(info.chain.finalized_hash, header.clone()) + ); *finalized_hash = Some(info.chain.finalized_hash); } - /// Restart sync for a peer. - fn restart_sync(&self) { - let _ = self.protocol_sender.send(ProtocolMsg::Abort); - } - /// Push a message into the gossip network and relay to peers. /// `TestNet::sync_step` needs to be called to ensure it's propagated. pub fn gossip_message( @@ -380,14 +572,14 @@ impl> Peer { data: Vec, force: bool, ) { - let recipient = if force { GossipMessageRecipient::BroadcastToAll } else { GossipMessageRecipient::BroadcastNew }; - let _ = self - .protocol_sender - .send(ProtocolMsg::GossipConsensusMessage(topic, engine_id, data, recipient)); - } - - pub fn consensus_gossip_collect_garbage_for_topic(&self, _topic: ::Hash) { - self.with_gossip(move |gossip, _| gossip.collect_garbage()) + let recipient = if force { + GossipMessageRecipient::BroadcastToAll + } else { + GossipMessageRecipient::BroadcastNew + }; + self.net_proto_channel.send_from_client( + ProtocolMsg::GossipConsensusMessage(topic, engine_id, data, recipient), + ); } /// access the underlying consensus gossip handler @@ -408,27 +600,23 @@ impl> Peer { pub fn with_gossip(&self, f: F) where F: FnOnce(&mut ConsensusGossip, &mut Context) + Send + 'static { - let _ = self - .protocol_sender - .send(ProtocolMsg::ExecuteWithGossip(Box::new(f))); + self.net_proto_channel.send_from_client(ProtocolMsg::ExecuteWithGossip(Box::new(f))); } /// Announce a block to peers. - pub fn announce_block(&self, block: Hash) { - let _ = self.protocol_sender.send(ProtocolMsg::AnnounceBlock(block)); + fn announce_block(&self, block: Hash) { + self.net_proto_channel.send_from_client(ProtocolMsg::AnnounceBlock(block)); } /// Request a justification for the given block. #[cfg(test)] fn request_justification(&self, hash: &::primitives::H256, number: NumberFor) { - let _ = self - .protocol_sender - .send(ProtocolMsg::RequestJustification(hash.clone(), number)); + self.net_proto_channel.send_from_client(ProtocolMsg::RequestJustification(hash.clone(), number)); } /// Add blocks to the peer -- edit the block before adding pub fn generate_blocks(&self, count: usize, origin: BlockOrigin, edit_block: F) -> H256 - where F: FnMut(BlockBuilder) -> Block + where F: FnMut(BlockBuilder) -> Block { let best_hash = self.client.info().unwrap().chain.best_hash; self.generate_blocks_at(BlockId::Hash(best_hash), count, origin, edit_block) @@ -436,15 +624,21 @@ impl> Peer { /// Add blocks to the peer -- edit the block before adding. The chain will /// start at the given block iD. - pub fn generate_blocks_at(&self, at: BlockId, count: usize, origin: BlockOrigin, mut edit_block: F) -> H256 - where F: FnMut(BlockBuilder) -> Block - { - let mut at = self.client.header(&at).unwrap().unwrap().hash(); + fn generate_blocks_at( + &self, + at: BlockId, + count: usize, + origin: BlockOrigin, + mut edit_block: F + ) -> H256 where F: FnMut(BlockBuilder) -> Block { + let full_client = self.client.as_full().expect("blocks could only be generated by full clients"); + let mut at = full_client.header(&at).unwrap().unwrap().hash(); for _ in 0..count { - let builder = self.client.new_block_at(&BlockId::Hash(at)).unwrap(); + let builder = full_client.new_block_at(&BlockId::Hash(at)).unwrap(); let block = edit_block(builder); let hash = block.header.hash(); trace!( + target: "test_network", "Generating {}, (#{}, parent={})", hash, block.header.number, @@ -452,7 +646,6 @@ impl> Peer { ); let header = block.header.clone(); at = hash; - self.network_link.with_hash(hash); self.import_queue.import_blocks( origin, vec![IncomingBlock { @@ -463,9 +656,11 @@ impl> Peer { justification: None, }], ); - // Simulate a sync import. - self.network_link.wait_for_import(); + + // make sure block import has completed + self.import_queue_sync(); } + at } @@ -477,7 +672,7 @@ impl> Peer { /// Push blocks to the peer (simplified: with or without a TX) starting from /// given hash. - pub fn push_blocks_at(&self, at: BlockId, count: usize, with_tx: bool) -> H256 { + fn push_blocks_at(&self, at: BlockId, count: usize, with_tx: bool) -> H256 { let mut nonce = 0; if with_tx { self.generate_blocks_at(at, count, BlockOrigin::File, |mut builder| { @@ -487,8 +682,7 @@ impl> Peer { amount: 1, nonce, }; - let signature = AccountKeyring::from_public(&transfer.from).unwrap().sign(&transfer.encode()).into(); - builder.push(Extrinsic::Transfer(transfer, signature)).unwrap(); + builder.push(transfer.into_signed_tx()).unwrap(); nonce = nonce + 1; builder.bake().unwrap() }) @@ -505,7 +699,7 @@ impl> Peer { } /// Get a reference to the client. - pub fn client(&self) -> &Arc { + pub fn client(&self) -> &PeersClient { &self.client } } @@ -525,7 +719,7 @@ impl TransactionPool for EmptyTransactionPool { } pub trait SpecializationFactory { - fn create() -> Self; + fn create() -> Self; } impl SpecializationFactory for DummySpecialization { @@ -541,7 +735,7 @@ pub trait TestNetFactory: Sized { /// These two need to be implemented! fn from_config(config: &ProtocolConfig) -> Self; - fn make_verifier(&self, client: Arc, config: &ProtocolConfig) -> Arc; + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc; /// Get reference to peer. fn peer(&self, i: usize) -> &Peer; @@ -552,72 +746,297 @@ pub trait TestNetFactory: Sized { fn set_started(&mut self, now: bool); /// Get custom block import handle for fresh client, along with peer data. - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, Self::PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + Self::PeerData, + ) { - (client, None, Default::default()) + (client.as_block_import(), None, None, None, Default::default()) + } + + /// Get finality proof provider (if supported). + fn make_finality_proof_provider(&self, _client: PeersClient) -> Option>> { + None } fn default_config() -> ProtocolConfig { ProtocolConfig::default() } + /// Must return true if the testnet is going to be used from within a tokio context. + fn uses_tokio(&self) -> bool { + false + } + /// Create new test network with this many peers. fn new(n: usize) -> Self { + trace!(target: "test_network", "Creating test network"); let config = Self::default_config(); let mut net = Self::from_config(&config); - for _ in 0..n { - net.add_peer(&config); + for i in 0..n { + trace!(target: "test_network", "Adding peer {}", i); + net.add_full_peer(&config); } net } - /// Add a peer. - fn add_peer(&mut self, config: &ProtocolConfig) { + /// Add created peer. + fn add_peer( + &mut self, + protocol_status: Arc>>, + import_queue: Box>, + tx_pool: EmptyTransactionPool, + finality_proof_provider: Option>>, + mut protocol: Protocol, + network_sender: mpsc::UnboundedSender>, + mut network_to_protocol_rx: mpsc::UnboundedReceiver>, + mut protocol_rx: mpsc::UnboundedReceiver>, + peer: Arc>, + ) { + std::thread::spawn(move || { + // Implementation of `protocol::NetworkOut` using the available local variables. + struct Ctxt<'a, B: BlockT>(&'a mpsc::UnboundedSender>); + impl<'a, B: BlockT> NetworkOut for Ctxt<'a, B> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + let _ = self.0.unbounded_send(NetworkMsg::ReportPeer(who, reputation)); + } + fn disconnect_peer(&mut self, who: PeerId) { + let _ = self.0.unbounded_send(NetworkMsg::DisconnectPeer(who)); + } + fn send_message(&mut self, who: PeerId, message: Message) { + let _ = self.0.unbounded_send(NetworkMsg::Outgoing(who, message)); + } + } + + tokio::runtime::current_thread::run(futures::future::poll_fn(move || { + while let Async::Ready(msg) = network_to_protocol_rx.poll().unwrap() { + let outcome = match msg { + Some(FromNetworkMsg::PeerConnected(peer_id, debug_msg)) => { + protocol.on_peer_connected(&mut Ctxt(&network_sender), peer_id, debug_msg); + CustomMessageOutcome::None + }, + Some(FromNetworkMsg::PeerDisconnected(peer_id, debug_msg)) => { + protocol.on_peer_disconnected(&mut Ctxt(&network_sender), peer_id, debug_msg); + CustomMessageOutcome::None + }, + Some(FromNetworkMsg::CustomMessage(peer_id, message)) => + protocol.on_custom_message( + &mut Ctxt(&network_sender), + &tx_pool, + peer_id, + message, + finality_proof_provider.as_ref().map(|p| &**p) + ), + Some(FromNetworkMsg::Synchronize) => { + let _ = network_sender.unbounded_send(NetworkMsg::Synchronized); + CustomMessageOutcome::None + }, + None => return Ok(Async::Ready(())), + }; + + match outcome { + CustomMessageOutcome::BlockImport(origin, blocks) => + import_queue.import_blocks(origin, blocks), + CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) => + import_queue.import_justification(origin, hash, nb, justification), + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) => + import_queue.import_finality_proof(origin, hash, nb, proof), + CustomMessageOutcome::None => {} + } + } + + loop { + let msg = match protocol_rx.poll() { + Ok(Async::Ready(Some(msg))) => msg, + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), + Ok(Async::NotReady) => break, + }; + + match msg { + ProtocolMsg::BlockImported(hash, header) => + protocol.on_block_imported(&mut Ctxt(&network_sender), hash, &header), + ProtocolMsg::BlockFinalized(hash, header) => + protocol.on_block_finalized(&mut Ctxt(&network_sender), hash, &header), + ProtocolMsg::ExecuteWithSpec(task) => { + let mut ctxt = Ctxt(&network_sender); + let (mut context, spec) = protocol.specialization_lock(&mut ctxt); + task.call_box(spec, &mut context); + }, + ProtocolMsg::ExecuteWithGossip(task) => { + let mut ctxt = Ctxt(&network_sender); + let (mut context, gossip) = protocol.consensus_gossip_lock(&mut ctxt); + task.call_box(gossip, &mut context); + } + ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => + protocol.gossip_consensus_message( + &mut Ctxt(&network_sender), + topic, + engine_id, + message, + recipient + ), + ProtocolMsg::BlocksProcessed(hashes, has_error) => + protocol.blocks_processed(&mut Ctxt(&network_sender), hashes, has_error), + ProtocolMsg::RestartSync => + protocol.restart(&mut Ctxt(&network_sender)), + ProtocolMsg::AnnounceBlock(hash) => + protocol.announce_block(&mut Ctxt(&network_sender), hash), + ProtocolMsg::BlockImportedSync(hash, number) => + protocol.block_imported(&hash, number), + ProtocolMsg::ClearJustificationRequests => + protocol.clear_justification_requests(), + ProtocolMsg::RequestJustification(hash, number) => + protocol.request_justification(&mut Ctxt(&network_sender), &hash, number), + ProtocolMsg::JustificationImportResult(hash, number, success) => + protocol.justification_import_result(hash, number, success), + ProtocolMsg::SetFinalityProofRequestBuilder(builder) => + protocol.set_finality_proof_request_builder(builder), + ProtocolMsg::RequestFinalityProof(hash, number) => + protocol.request_finality_proof(&mut Ctxt(&network_sender), &hash, number), + ProtocolMsg::FinalityProofImportResult(requested_block, finalziation_result) => + protocol.finality_proof_import_result(requested_block, finalziation_result), + ProtocolMsg::PropagateExtrinsics => + protocol.propagate_extrinsics(&mut Ctxt(&network_sender), &tx_pool), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Tick => protocol.tick(&mut Ctxt(&network_sender)), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Synchronize => { + trace!(target: "sync", "handle_client_msg: received Synchronize msg"); + let _ = network_sender.unbounded_send(NetworkMsg::Synchronized); + } + } + } + + if let Async::Ready(_) = protocol.poll(&mut Ctxt(&network_sender), &tx_pool).unwrap() { + return Ok(Async::Ready(())) + } + + *protocol_status.write() = protocol.status(); + Ok(Async::NotReady) + })); + }); + + if self.started() { + peer.start(); + self.peers().iter().for_each(|other| { + other.on_connect(&*peer); + peer.on_connect(other); + }); + } + + self.mut_peers(|peers| { + peers.push(peer) + }); + } + + /// Add a full peer. + fn add_full_peer(&mut self, config: &ProtocolConfig) { let client = Arc::new(test_client::new()); - let tx_pool = Arc::new(EmptyTransactionPool); - let verifier = self.make_verifier(client.clone(), config); - let (block_import, justification_import, data) = self.make_block_import(client.clone()); - let (network_sender, network_port) = network_channel(); - - let import_queue = Box::new(BasicQueue::new(verifier, block_import, justification_import)); - let status_sinks = Arc::new(Mutex::new(Vec::new())); - let is_offline = Arc::new(AtomicBool::new(true)); - let is_major_syncing = Arc::new(AtomicBool::new(false)); + let verifier = self.make_verifier(PeersClient::Full(client.clone()), config); + let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) + = self.make_block_import(PeersClient::Full(client.clone())); + let (network_sender, network_port) = mpsc::unbounded(); + + let import_queue = Box::new(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )); let specialization = self::SpecializationFactory::create(); - let peers: Arc>>> = Arc::new(Default::default()); - let (protocol_sender, network_to_protocol_sender) = Protocol::new( - status_sinks, - is_offline.clone(), - is_major_syncing.clone(), - peers.clone(), - network_sender.clone(), + let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); + + let protocol = Protocol::new( config.clone(), client.clone(), - import_queue.clone(), - None, - tx_pool, + Arc::new(AlwaysBadChecker), specialization, ).unwrap(); - let peer = Arc::new(Peer::new( - is_offline, - is_major_syncing, - peers, - client, - import_queue, - network_to_protocol_sender, - protocol_sender, - network_sender, - network_port, - data, + let protocol_status = Arc::new(RwLock::new(protocol.status())); + self.add_peer( + protocol_status.clone(), + import_queue.clone(), + EmptyTransactionPool, + self.make_finality_proof_provider(PeersClient::Full(client.clone())), + protocol, + network_sender.clone(), + network_to_protocol_rx, + protocol_rx, + Arc::new(Peer::new( + protocol_status, + PeersClient::Full(client), + import_queue, + self.uses_tokio(), + network_to_protocol_sender, + protocol_sender, + network_sender, + network_port, + data, + )), + ); + } + + /// Add a light peer. + fn add_light_peer(&mut self, config: &ProtocolConfig) { + let mut config = config.clone(); + config.roles = Roles::LIGHT; + + let client = Arc::new(test_client::new_light()); + let verifier = self.make_verifier(PeersClient::Light(client.clone()), &config); + let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) + = self.make_block_import(PeersClient::Light(client.clone())); + let (network_sender, network_port) = mpsc::unbounded(); + + let import_queue = Box::new(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, )); + let specialization = self::SpecializationFactory::create(); - self.mut_peers(|peers| { - peers.push(peer) - }); + let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); + + let protocol = Protocol::new( + config, + client.clone(), + Arc::new(AlwaysBadChecker), + specialization, + ).unwrap(); + + let protocol_status = Arc::new(RwLock::new(protocol.status())); + self.add_peer( + protocol_status.clone(), + import_queue.clone(), + EmptyTransactionPool, + self.make_finality_proof_provider(PeersClient::Light(client.clone())), + protocol, + network_sender.clone(), + network_to_protocol_rx, + protocol_rx, + Arc::new(Peer::new( + protocol_status, + PeersClient::Light(client), + import_queue, + self.uses_tokio(), + network_to_protocol_sender, + protocol_sender, + network_sender, + network_port, + data, + )), + ); } /// Start network. @@ -633,137 +1052,120 @@ pub trait TestNetFactory: Sized { } } } - self.route(None); + + loop { + // we only deliver Status messages during start + let need_continue = self.route_single(true, None, &|msg| match *msg { + NetworkMsg::Outgoing(_, crate::message::generic::Message::Status(_)) => true, + NetworkMsg::Outgoing(_, _) => false, + NetworkMsg::DisconnectPeer(_) | + NetworkMsg::ReportPeer(_, _) | NetworkMsg::Synchronized => true, + }); + if !need_continue { + break; + } + } + self.set_started(true); } - /// Do one step of routing. - fn route(&mut self, disconnected: Option>) { - self.mut_peers(move |peers| { - let mut to_disconnect = HashSet::new(); - for (peer_pos, peer) in peers.iter().enumerate() { - let packet = peer.pending_message(); - match packet { - None => continue, - Some(NetworkMsg::Outgoing(recipient, packet)) => { - let recipient = peers.iter().position(|p| p.peer_id == recipient).unwrap(); - if let Some(disconnected) = disconnected.as_ref() { - let mut current = HashSet::new(); - current.insert(peer_pos); - current.insert(recipient); - // Not routing message between "disconnected" nodes. - if disconnected.is_subset(¤t) { - continue; + /// Do single round of message routing: single message from every peer is routed. + fn route_single( + &mut self, + disconnect: bool, + disconnected: Option>, + message_filter: &MessageFilter, + ) -> bool { + let mut had_messages = false; + let mut to_disconnect = HashSet::new(); + let peers = self.peers(); + for peer in peers { + if let Some(message) = peer.pending_message(message_filter) { + match message { + NetworkMsg::Outgoing(recipient_id, packet) => { + had_messages = true; + + let sender_pos = peers.iter().position(|p| p.peer_id == peer.peer_id).unwrap(); + let recipient_pos = peers.iter().position(|p| p.peer_id == recipient_id).unwrap(); + if disconnect { + if let Some(ref disconnected) = disconnected { + let mut current = HashSet::new(); + current.insert(sender_pos); + current.insert(recipient_pos); + // Not routing message between "disconnected" nodes. + if disconnected.is_subset(¤t) { + continue; + } } } - peers[recipient].receive_message(peer, packet) - } - Some(NetworkMsg::ReportPeer(who, _)) => { - to_disconnect.insert(who); - } - } - } - for d in to_disconnect { - if let Some(d) = peers.iter().find(|p| p.peer_id == d) { - for peer in 0..peers.len() { - peers[peer].on_disconnect(d); - } + + peers[recipient_pos].receive_message(&peer.peer_id, packet); + }, + NetworkMsg::DisconnectPeer(who) => { + if disconnect { + to_disconnect.insert(who); + } + }, + _ => (), } } - }); - } + } - /// Route all pending outgoing messages, without waiting or disconnecting. - fn route_fast(&mut self) { - self.mut_peers(move |peers| { - for peer in 0..peers.len() { - while let Some(NetworkMsg::Outgoing(recipient, packet)) = peers[peer].pending_message_fast() { - if let Some(p) = peers.iter().find(|p| p.peer_id == recipient) { - p.receive_message(&peers[peer], packet) - } + for d in to_disconnect { + if let Some(d) = peers.iter().find(|p| p.peer_id == d) { + for peer in 0..peers.len() { + peers[peer].on_disconnect(d); } } - }); - } + } - /// Do a step of synchronization. - fn sync_step(&mut self) { - self.route(None); + // make sure that the protocol(s) has processed all messages that have been queued + self.peers().iter().for_each(|peer| peer.import_queue_sync()); - self.mut_peers(|peers| { - for peer in peers { - peer.sync_step(); - } - }) + had_messages } /// Send block import notifications for all peers. fn send_import_notifications(&mut self) { - self.mut_peers(|peers| { - for peer in peers { - peer.send_import_notifications(); - } - }) + self.peers().iter().for_each(|peer| peer.send_import_notifications()) } /// Send block finalization notifications for all peers. fn send_finality_notifications(&mut self) { - self.mut_peers(|peers| { - for peer in peers { - peer.send_finality_notifications(); - } - }) - } - - /// Restart sync for a peer. - fn restart_peer(&mut self, i: usize) { - self.peers()[i].restart_sync(); + self.peers().iter().for_each(|peer| peer.send_finality_notifications()) } /// Perform synchronization until complete, if provided the /// given nodes set are excluded from sync. - fn sync_with(&mut self, disconnected: Option>) -> u32 { + fn sync_with(&mut self, disconnect: bool, disconnected: Option>) { self.start(); - let mut total_steps = 0; - let mut done = 0; - - loop { - if done > 3 { break; } - if self.done() { - done += 1; - } else { - done = 0; - } - - self.sync_step(); - self.route(disconnected.clone()); - - total_steps += 1; + while self.route_single(disconnect, disconnected.clone(), &|_| true) { + // give protocol a chance to do its maintain procedures + self.peers().iter().for_each(|peer| peer.sync_step()); } + } - total_steps + /// Deliver at most 1 pending message from every peer. + fn sync_step(&mut self) { + self.route_single(true, None, &|_| true); } - /// Perform synchronization until complete. - fn sync(&mut self) -> u32 { - self.sync_with(None) + /// Maintain sync for a peer. + fn tick_peer(&mut self, i: usize) { + self.peers()[i].sync_step(); } - /// Perform synchronization until complete, - /// excluding sync between certain nodes. - fn sync_with_disconnected(&mut self, disconnected: HashSet) -> u32 { - self.sync_with(Some(disconnected)) + /// Deliver pending messages until there are no more. + fn sync(&mut self) { + self.sync_with(true, None) } - /// Do the given amount of sync steps. - fn sync_steps(&mut self, count: usize) { - self.start(); - for _ in 0..count { - self.sync_step(); - } + /// Deliver pending messages until there are no more. Do not disconnect nodes. + fn sync_without_disconnects(&mut self) { + self.sync_with(false, None) } - /// Whether all peers have synced. + /// Whether all peers have no pending outgoing messages. fn done(&self) -> bool { self.peers().iter().all(|p| p.is_done()) } @@ -787,7 +1189,7 @@ impl TestNetFactory for TestNet { } } - fn make_verifier(&self, _client: Arc, _config: &ProtocolConfig) + fn make_verifier(&self, _client: PeersClient, _config: &ProtocolConfig) -> Arc { Arc::new(PassThroughVerifier(false)) @@ -814,7 +1216,7 @@ impl TestNetFactory for TestNet { } } -pub struct ForceFinalized(Arc); +pub struct ForceFinalized(PeersClient); impl JustificationImport for ForceFinalized { type Error = ConsensusError; @@ -826,7 +1228,7 @@ impl JustificationImport for ForceFinalized { justification: Justification, ) -> Result<(), Self::Error> { self.0.finalize_block(BlockId::Hash(hash), Some(justification), true) - .map_err(|_| ConsensusErrorKind::InvalidJustification.into()) + .map_err(|_| ConsensusError::InvalidJustification.into()) } } @@ -841,7 +1243,7 @@ impl TestNetFactory for JustificationTestNet { JustificationTestNet(TestNet::from_config(config)) } - fn make_verifier(&self, client: Arc, config: &ProtocolConfig) + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc { self.0.make_verifier(client, config) @@ -855,7 +1257,7 @@ impl TestNetFactory for JustificationTestNet { self.0.peers() } - fn mut_peers>>)>(&mut self, closure: F ) { + fn mut_peers>>)>(&mut self, closure: F) { self.0.mut_peers(closure) } @@ -867,9 +1269,15 @@ impl TestNetFactory for JustificationTestNet { self.0.set_started(new) } - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, Self::PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + Self::PeerData, + ) { - (client.clone(), Some(Arc::new(ForceFinalized(client))), Default::default()) + (client.as_block_import(), Some(Arc::new(ForceFinalized(client))), None, None, Default::default()) } } diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index 9bbf0a32b7fd1a993e07f1ea85bd1cb0a7225a99..8462304e42f1582845fc9264ac399a987bf25925 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -14,13 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use client::backend::Backend; -use client::blockchain::HeaderBackend as BlockchainHeaderBackend; +use client::{backend::Backend, blockchain::HeaderBackend}; use crate::config::Roles; +use crate::message; use consensus::BlockOrigin; use std::collections::HashSet; -use std::thread; -use std::time::Duration; use super::*; fn test_ancestor_search_when_common_is(n: usize) { @@ -35,10 +33,9 @@ fn test_ancestor_search_when_common_is(n: usize) { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -48,8 +45,7 @@ fn sync_peers_works() { net.sync(); for peer in 0..3 { // Assert peers is up to date. - let peers = net.peer(peer).peers.read(); - assert_eq!(peers.len(), 2); + assert_eq!(net.peer(peer).protocol_status.read().num_peers, 2); // And then disconnect. for other in 0..3 { if other != peer { @@ -60,8 +56,8 @@ fn sync_peers_works() { net.sync(); // Now peers are disconnected. for peer in 0..3 { - let peers = net.peer(peer).peers.read(); - assert_eq!(peers.len(), 0); + let status = net.peer(peer).protocol_status.read(); + assert_eq!(status.num_peers, 0); } } @@ -78,9 +74,6 @@ fn sync_cycle_from_offline_to_syncing_to_offline() { // Generate blocks. net.peer(2).push_blocks(100, false); net.start(); - net.route_fast(); - thread::sleep(Duration::from_millis(100)); - net.route_fast(); for peer in 0..3 { // Online assert!(!net.peer(peer).is_offline()); @@ -102,7 +95,7 @@ fn sync_cycle_from_offline_to_syncing_to_offline() { net.peer(peer).on_disconnect(net.peer(other)); } } - thread::sleep(Duration::from_millis(100)); + net.sync(); assert!(net.peer(peer).is_offline()); assert!(!net.peer(peer).is_major_syncing()); } @@ -116,9 +109,7 @@ fn syncing_node_not_major_syncing_when_disconnected() { // Generate blocks. net.peer(2).push_blocks(100, false); net.start(); - net.route_fast(); - thread::sleep(Duration::from_millis(100)); - net.route_fast(); + net.sync_step(); // Peer 1 is major-syncing. assert!(net.peer(1).is_major_syncing()); @@ -126,9 +117,9 @@ fn syncing_node_not_major_syncing_when_disconnected() { // Disconnect peer 1 form everyone else. net.peer(1).on_disconnect(net.peer(0)); net.peer(1).on_disconnect(net.peer(2)); - thread::sleep(Duration::from_millis(100)); // Peer 1 is not major-syncing. + net.sync(); assert!(!net.peer(1).is_major_syncing()); } @@ -139,8 +130,8 @@ fn sync_from_two_peers_works() { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); assert!(!net.peer(0).is_major_syncing()); } @@ -151,10 +142,9 @@ fn sync_from_two_peers_with_ancestry_search_works() { net.peer(0).push_blocks(10, true); net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -166,10 +156,9 @@ fn ancestry_search_works_when_backoff_is_one() { net.peer(1).push_blocks(2, false); net.peer(2).push_blocks(2, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -181,10 +170,9 @@ fn ancestry_search_works_when_ancestor_is_genesis() { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); - net.restart_peer(0); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -207,8 +195,8 @@ fn sync_long_chain_works() { let mut net = TestNet::new(2); net.peer(1).push_blocks(500, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -218,8 +206,8 @@ fn sync_no_common_longer_chain_fails() { net.peer(0).push_blocks(20, true); net.peer(1).push_blocks(20, false); net.sync(); - assert!(!net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(!net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -297,11 +285,11 @@ fn sync_after_fork_works() { net.peer(2).push_blocks(1, false); // peer 1 has the best chain - let peer1_chain = net.peer(1).client.backend().as_in_memory().blockchain().clone(); + let peer1_chain = net.peer(1).client.as_in_memory_backend().blockchain().clone(); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); - assert!(net.peer(1).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); - assert!(net.peer(2).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(0).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(1).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(2).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); } #[test] @@ -317,8 +305,8 @@ fn syncs_all_forks() { net.sync(); // Check that all peers have all of the blocks. - assert_eq!(9, net.peer(0).client.backend().as_in_memory().blockchain().blocks_count()); - assert_eq!(9, net.peer(1).client.backend().as_in_memory().blockchain().blocks_count()); + assert_eq!(9, net.peer(0).client.as_in_memory_backend().blockchain().blocks_count()); + assert_eq!(9, net.peer(1).client.as_in_memory_backend().blockchain().blocks_count()); } #[test] @@ -332,11 +320,11 @@ fn own_blocks_are_announced() { net.peer(0).on_block_imported(header.hash(), &header); net.sync(); - assert_eq!(net.peer(0).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(1).client.backend().blockchain().info().unwrap().best_number, 1); - let peer0_chain = net.peer(0).client.backend().as_in_memory().blockchain().clone(); - assert!(net.peer(1).client.backend().as_in_memory().blockchain().canon_equals_to(&peer0_chain)); - assert!(net.peer(2).client.backend().as_in_memory().blockchain().canon_equals_to(&peer0_chain)); + assert_eq!(net.peer(0).client.as_in_memory_backend().blockchain().info().unwrap().best_number, 1); + assert_eq!(net.peer(1).client.as_in_memory_backend().blockchain().info().unwrap().best_number, 1); + let peer0_chain = net.peer(0).client.as_in_memory_backend().blockchain().clone(); + assert!(net.peer(1).client.as_in_memory_backend().blockchain().canon_equals_to(&peer0_chain)); + assert!(net.peer(2).client.as_in_memory_backend().blockchain().canon_equals_to(&peer0_chain)); } #[test] @@ -348,9 +336,9 @@ fn blocks_are_not_announced_by_light_nodes() { // light peer1 is connected to full peer2 let mut light_config = ProtocolConfig::default(); light_config.roles = Roles::LIGHT; - net.add_peer(&ProtocolConfig::default()); - net.add_peer(&light_config); - net.add_peer(&ProtocolConfig::default()); + net.add_full_peer(&ProtocolConfig::default()); + net.add_full_peer(&light_config); + net.add_full_peer(&ProtocolConfig::default()); net.peer(0).push_blocks(1, false); net.peer(0).start(); @@ -363,14 +351,14 @@ fn blocks_are_not_announced_by_light_nodes() { let mut disconnected = HashSet::new(); disconnected.insert(0); disconnected.insert(2); - net.sync_with_disconnected(disconnected); + net.sync_with(true, Some(disconnected)); // peer 0 has the best chain // peer 1 has the best chain // peer 2 has genesis-chain only - assert_eq!(net.peer(0).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(1).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(2).client.backend().blockchain().info().unwrap().best_number, 0); + assert_eq!(net.peer(0).client.info().unwrap().chain.best_number, 1); + assert_eq!(net.peer(1).client.info().unwrap().chain.best_number, 1); + assert_eq!(net.peer(2).client.info().unwrap().chain.best_number, 0); } #[test] @@ -411,3 +399,56 @@ fn can_sync_small_non_best_forks() { assert!(net.peer(0).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); assert!(net.peer(1).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); } + +#[test] +fn can_not_sync_from_light_peer() { + let _ = ::env_logger::try_init(); + + // given the network with 1 full nodes (#0) and 1 light node (#1) + let mut net = TestNet::new(1); + net.add_light_peer(&Default::default()); + + // generate some blocks on #0 + net.peer(0).push_blocks(1, false); + + // and let the light client sync from this node + // (mind the #1 is disconnected && not syncing) + net.sync(); + + // ensure #0 && #1 have the same best block + let full0_info = net.peer(0).client.info().unwrap().chain; + let light_info = net.peer(1).client.info().unwrap().chain; + assert_eq!(full0_info.best_number, 1); + assert_eq!(light_info.best_number, 1); + assert_eq!(light_info.best_hash, full0_info.best_hash); + + // add new full client (#2) && sync without #0 + net.add_full_peer(&Default::default()); + net.peer(1).on_connect(net.peer(2)); + net.peer(2).on_connect(net.peer(1)); + net.peer(1).announce_block(light_info.best_hash); + net.sync_with(true, Some(vec![0].into_iter().collect())); + + // ensure that the #2 has failed to sync block #1 + assert_eq!(net.peer(2).client.info().unwrap().chain.best_number, 0); + // and that the #1 is still connected to #2 + // (because #2 has not tried to fetch block data from the #1 light node) + assert_eq!(net.peer(1).protocol_status().num_peers, 2); + + // and now try to fetch block data from light peer #1 + // (this should result in disconnect) + net.peer(1).receive_message( + &net.peer(2).peer_id, + message::generic::Message::BlockRequest(message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::HEADER, + from: message::FromBlock::Hash(light_info.best_hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }), + ); + net.sync(); + // check that light #1 has disconnected from #2 + assert_eq!(net.peer(1).protocol_status().num_peers, 1); +} diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 5fa0fab419fcd6d6af2f5fa89adde6553cd75efc..241edfea9f4d1e8e108463fb748152f79a043009 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers" name = "substrate-offchain" -version = "0.1.0" +version = "2.0.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/offchain/primitives/Cargo.toml b/core/offchain/primitives/Cargo.toml index 4d10e08f92dd603176b18fc5bc554fe909ae76a6..a081f681b621cd754fe83be33a8008b951037534 100644 --- a/core/offchain/primitives/Cargo.toml +++ b/core/offchain/primitives/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers primitives" name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/panic-handler/Cargo.toml b/core/panic-handler/Cargo.toml index 10b80cc9b7ff6dfb200a8ce9b7fc48edc4b9056e..054bd643ac3e6adee588e176ccf243c6e6c854f4 100644 --- a/core/panic-handler/Cargo.toml +++ b/core/panic-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate panic handler." edition = "2018" diff --git a/core/peerset/Cargo.toml b/core/peerset/Cargo.toml index 1b505682d85cc203eb50cbbff1fd6d6aee67259f..d878485203d4a4b10293c72f794fde498dcff467 100644 --- a/core/peerset/Cargo.toml +++ b/core/peerset/Cargo.toml @@ -3,14 +3,18 @@ description = "Connectivity manager based on reputation" homepage = "http://parity.io" license = "GPL-3.0" name = "substrate-peerset" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] futures = "0.1" -libp2p = { version = "0.6.0", default-features = false } +libp2p = { version = "0.8.1", default-features = false } linked-hash-map = "0.5" log = "0.4" lru-cache = "0.1.2" serde_json = "1.0.24" + +[dev-dependencies] +rand = "0.6" +tokio = "0.1" diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index 10677b859aeca958a755b8c8d910eeb83faa96e5..9b5155455a66ab70513d84b7e215051a8fa4ce40 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -17,33 +17,18 @@ //! Peer Set Manager (PSM). Contains the strategy for choosing which nodes the network should be //! connected to. -mod slots; +mod peersstate; -use std::collections::VecDeque; +use std::{collections::HashMap, collections::VecDeque, time::Instant}; use futures::{prelude::*, sync::mpsc, try_ready}; use libp2p::PeerId; -use log::trace; -use lru_cache::LruCache; -use slots::{SlotType, SlotState, Slots}; -pub use serde_json::Value; +use log::{debug, error, trace}; +use serde_json::json; -const PEERSET_SCORES_CACHE_SIZE: usize = 1000; -const DISCOVERED_NODES_LIMIT: u32 = 1000; - -#[derive(Debug)] -struct PeersetData { - /// List of nodes that we know exist, but we are not connected to. - /// Elements in this list must never be in `out_slots` or `in_slots`. - discovered: Slots, - /// If true, we only accept reserved nodes. - reserved_only: bool, - /// Node slots for outgoing connections. - out_slots: Slots, - /// Node slots for incoming connections. - in_slots: Slots, - /// List of node scores. - scores: LruCache, -} +/// We don't accept nodes whose reputation is under this value. +const BANNED_THRESHOLD: i32 = 82 * (i32::min_value() / 100); +/// Reputation change for a node when we get disconnected from it. +const DISCONNECT_REPUTATION_CHANGE: i32 = -10; #[derive(Debug)] enum Action { @@ -107,7 +92,7 @@ pub enum Message { } /// Opaque identifier for an incoming connection. Allocated by the network. -#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct IncomingIndex(pub u64); impl From for IncomingIndex { @@ -147,9 +132,15 @@ pub struct PeersetConfig { /// errors. #[derive(Debug)] pub struct Peerset { - data: PeersetData, + data: peersstate::PeersState, + /// If true, we only accept reserved nodes. + reserved_only: bool, rx: mpsc::UnboundedReceiver, message_queue: VecDeque, + /// When the `Peerset` was created. + created: Instant, + /// Last time when we updated the reputations of connected nodes. + latest_time_update: Instant, } impl Peerset { @@ -157,30 +148,33 @@ impl Peerset { pub fn from_config(config: PeersetConfig) -> (Peerset, PeersetHandle) { let (tx, rx) = mpsc::unbounded(); - let data = PeersetData { - discovered: Slots::new(DISCOVERED_NODES_LIMIT), - reserved_only: config.reserved_only, - out_slots: Slots::new(config.out_peers), - in_slots: Slots::new(config.in_peers), - scores: LruCache::new(PEERSET_SCORES_CACHE_SIZE), - }; - let handle = PeersetHandle { tx, }; let mut peerset = Peerset { - data, + data: peersstate::PeersState::new(config.in_peers, config.out_peers), rx, + reserved_only: config.reserved_only, message_queue: VecDeque::new(), + created: Instant::now(), + latest_time_update: Instant::now(), }; for peer_id in config.reserved_nodes { - peerset.data.discovered.add_peer(peer_id, SlotType::Reserved); + if let peersstate::Peer::Unknown(entry) = peerset.data.peer(&peer_id) { + entry.discover().set_reserved(true); + } else { + debug!(target: "peerset", "Duplicate reserved node in config: {:?}", peer_id); + } } for peer_id in config.bootnodes { - peerset.data.discovered.add_peer(peer_id, SlotType::Common); + if let peersstate::Peer::Unknown(entry) = peerset.data.peer(&peer_id) { + entry.discover(); + } else { + debug!(target: "peerset", "Duplicate bootnode in config: {:?}", peer_id); + } } peerset.alloc_slots(); @@ -188,115 +182,142 @@ impl Peerset { } fn on_add_reserved_peer(&mut self, peer_id: PeerId) { - // Nothing more to do if we're already connected. - if self.data.in_slots.contains(&peer_id) { - self.data.in_slots.mark_reserved(&peer_id); - return; - } - - match self.data.out_slots.add_peer(peer_id, SlotType::Reserved) { - SlotState::Added(peer_id) => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&peer_id); - - // notify that connection has been made - trace!(target: "peerset", "Connecting to new reserved peer {}", peer_id); - self.message_queue.push_back(Message::Connect(peer_id)); - return; - }, - SlotState::Swaped { removed, added } => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&added); - // let's add the peer we disconnected from to the discovered list again - self.data.discovered.add_peer(removed.clone(), SlotType::Common); - // swap connections - trace!(target: "peerset", "Connecting to new reserved peer {}, dropping {}", added, removed); - self.message_queue.push_back(Message::Drop(removed)); - self.message_queue.push_back(Message::Connect(added)); - } - SlotState::AlreadyExists(_) | SlotState::Upgraded(_) => { - return; - } - SlotState::MaxCapacity(peer_id) => { - self.data.discovered.add_peer(peer_id, SlotType::Reserved); - return; + let mut entry = match self.data.peer(&peer_id) { + peersstate::Peer::Connected(mut connected) => { + connected.set_reserved(true); + return } - } + peersstate::Peer::NotConnected(entry) => entry, + peersstate::Peer::Unknown(entry) => entry.discover(), + }; + + // We reach this point if and only if we were not connected to the node. + entry.set_reserved(true); + entry.force_outgoing(); + self.message_queue.push_back(Message::Connect(peer_id)); } fn on_remove_reserved_peer(&mut self, peer_id: PeerId) { - self.data.in_slots.mark_not_reserved(&peer_id); - self.data.out_slots.mark_not_reserved(&peer_id); - self.data.discovered.mark_not_reserved(&peer_id); - if self.data.reserved_only { - if self.data.in_slots.remove_peer(&peer_id) || self.data.out_slots.remove_peer(&peer_id) { - // insert peer back into discovered list - self.data.discovered.add_peer(peer_id.clone(), SlotType::Common); - self.message_queue.push_back(Message::Drop(peer_id)); - // call alloc_slots again, cause we may have some reserved peers in discovered list - // waiting for the slot that was just cleared - self.alloc_slots(); + match self.data.peer(&peer_id) { + peersstate::Peer::Connected(mut peer) => { + peer.set_reserved(false); + if self.reserved_only { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } } + peersstate::Peer::NotConnected(mut peer) => peer.set_reserved(false), + peersstate::Peer::Unknown(_) => {} } } fn on_set_reserved_only(&mut self, reserved_only: bool) { // Disconnect non-reserved nodes. - self.data.reserved_only = reserved_only; - if self.data.reserved_only { - for peer_id in self.data.in_slots.clear_common_slots().into_iter().chain(self.data.out_slots.clear_common_slots().into_iter()) { - // insert peer back into discovered list - self.data.discovered.add_peer(peer_id.clone(), SlotType::Common); - self.message_queue.push_back(Message::Drop(peer_id)); + self.reserved_only = reserved_only; + if self.reserved_only { + for peer_id in self.data.connected_peers().cloned().collect::>().into_iter() { + let peer = self.data.peer(&peer_id).into_connected() + .expect("We are enumerating connected peers, therefore the peer is connected; qed"); + if !peer.is_reserved() { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } } + } else { self.alloc_slots(); } } fn on_report_peer(&mut self, peer_id: PeerId, score_diff: i32) { - let score = match self.data.scores.get_mut(&peer_id) { - Some(score) => { - *score = score.saturating_add(score_diff); - *score + // We want reputations to be up-to-date before adjusting them. + self.update_time(); + + match self.data.peer(&peer_id) { + peersstate::Peer::Connected(mut peer) => { + peer.add_reputation(score_diff); + if peer.reputation() < BANNED_THRESHOLD { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } }, - None => { - self.data.scores.insert(peer_id.clone(), score_diff); - score_diff - } + peersstate::Peer::NotConnected(mut peer) => peer.add_reputation(score_diff), + peersstate::Peer::Unknown(peer) => peer.discover().add_reputation(score_diff), + } + } + + /// Updates the value of `self.latest_time_update` and performs all the updates that happen + /// over time, such as reputation increases for staying connected. + fn update_time(&mut self) { + // We basically do `(now - self.latest_update).as_secs()`, except that by the way we do it + // we know that we're not going to miss seconds because of rounding to integers. + let secs_diff = { + let now = Instant::now(); + let elapsed_latest = self.latest_time_update - self.created; + let elapsed_now = now - self.created; + self.latest_time_update = now; + elapsed_now.as_secs() - elapsed_latest.as_secs() }; - if score < 0 { - // peer will be removed from `in_slots` or `out_slots` in `on_dropped` method - if self.data.in_slots.contains(&peer_id) || self.data.out_slots.contains(&peer_id) { - self.data.in_slots.remove_peer(&peer_id); - self.data.out_slots.remove_peer(&peer_id); - self.message_queue.push_back(Message::Drop(peer_id)); + // For each elapsed second, move the node reputation towards zero. + // If we multiply each second the reputation by `k` (where `k` is between 0 and 1), it + // takes `ln(0.5) / ln(k)` seconds to reduce the reputation by half. Use this formula to + // empirically determine a value of `k` that looks correct. + for _ in 0..secs_diff { + for peer in self.data.peers().cloned().collect::>() { + // We use `k = 0.98`, so we divide by `50`. With that value, it takes 34.3 seconds + // to reduce the reputation by half. + fn reput_tick(reput: i32) -> i32 { + let mut diff = reput / 50; + if diff == 0 && reput < 0 { + diff = -1; + } else if diff == 0 && reput > 0 { + diff = 1; + } + reput.saturating_sub(diff) + } + match self.data.peer(&peer) { + peersstate::Peer::Connected(mut peer) => + peer.set_reputation(reput_tick(peer.reputation())), + peersstate::Peer::NotConnected(mut peer) => + peer.set_reputation(reput_tick(peer.reputation())), + peersstate::Peer::Unknown(_) => unreachable!("We iterate over known peers; qed") + } } } } + /// Try to fill available out slots with nodes. fn alloc_slots(&mut self) { - while let Some((peer_id, slot_type)) = self.data.discovered.pop_most_important_peer(self.data.reserved_only) { - match self.data.out_slots.add_peer(peer_id, slot_type) { - SlotState::Added(peer_id) => { - trace!(target: "peerset", "Connecting to new peer {}", peer_id); - self.message_queue.push_back(Message::Connect(peer_id)); - }, - SlotState::Swaped { removed, added } => { - // insert peer back into discovered list - trace!(target: "peerset", "Connecting to new peer {}, dropping {}", added, removed); - self.data.discovered.add_peer(removed.clone(), SlotType::Common); - self.message_queue.push_back(Message::Drop(removed)); - self.message_queue.push_back(Message::Connect(added)); - } - SlotState::Upgraded(_) | SlotState::AlreadyExists(_) => { - // TODO: we should never reach this point - }, - SlotState::MaxCapacity(peer_id) => { - self.data.discovered.add_peer(peer_id, slot_type); - break; - }, + self.update_time(); + + // Try to grab the next node to attempt to connect to. + while let Some(next) = self.data.reserved_not_connected_peer() { + match next.try_outgoing() { + Ok(conn) => self.message_queue.push_back(Message::Connect(conn.into_peer_id())), + Err(_) => break, // No more slots available. + } + } + + loop { + if self.reserved_only { + break + } + + // Try to grab the next node to attempt to connect to. + let next = match self.data.highest_not_connected_peer() { + Some(p) => p, + None => break, // No known node to add. + }; + + // Don't connect to nodes with an abysmal reputation. + if next.reputation() < BANNED_THRESHOLD { + break; + } + + match next.try_outgoing() { + Ok(conn) => self.message_queue.push_back(Message::Connect(conn.into_peer_id())), + Err(_) => break, // No more slots available. } } } @@ -305,60 +326,31 @@ impl Peerset { /// a corresponding `Accept` or `Reject`, except if we were already connected to this peer. /// /// Note that this mechanism is orthogonal to `Connect`/`Drop`. Accepting an incoming - /// connection implicitely means `Accept`, but incoming connections aren't cancelled by + /// connection implicitely means `Connect`, but incoming connections aren't cancelled by /// `dropped`. /// - /// Because of concurrency issues, it is acceptable to call `incoming` with a `PeerId` the - /// peerset is already connected to, in which case it must not answer. + // Implementation note: because of concurrency issues, it is possible that we push a `Connect` + // message to the output channel with a `PeerId`, and that `incoming` gets called with the same + // `PeerId` before that message has been read by the user. In this situation we must not answer. pub fn incoming(&mut self, peer_id: PeerId, index: IncomingIndex) { - trace!( - target: "peerset", - "Incoming {:?}\nin_slots={:?}\nout_slots={:?}", - peer_id, self.data.in_slots, self.data.out_slots - ); - // if `reserved_only` is set, but this peer is not a part of our discovered list, - // a) it is not reserved, so we reject the connection - // b) we are already connected to it, so we reject the connection - if self.data.reserved_only && !self.data.discovered.is_reserved(&peer_id) { - self.message_queue.push_back(Message::Reject(index)); - return; - } + trace!(target: "peerset", "Incoming {:?}", peer_id); + self.update_time(); + + let not_connected = match self.data.peer(&peer_id) { + // If we're already connected, don't answer, as the docs mention. + peersstate::Peer::Connected(_) => return, + peersstate::Peer::NotConnected(entry) => entry, + peersstate::Peer::Unknown(entry) => entry.discover(), + }; - // check if we are already connected to this peer - if self.data.out_slots.contains(&peer_id) { - // we are already connected. in this case we do not answer - return; + if not_connected.reputation() < BANNED_THRESHOLD { + self.message_queue.push_back(Message::Reject(index)); + return } - let slot_type = if self.data.reserved_only { - SlotType::Reserved - } else { - SlotType::Common - }; - - match self.data.in_slots.add_peer(peer_id, slot_type) { - SlotState::Added(peer_id) => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&peer_id); - self.message_queue.push_back(Message::Accept(index)); - return; - }, - SlotState::Swaped { removed, added } => { - // reserved node may have been previously stored as normal node in discovered list - self.data.discovered.remove_peer(&added); - // swap connections. - self.message_queue.push_back(Message::Drop(removed)); - self.message_queue.push_back(Message::Accept(index)); - }, - SlotState::AlreadyExists(_) | SlotState::Upgraded(_) => { - // we are already connected. in this case we do not answer - return; - }, - SlotState::MaxCapacity(peer_id) => { - self.data.discovered.add_peer(peer_id, slot_type); - self.message_queue.push_back(Message::Reject(index)); - return; - }, + match not_connected.try_accept_incoming() { + Ok(_) => self.message_queue.push_back(Message::Accept(index)), + Err(_) => self.message_queue.push_back(Message::Reject(index)), } } @@ -367,24 +359,21 @@ impl Peerset { /// Must only be called after the PSM has either generated a `Connect` message with this /// `PeerId`, or accepted an incoming connection with this `PeerId`. pub fn dropped(&mut self, peer_id: PeerId) { - trace!( - target: "peerset", - "Dropping {:?}\nin_slots={:?}\nout_slots={:?}", - peer_id, self.data.in_slots, self.data.out_slots - ); - // Automatically connect back if reserved. - if self.data.in_slots.is_reserved(&peer_id) || self.data.out_slots.is_reserved(&peer_id) { - self.message_queue.push_back(Message::Connect(peer_id)); - return; - } + trace!(target: "peerset", "Dropping {:?}", peer_id); - // Otherwise, free the slot. - self.data.in_slots.remove_peer(&peer_id); - self.data.out_slots.remove_peer(&peer_id); + // We want reputations to be up-to-date before adjusting them. + self.update_time(); + + match self.data.peer(&peer_id) { + peersstate::Peer::Connected(mut entry) => { + // Decrease the node's reputation so that we don't try it again and again and again. + entry.add_reputation(DISCONNECT_REPUTATION_CHANGE); + entry.disconnect(); + } + peersstate::Peer::NotConnected(_) | peersstate::Peer::Unknown(_) => + error!(target: "peerset", "Received dropped() for non-connected node"), + } - // Note: in this dummy implementation we consider that peers never expire. As soon as we - // are disconnected from a peer, we try again. - self.data.discovered.add_peer(peer_id, SlotType::Common); self.alloc_slots(); } @@ -393,21 +382,44 @@ impl Peerset { /// > **Note**: There is no equivalent "expired" message, meaning that it is the responsibility /// > of the PSM to remove `PeerId`s that fail to dial too often. pub fn discovered>(&mut self, peer_ids: I) { + let mut discovered_any = false; + for peer_id in peer_ids { - if !self.data.in_slots.contains(&peer_id) && !self.data.out_slots.contains(&peer_id) && !self.data.discovered.contains(&peer_id) { - trace!(target: "peerset", "Discovered new peer: {:?}", peer_id); - self.data.discovered.add_peer(peer_id, SlotType::Common); - } else { - trace!(target: "peerset", "Discovered known peer: {:?}", peer_id); + if let peersstate::Peer::Unknown(entry) = self.data.peer(&peer_id) { + entry.discover(); + discovered_any = true; } } - self.alloc_slots(); + if discovered_any { + self.alloc_slots(); + } } /// Produces a JSON object containing the state of the peerset manager, for debugging purposes. - pub fn debug_info(&self) -> serde_json::Value { - serde_json::Value::Null + pub fn debug_info(&mut self) -> serde_json::Value { + self.update_time(); + + json!({ + "nodes": self.data.peers().cloned().collect::>().into_iter().map(|peer_id| { + let state = match self.data.peer(&peer_id) { + peersstate::Peer::Connected(entry) => json!({ + "connected": true, + "reputation": entry.reputation() + }), + peersstate::Peer::NotConnected(entry) => json!({ + "connected": false, + "reputation": entry.reputation() + }), + peersstate::Peer::Unknown(_) => + unreachable!("We iterate over the known peers; QED") + }; + + (peer_id.to_base58(), state) + }).collect::>(), + "reserved_only": self.reserved_only, + "message_queue": self.message_queue.len(), + }) } } @@ -437,7 +449,8 @@ impl Stream for Peerset { mod tests { use libp2p::PeerId; use futures::prelude::*; - use super::{PeersetConfig, Peerset, Message, IncomingIndex}; + use super::{PeersetConfig, Peerset, Message, IncomingIndex, BANNED_THRESHOLD}; + use std::{thread, time::Duration}; fn assert_messages(mut peerset: Peerset, messages: Vec) -> Peerset { for expected_message in messages { @@ -445,7 +458,7 @@ mod tests { assert_eq!(message, expected_message); peerset = p; } - assert!(peerset.message_queue.is_empty()); + assert!(peerset.message_queue.is_empty(), peerset.message_queue); peerset } @@ -457,49 +470,6 @@ mod tests { Ok((message, peerset)) } - #[test] - fn test_peerset_from_config_with_bootnodes() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 2, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: Vec::new(), - }; - - let (peerset, _handle) = Peerset::from_config(config); - - assert_messages(peerset, vec![ - Message::Connect(bootnode), - Message::Connect(bootnode2), - ]); - } - - #[test] - fn test_peerset_from_config_with_reserved_nodes() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 3, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone(), reserved_peer2.clone()], - }; - - let (peerset, _handle) = Peerset::from_config(config); - - assert_messages(peerset, vec![ - Message::Connect(reserved_peer), - Message::Connect(reserved_peer2), - Message::Connect(bootnode) - ]); - } - #[test] fn test_peerset_add_reserved_peer() { let bootnode = PeerId::random(); @@ -523,87 +493,6 @@ mod tests { ]); } - #[test] - fn test_peerset_remove_reserved_peer() { - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 2, - bootnodes: vec![], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone(), reserved_peer2.clone()], - }; - - let (peerset, handle) = Peerset::from_config(config); - handle.remove_reserved_peer(reserved_peer.clone()); - - let peerset = assert_messages(peerset, vec![ - Message::Connect(reserved_peer.clone()), - Message::Connect(reserved_peer2.clone()), - ]); - - handle.set_reserved_only(true); - handle.remove_reserved_peer(reserved_peer2.clone()); - - assert_messages(peerset, vec![ - Message::Drop(reserved_peer), - Message::Drop(reserved_peer2), - ]); - } - - #[test] - fn test_peerset_set_reserved_only() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 4, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone(), reserved_peer2.clone()], - }; - - let (peerset, handle) = Peerset::from_config(config); - handle.set_reserved_only(true); - handle.set_reserved_only(false); - - assert_messages(peerset, vec![ - Message::Connect(reserved_peer), - Message::Connect(reserved_peer2), - Message::Connect(bootnode.clone()), - Message::Connect(bootnode2.clone()), - Message::Drop(bootnode.clone()), - Message::Drop(bootnode2.clone()), - Message::Connect(bootnode), - Message::Connect(bootnode2), - ]); - } - - #[test] - fn test_peerset_report_peer() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 1, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: Vec::new(), - }; - - let (peerset, handle) = Peerset::from_config(config); - handle.report_peer(bootnode2, -1); - handle.report_peer(bootnode.clone(), -1); - - assert_messages(peerset, vec![ - Message::Connect(bootnode.clone()), - Message::Drop(bootnode) - ]); - } - #[test] fn test_peerset_incoming() { let bootnode = PeerId::random(); @@ -636,35 +525,6 @@ mod tests { ]); } - #[test] - fn test_peerset_dropped() { - let bootnode = PeerId::random(); - let bootnode2 = PeerId::random(); - let reserved_peer = PeerId::random(); - let config = PeersetConfig { - in_peers: 0, - out_peers: 2, - bootnodes: vec![bootnode.clone(), bootnode2.clone()], - reserved_only: false, - reserved_nodes: vec![reserved_peer.clone()], - }; - - let (peerset, _handle) = Peerset::from_config(config); - - let mut peerset = assert_messages(peerset, vec![ - Message::Connect(reserved_peer.clone()), - Message::Connect(bootnode.clone()), - ]); - - peerset.dropped(reserved_peer.clone()); - peerset.dropped(bootnode); - - let _peerset = assert_messages(peerset, vec![ - Message::Connect(reserved_peer), - Message::Connect(bootnode2), - ]); - } - #[test] fn test_peerset_discovered() { let bootnode = PeerId::random(); @@ -688,4 +548,45 @@ mod tests { Message::Connect(discovered), ]); } + + #[test] + fn test_peerset_banned() { + let (mut peerset, handle) = Peerset::from_config(PeersetConfig { + in_peers: 25, + out_peers: 25, + bootnodes: vec![], + reserved_only: false, + reserved_nodes: vec![], + }); + + // We ban a node by setting its reputation under the threshold. + let peer_id = PeerId::random(); + handle.report_peer(peer_id.clone(), BANNED_THRESHOLD - 1); + + let fut = futures::future::poll_fn(move || -> Result<_, ()> { + // We need one polling for the message to be processed. + assert_eq!(peerset.poll().unwrap(), Async::NotReady); + + // Check that an incoming connection from that node gets refused. + peerset.incoming(peer_id.clone(), IncomingIndex(1)); + if let Async::Ready(msg) = peerset.poll().unwrap() { + assert_eq!(msg.unwrap(), Message::Reject(IncomingIndex(1))); + } else { + panic!() + } + + // Wait a bit for the node's reputation to go above the threshold. + thread::sleep(Duration::from_millis(1500)); + + // Try again. This time the node should be accepted. + peerset.incoming(peer_id.clone(), IncomingIndex(2)); + while let Async::Ready(msg) = peerset.poll().unwrap() { + assert_eq!(msg.unwrap(), Message::Accept(IncomingIndex(2))); + } + + Ok(Async::Ready(())) + }); + + tokio::runtime::current_thread::Runtime::new().unwrap().block_on(fut).unwrap(); + } } diff --git a/core/peerset/src/peersstate.rs b/core/peerset/src/peersstate.rs new file mode 100644 index 0000000000000000000000000000000000000000..a6a375b36943fca03d34495ef1794855079fd6a3 --- /dev/null +++ b/core/peerset/src/peersstate.rs @@ -0,0 +1,614 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Contains the state storage behind the peerset. + +use libp2p::PeerId; +use std::{borrow::Cow, collections::HashMap}; + +/// State storage behind the peerset. +/// +/// # Usage +/// +/// This struct is nothing more but a data structure containing a list of nodes, where each node +/// has a reputation and is either connected to us or not. +/// +#[derive(Debug, Clone)] +pub struct PeersState { + /// List of nodes that we know about. + /// + /// > **Note**: This list should really be ordered by decreasing reputation, so that we can + /// easily select the best node to connect to. As a first draft, however, we don't + /// sort, to make the logic easier. + nodes: HashMap, + + /// Number of non-reserved nodes for which the `ConnectionState` is `In`. + num_in: u32, + + /// Number of non-reserved nodes for which the `ConnectionState` is `In`. + num_out: u32, + + /// Maximum allowed number of non-reserved nodes for which the `ConnectionState` is `In`. + max_in: u32, + + /// Maximum allowed number of non-reserved nodes for which the `ConnectionState` is `Out`. + max_out: u32, +} + +/// State of a single node that we know about. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +struct Node { + /// Whether we are connected to this node. + connection_state: ConnectionState, + + /// If true, this node is reserved and should always be connected to. + reserved: bool, + + /// Reputation value of the node, between `i32::min_value` (we hate that node) and + /// `i32::max_value` (we love that node). + reputation: i32, +} + +/// Whether we are connected to a node. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +enum ConnectionState { + /// We are connected through an ingoing connection. + In, + /// We are connected through an outgoing connection. + Out, + /// We are not connected to this node. + NotConnected, +} + +impl ConnectionState { + /// Returns `true` for `In` and `Out`. + fn is_connected(self) -> bool { + match self { + ConnectionState::In => true, + ConnectionState::Out => true, + ConnectionState::NotConnected => false, + } + } +} + +impl PeersState { + /// Builds a new empty `PeersState`. + pub fn new(in_peers: u32, out_peers: u32) -> Self { + PeersState { + nodes: HashMap::new(), + num_in: 0, + num_out: 0, + max_in: in_peers, + max_out: out_peers, + } + } + + /// Returns an object that grants access to the state of a peer. + pub fn peer<'a>(&'a mut self, peer_id: &'a PeerId) -> Peer<'a> { + // Note: the Rust borrow checker still has some issues. In particular, we can't put this + // block as an `else` below (as the obvious solution would be here), or it will complain + // that we borrow `self` while it is already borrowed. + if !self.nodes.contains_key(peer_id) { + return Peer::Unknown(UnknownPeer { + parent: self, + peer_id: Cow::Borrowed(peer_id), + }); + } + + let state = self.nodes.get_mut(peer_id) + .expect("We check that the value is present right above; QED"); + + if state.connection_state.is_connected() { + Peer::Connected(ConnectedPeer { + state, + peer_id: Cow::Borrowed(peer_id), + num_in: &mut self.num_in, + num_out: &mut self.num_out, + max_in: self.max_in, + max_out: self.max_out, + }) + } else { + Peer::NotConnected(NotConnectedPeer { + state, + peer_id: Cow::Borrowed(peer_id), + num_in: &mut self.num_in, + num_out: &mut self.num_out, + max_in: self.max_in, + max_out: self.max_out, + }) + } + } + + /// Returns the list of all the peers we know of. + // Note: this method could theoretically return a `Peer`, but implementing that + // isn't simple. + pub fn peers(&self) -> impl Iterator { + self.nodes.keys() + } + + /// Returns the list of peers we are connected to. + // Note: this method could theoretically return a `ConnectedPeer`, but implementing that + // isn't simple. + pub fn connected_peers(&self) -> impl Iterator { + self.nodes.iter() + .filter(|(_, p)| p.connection_state.is_connected()) + .map(|(p, _)| p) + } + + /// Returns the first reserved peer that we are not connected to. + /// + /// If multiple nodes are reserved, which one is returned is unspecified. + pub fn reserved_not_connected_peer(&mut self) -> Option { + let outcome = self.nodes.iter_mut() + .find(|(_, &mut Node { connection_state, reserved, .. })| { + reserved && !connection_state.is_connected() + }) + .map(|(peer_id, node)| (peer_id.clone(), node)); + + if let Some((peer_id, state)) = outcome { + Some(NotConnectedPeer { + state, + peer_id: Cow::Owned(peer_id), + num_in: &mut self.num_in, + num_out: &mut self.num_out, + max_in: self.max_in, + max_out: self.max_out, + }) + } else { + None + } + } + + /// Returns the peer with the highest reputation and that we are not connected to. + /// + /// If multiple nodes have the same reputation, which one is returned is unspecified. + pub fn highest_not_connected_peer(&mut self) -> Option { + let outcome = self.nodes + .iter_mut() + .filter(|(_, Node { connection_state, .. })| !connection_state.is_connected()) + .fold(None::<(&PeerId, &mut Node)>, |mut cur_node, to_try| { + if let Some(cur_node) = cur_node.take() { + if cur_node.1.reputation >= to_try.1.reputation { + return Some(cur_node); + } + } + Some(to_try) + }) + .map(|(peer_id, state)| (peer_id.clone(), state)); + + if let Some((peer_id, state)) = outcome { + Some(NotConnectedPeer { + state, + peer_id: Cow::Owned(peer_id), + num_in: &mut self.num_in, + num_out: &mut self.num_out, + max_in: self.max_in, + max_out: self.max_out, + }) + } else { + None + } + } +} + +/// Grants access to the state of a peer in the `PeersState`. +pub enum Peer<'a> { + /// We are connected to this node. + Connected(ConnectedPeer<'a>), + /// We are not connected to this node. + NotConnected(NotConnectedPeer<'a>), + /// We have never heard of this node. + Unknown(UnknownPeer<'a>), +} + +impl<'a> Peer<'a> { + /// If we are the `Connected` variant, returns the inner `ConnectedPeer`. Returns `None` + /// otherwise. + pub fn into_connected(self) -> Option> { + match self { + Peer::Connected(peer) => Some(peer), + Peer::NotConnected(_) => None, + Peer::Unknown(_) => None, + } + } + + /// If we are the `Unknown` variant, returns the inner `ConnectedPeer`. Returns `None` + /// otherwise. + #[cfg(test)] // Feel free to remove this if this function is needed outside of tests + pub fn into_not_connected(self) -> Option> { + match self { + Peer::Connected(_) => None, + Peer::NotConnected(peer) => Some(peer), + Peer::Unknown(_) => None, + } + } + + /// If we are the `Unknown` variant, returns the inner `ConnectedPeer`. Returns `None` + /// otherwise. + #[cfg(test)] // Feel free to remove this if this function is needed outside of tests + pub fn into_unknown(self) -> Option> { + match self { + Peer::Connected(_) => None, + Peer::NotConnected(_) => None, + Peer::Unknown(peer) => Some(peer), + } + } +} + +/// A peer that is connected to us. +pub struct ConnectedPeer<'a> { + state: &'a mut Node, + peer_id: Cow<'a, PeerId>, + num_in: &'a mut u32, + num_out: &'a mut u32, + max_in: u32, + max_out: u32, +} + +impl<'a> ConnectedPeer<'a> { + /// Destroys this `ConnectedPeer` and returns the `PeerId` inside of it. + pub fn into_peer_id(self) -> PeerId { + self.peer_id.into_owned() + } + + /// Switches the peer to "not connected". + pub fn disconnect(self) -> NotConnectedPeer<'a> { + let connec_state = &mut self.state.connection_state; + + if !self.state.reserved { + match *connec_state { + ConnectionState::In => *self.num_in -= 1, + ConnectionState::Out => *self.num_out -= 1, + ConnectionState::NotConnected => + debug_assert!(false, "State inconsistency: disconnecting a disconnected node") + } + } + + *connec_state = ConnectionState::NotConnected; + + NotConnectedPeer { + state: self.state, + peer_id: self.peer_id, + num_in: self.num_in, + num_out: self.num_out, + max_in: self.max_in, + max_out: self.max_out, + } + } + + /// Sets whether or not the node is reserved. + pub fn set_reserved(&mut self, reserved: bool) { + if reserved == self.state.reserved { + return; + } + + if reserved { + self.state.reserved = true; + match self.state.connection_state { + ConnectionState::In => *self.num_in -= 1, + ConnectionState::Out => *self.num_out -= 1, + ConnectionState::NotConnected => debug_assert!(false, "State inconsistency: \ + connected node is in fact not connected"), + } + + } else { + self.state.reserved = false; + match self.state.connection_state { + ConnectionState::In => *self.num_in += 1, + ConnectionState::Out => *self.num_out += 1, + ConnectionState::NotConnected => debug_assert!(false, "State inconsistency: \ + connected node is in fact not connected"), + } + } + } + + /// Returns whether or not the node is reserved. + pub fn is_reserved(&self) -> bool { + self.state.reserved + } + + /// Returns the reputation value of the node. + pub fn reputation(&self) -> i32 { + self.state.reputation + } + + /// Sets the reputation of the peer. + pub fn set_reputation(&mut self, value: i32) { + self.state.reputation = value; + } + + /// Performs an arithmetic addition on the reputation score of that peer. + /// + /// In case of overflow, the value will be capped. + pub fn add_reputation(&mut self, modifier: i32) { + let reputation = &mut self.state.reputation; + *reputation = reputation.saturating_add(modifier); + } +} + +/// A peer that is not connected to us. +pub struct NotConnectedPeer<'a> { + state: &'a mut Node, + peer_id: Cow<'a, PeerId>, + num_in: &'a mut u32, + num_out: &'a mut u32, + max_in: u32, + max_out: u32, +} + +impl<'a> NotConnectedPeer<'a> { + /// Destroys this `NotConnectedPeer` and returns the `PeerId` inside of it. + #[cfg(test)] // Feel free to remove this if this function is needed outside of tests + pub fn into_peer_id(self) -> PeerId { + self.peer_id.into_owned() + } + + /// Tries to set the peer as connected as an outgoing connection. + /// + /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If + /// the slots are full, the node stays "not connected" and we return `Err`. + /// If the node is reserved, this method always succeeds. + /// + /// Note that reserved nodes don't count towards the number of slots. + pub fn try_outgoing(self) -> Result, NotConnectedPeer<'a>> { + if self.is_reserved() { + return Ok(self.force_outgoing()) + } + + // Note that it is possible for num_out to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved, or if the user used + // `force_outgoing`. + if *self.num_out >= self.max_out { + return Err(self); + } + + Ok(self.force_outgoing()) + } + + /// Sets the peer as connected as an outgoing connection. + pub fn force_outgoing(self) -> ConnectedPeer<'a> { + let connec_state = &mut self.state.connection_state; + debug_assert!(!connec_state.is_connected()); + *connec_state = ConnectionState::Out; + + if !self.state.reserved { + *self.num_out += 1; + } + + ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + num_in: self.num_in, + num_out: self.num_out, + max_in: self.max_in, + max_out: self.max_out, + } + } + + /// Tries to accept the peer as an incoming connection. + /// + /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If + /// the slots are full, the node stays "not connected" and we return `Err`. + /// + /// Note that reserved nodes don't count towards the number of slots. + pub fn try_accept_incoming(self) -> Result, NotConnectedPeer<'a>> { + if self.is_reserved() { + return Ok(self.force_ingoing()) + } + + // Note that it is possible for num_in to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved. + if *self.num_in >= self.max_in { + return Err(self); + } + + Ok(self.force_ingoing()) + } + + /// Sets the peer as connected as an ingoing connection. + pub fn force_ingoing(self) -> ConnectedPeer<'a> { + let connec_state = &mut self.state.connection_state; + debug_assert!(!connec_state.is_connected()); + *connec_state = ConnectionState::In; + + if !self.state.reserved { + *self.num_in += 1; + } + + ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + num_in: self.num_in, + num_out: self.num_out, + max_in: self.max_in, + max_out: self.max_out, + } + } + + /// Sets whether or not the node is reserved. + pub fn set_reserved(&mut self, reserved: bool) { + self.state.reserved = reserved; + } + + /// Returns true if the the node is reserved. + pub fn is_reserved(&self) -> bool { + self.state.reserved + } + + /// Returns the reputation value of the node. + pub fn reputation(&self) -> i32 { + self.state.reputation + } + + /// Sets the reputation of the peer. + pub fn set_reputation(&mut self, value: i32) { + self.state.reputation = value; + } + + /// Performs an arithmetic addition on the reputation score of that peer. + /// + /// In case of overflow, the value will be capped. + /// If the peer is unknown to us, we insert it and consider that it has a reputation of 0. + pub fn add_reputation(&mut self, modifier: i32) { + let reputation = &mut self.state.reputation; + *reputation = reputation.saturating_add(modifier); + } +} + +/// A peer that we have never heard of. +pub struct UnknownPeer<'a> { + parent: &'a mut PeersState, + peer_id: Cow<'a, PeerId>, +} + +impl<'a> UnknownPeer<'a> { + /// Inserts the peer identity in our list. + /// + /// The node is not reserved and starts with a reputation of 0. You can adjust these default + /// values using the `NotConnectedPeer` that this method returns. + pub fn discover(self) -> NotConnectedPeer<'a> { + self.parent.nodes.insert(self.peer_id.clone().into_owned(), Node { + connection_state: ConnectionState::NotConnected, + reputation: 0, + reserved: false, + }); + + let state = self.parent.nodes.get_mut(&self.peer_id) + .expect("We insert that key into the HashMap right above; QED"); + + NotConnectedPeer { + state, + peer_id: self.peer_id, + num_in: &mut self.parent.num_in, + num_out: &mut self.parent.num_out, + max_in: self.parent.max_in, + max_out: self.parent.max_out, + } + } +} + +#[cfg(test)] +mod tests { + use super::{PeersState, Peer}; + use libp2p::PeerId; + + #[test] + fn full_slots_in() { + let mut peers_state = PeersState::new(1, 1); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + if let Peer::Unknown(e) = peers_state.peer(&id1) { + assert!(e.discover().try_accept_incoming().is_ok()); + } + + if let Peer::Unknown(e) = peers_state.peer(&id2) { + assert!(e.discover().try_accept_incoming().is_err()); + } + } + + #[test] + fn reserved_node_doesnt_use_slot() { + let mut peers_state = PeersState::new(1, 1); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + if let Peer::Unknown(e) = peers_state.peer(&id1) { + let mut p = e.discover(); + p.set_reserved(true); + assert!(p.try_accept_incoming().is_ok()); + } else { panic!() } + + if let Peer::Unknown(e) = peers_state.peer(&id2) { + assert!(e.discover().try_accept_incoming().is_ok()); + } else { panic!() } + } + + #[test] + fn disconnecting_frees_slot() { + let mut peers_state = PeersState::new(1, 1); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + assert!(peers_state.peer(&id1).into_unknown().unwrap().discover().try_accept_incoming().is_ok()); + assert!(peers_state.peer(&id2).into_unknown().unwrap().discover().try_accept_incoming().is_err()); + peers_state.peer(&id1).into_connected().unwrap().disconnect(); + assert!(peers_state.peer(&id2).into_not_connected().unwrap().try_accept_incoming().is_ok()); + } + + #[test] + fn reserved_not_connected_peer() { + let mut peers_state = PeersState::new(25, 25); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + assert!(peers_state.reserved_not_connected_peer().is_none()); + peers_state.peer(&id1).into_unknown().unwrap().discover(); + peers_state.peer(&id2).into_unknown().unwrap().discover(); + + assert!(peers_state.reserved_not_connected_peer().is_none()); + peers_state.peer(&id1).into_not_connected().unwrap().set_reserved(true); + assert!(peers_state.reserved_not_connected_peer().is_some()); + peers_state.peer(&id2).into_not_connected().unwrap().set_reserved(true); + peers_state.peer(&id1).into_not_connected().unwrap().set_reserved(false); + assert!(peers_state.reserved_not_connected_peer().is_some()); + peers_state.peer(&id2).into_not_connected().unwrap().set_reserved(false); + assert!(peers_state.reserved_not_connected_peer().is_none()); + } + + #[test] + fn highest_not_connected_peer() { + let mut peers_state = PeersState::new(25, 25); + let id1 = PeerId::random(); + let id2 = PeerId::random(); + + assert!(peers_state.highest_not_connected_peer().is_none()); + peers_state.peer(&id1).into_unknown().unwrap().discover().set_reputation(50); + peers_state.peer(&id2).into_unknown().unwrap().discover().set_reputation(25); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); + peers_state.peer(&id2).into_not_connected().unwrap().set_reputation(75); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id2.clone())); + peers_state.peer(&id2).into_not_connected().unwrap().force_ingoing(); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); + peers_state.peer(&id1).into_not_connected().unwrap().set_reputation(100); + peers_state.peer(&id2).into_connected().unwrap().disconnect(); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); + peers_state.peer(&id1).into_not_connected().unwrap().set_reputation(-100); + assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id2.clone())); + } + + #[test] + fn disconnect_reserved_doesnt_panic() { + let mut peers_state = PeersState::new(1, 1); + let id = PeerId::random(); + let mut peer = peers_state.peer(&id).into_unknown().unwrap().discover() + .force_outgoing(); + peer.set_reserved(true); + peer.disconnect(); + } + + #[test] + fn multiple_set_reserved_calls_doesnt_panic() { + let mut peers_state = PeersState::new(1, 1); + let id = PeerId::random(); + let mut peer = peers_state.peer(&id) + .into_unknown().unwrap().discover() + .force_outgoing(); + peer.set_reserved(true); + peer.set_reserved(true); + peer.disconnect(); + } +} diff --git a/core/peerset/src/slots.rs b/core/peerset/src/slots.rs deleted file mode 100644 index 2ea9e5199bd73893affee3435e229161f1be5eab..0000000000000000000000000000000000000000 --- a/core/peerset/src/slots.rs +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// 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 Substrate. If not, see . - -use std::{fmt, mem}; -use libp2p::PeerId; -use linked_hash_map::LinkedHashMap; - -/// Describes the nature of connection with a given peer. -#[derive(Debug, PartialEq, Clone, Copy)] -pub enum SlotType { - /// Reserved peer is a peer we should always stay connected to. - Reserved, - /// Common peer is a type of peer that we stay connected to only if it's - /// useful for us. - Common, -} - -/// Descibes the result of `add_peer` action. -pub enum SlotState { - /// Returned when `add_peer` successfully adds a peer to the slot. - Added(PeerId), - /// Returned when we already have given peer in our list, but it is upgraded from - /// `Common` to `Reserved`. - Upgraded(PeerId), - /// Returned when we should removed a common peer to make space for a reserved peer. - Swaped { - /// Peer was removed from the list. - removed: PeerId, - /// Peer was added to the list. - added: PeerId, - }, - /// Error returned when we are already know about given peer. - AlreadyExists(PeerId), - /// Error returned when list is full and no more peers can be added. - MaxCapacity(PeerId), -} - -/// Contains all information about group of slots. -pub struct Slots { - /// Maximum number of slots. Total number of reserved and common slots must be always - /// smaller or equal to `max_slots`. - max_slots: usize, - /// Reserved slots. - reserved: LinkedHashMap, - /// Common slots. - common: LinkedHashMap, -} - -impl fmt::Debug for Slots { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - struct ListFormatter<'a>(&'a LinkedHashMap); - - impl<'a> fmt::Debug for ListFormatter<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_list().entries(self.0.keys()).finish() - } - } - - f.debug_struct("Slots") - .field("max_slots", &self.max_slots) - .field("reserved", &ListFormatter(&self.reserved)) - .field("common", &ListFormatter(&self.common)) - .finish() - } -} - -impl Slots { - /// Creates a group of slots with a limited size. - pub fn new(max_slots: u32) -> Self { - let max_slots = max_slots as usize; - Slots { - max_slots, - reserved: LinkedHashMap::new(), - common: LinkedHashMap::new(), - } - } - - /// Returns true if one of the slots contains given peer. - pub fn contains(&self, peer_id: &PeerId) -> bool { - self.common.contains_key(peer_id) || self.reserved.contains_key(peer_id) - } - - /// Tries to find a slot for a given peer and returns `SlotState`. - /// - /// - If a peer is already inserted into reserved list or inserted or - /// inserted into common list and readded with the same `SlotType`, - /// the function returns `SlotState::AlreadyExists` - /// - If a peer is already inserted common list returns `SlotState::Upgraded` - /// - If there is no slot for a reserved peer, we try to drop one common peer - /// and it a new reserved one in it's place, function returns `SlotState::Swaped` - /// - If there is no place for a peer, function returns `SlotState::MaxCapacity` - /// - If the peer was simply added, `SlotState::Added` is returned - pub fn add_peer(&mut self, peer_id: PeerId, slot_type: SlotType) -> SlotState { - if self.reserved.contains_key(&peer_id) { - return SlotState::AlreadyExists(peer_id); - } - - if self.common.contains_key(&peer_id) { - if slot_type == SlotType::Reserved { - self.common.remove(&peer_id); - self.reserved.insert(peer_id.clone(), ()); - return SlotState::Upgraded(peer_id); - } else { - return SlotState::AlreadyExists(peer_id); - } - } - - if self.max_slots == (self.common.len() + self.reserved.len()) { - if let SlotType::Reserved = slot_type { - if let Some((to_remove, _)) = self.common.pop_front() { - self.reserved.insert(peer_id.clone(), ()); - return SlotState::Swaped { - removed: to_remove, - added: peer_id, - }; - } - } - return SlotState::MaxCapacity(peer_id); - } - - match slot_type { - SlotType::Common => self.common.insert(peer_id.clone(), ()), - SlotType::Reserved => self.reserved.insert(peer_id.clone(), ()), - }; - - SlotState::Added(peer_id) - } - - /// Pops the oldest reserved peer. If none exists and `reserved_only = false` pops a common peer. - pub fn pop_most_important_peer(&mut self, reserved_only: bool) -> Option<(PeerId, SlotType)> { - if let Some((peer_id, _)) = self.reserved.pop_front() { - return Some((peer_id, SlotType::Reserved)); - } - - if reserved_only { - return None; - } - - self.common.pop_front() - .map(|(peer_id, _)| (peer_id, SlotType::Common)) - } - - /// Removes all common peers from the list and returns an iterator over them. - pub fn clear_common_slots(&mut self) -> impl Iterator { - let slots = mem::replace(&mut self.common, LinkedHashMap::new()); - slots.into_iter().map(|(peer_id, _)| peer_id) - } - - /// Marks given peer as a reserved one. - pub fn mark_reserved(&mut self, peer_id: &PeerId) { - if let Some(_) = self.common.remove(peer_id) { - self.reserved.insert(peer_id.clone(), ()); - } - } - - /// Marks given peer as not reserved one. - pub fn mark_not_reserved(&mut self, peer_id: &PeerId) { - if let Some(_) = self.reserved.remove(peer_id) { - self.common.insert(peer_id.clone(), ()); - } - } - - /// Removes a peer from a list and returns true if it existed. - pub fn remove_peer(&mut self, peer_id: &PeerId) -> bool { - self.common.remove(peer_id).is_some() || self.reserved.remove(peer_id).is_some() - } - - /// Returns true if given peer is reserved. - pub fn is_reserved(&self, peer_id: &PeerId) -> bool { - self.reserved.contains_key(peer_id) - } -} - -#[cfg(test)] -mod tests { - use libp2p::PeerId; - use super::{Slots, SlotType}; - - #[test] - fn test_slots_debug() { - let reserved_peer = PeerId::random(); - let reserved_peer2 = PeerId::random(); - let common_peer = PeerId::random(); - let mut slots = Slots::new(10); - - slots.add_peer(reserved_peer.clone(), SlotType::Reserved); - slots.add_peer(reserved_peer2.clone(), SlotType::Reserved); - slots.add_peer(common_peer.clone(), SlotType::Common); - - let expected = format!("Slots {{ - max_slots: 10, - reserved: [ - PeerId( - {:?} - ), - PeerId( - {:?} - ) - ], - common: [ - PeerId( - {:?} - ) - ] -}}", reserved_peer.to_base58(), reserved_peer2.to_base58(), common_peer.to_base58()); - - let s = format!("{:#?}", slots); - assert_eq!(expected, s); - } -} diff --git a/core/peerset/tests/fuzz.rs b/core/peerset/tests/fuzz.rs new file mode 100644 index 0000000000000000000000000000000000000000..42a7f2770cc9ccfe64d5d455a1a1046be254bfd1 --- /dev/null +++ b/core/peerset/tests/fuzz.rs @@ -0,0 +1,138 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use futures::prelude::*; +use libp2p::PeerId; +use rand::distributions::{Distribution, Uniform, WeightedIndex}; +use rand::seq::IteratorRandom; +use std::{collections::HashMap, collections::HashSet, iter}; +use substrate_peerset::{IncomingIndex, Message, PeersetConfig, Peerset}; + +#[test] +fn run() { + for _ in 0..50 { + test_once(); + } +} + +fn test_once() { + // PRNG to use. + let mut rng = rand::thread_rng(); + + // Nodes that the peerset knows about. + let mut known_nodes = HashSet::::new(); + // Nodes that we have reserved. Always a subset of `known_nodes`. + let mut reserved_nodes = HashSet::::new(); + + let (mut peerset, peerset_handle) = Peerset::from_config(PeersetConfig { + bootnodes: (0 .. Uniform::new_inclusive(0, 4).sample(&mut rng)).map(|_| { + let id = PeerId::random(); + known_nodes.insert(id.clone()); + id + }).collect(), + reserved_nodes: (0 .. Uniform::new_inclusive(0, 2).sample(&mut rng)).map(|_| { + let id = PeerId::random(); + known_nodes.insert(id.clone()); + reserved_nodes.insert(id.clone()); + id + }).collect(), + reserved_only: Uniform::new_inclusive(0, 10).sample(&mut rng) == 0, + in_peers: Uniform::new_inclusive(0, 25).sample(&mut rng), + out_peers: Uniform::new_inclusive(0, 25).sample(&mut rng), + }); + + tokio::runtime::current_thread::Runtime::new().unwrap().block_on(futures::future::poll_fn(move || -> Result<_, ()> { + // List of nodes the user of `peerset` assumes it's connected to. Always a subset of + // `known_nodes`. + let mut connected_nodes = HashSet::::new(); + // List of nodes the user of `peerset` called `incoming` with and that haven't been + // accepted or rejected yet. + let mut incoming_nodes = HashMap::::new(); + // Next id for incoming connections. + let mut next_incoming_id = IncomingIndex(0); + + // Perform a certain number of actions while checking that the state is consistent. If we + // reach the end of the loop, the run has succeeded. + for _ in 0 .. 2500 { + // Each of these weights corresponds to an action that we may perform. + let action_weights = [150, 90, 90, 30, 30, 1, 1, 4, 4]; + match WeightedIndex::new(&action_weights).unwrap().sample(&mut rng) { + // If we generate 0, poll the peerset. + 0 => match peerset.poll().unwrap() { + Async::Ready(Some(Message::Connect(id))) => { + if let Some(id) = incoming_nodes.iter().find(|(_, v)| **v == id).map(|(&id, _)| id) { + incoming_nodes.remove(&id); + } + assert!(connected_nodes.insert(id)); + } + Async::Ready(Some(Message::Drop(id))) => { connected_nodes.remove(&id); } + Async::Ready(Some(Message::Accept(n))) => + assert!(connected_nodes.insert(incoming_nodes.remove(&n).unwrap())), + Async::Ready(Some(Message::Reject(n))) => + assert!(!connected_nodes.contains(&incoming_nodes.remove(&n).unwrap())), + Async::Ready(None) => panic!(), + Async::NotReady => {} + } + + // If we generate 1, discover a new node. + 1 => { + let new_id = PeerId::random(); + known_nodes.insert(new_id.clone()); + peerset.discovered(iter::once(new_id)); + } + + // If we generate 2, adjust a random reputation. + 2 => if let Some(id) = known_nodes.iter().choose(&mut rng) { + let val = Uniform::new_inclusive(i32::min_value(), i32::max_value()).sample(&mut rng); + peerset_handle.report_peer(id.clone(), val); + } + + // If we generate 3, disconnect from a random node. + 3 => if let Some(id) = connected_nodes.iter().choose(&mut rng).cloned() { + connected_nodes.remove(&id); + peerset.dropped(id); + } + + // If we generate 4, connect to a random node. + 4 => if let Some(id) = known_nodes.iter() + .filter(|n| incoming_nodes.values().all(|m| m != *n) && !connected_nodes.contains(n)) + .choose(&mut rng) { + peerset.incoming(id.clone(), next_incoming_id.clone()); + incoming_nodes.insert(next_incoming_id.clone(), id.clone()); + next_incoming_id.0 += 1; + } + + // 5 and 6 are the reserved-only mode. + 5 => peerset_handle.set_reserved_only(true), + 6 => peerset_handle.set_reserved_only(false), + + // 7 and 8 are about switching a random node in or out of reserved mode. + 7 => if let Some(id) = known_nodes.iter().filter(|n| !reserved_nodes.contains(n)).choose(&mut rng) { + peerset_handle.add_reserved_peer(id.clone()); + reserved_nodes.insert(id.clone()); + } + 8 => if let Some(id) = reserved_nodes.iter().choose(&mut rng).cloned() { + reserved_nodes.remove(&id); + peerset_handle.remove_reserved_peer(id); + } + + _ => unreachable!() + } + } + + Ok(Async::Ready(())) + })).unwrap(); +} diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index b48c2f54fb20ec048550960daa7fb1b4f521a02a..8eb62ddf8431ba755029b69d94e7173130767f5d 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -1,39 +1,45 @@ [package] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] rstd = { package = "sr-std", path = "../sr-std", default-features = false } -parity-codec = { version = "3.3", default-features = false, features = ["derive"] } +parity-codec = { version = "3.4.0", default-features = false, features = ["derive"] } rustc-hex = { version = "2.0", default-features = false } -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } -twox-hash = { version = "1.1.0", optional = true } -byteorder = { version = "1.1", default-features = false } +serde = { version = "1.0", optional = true, features = ["derive"] } +twox-hash = { version = "1.2.0", optional = true } +byteorder = { version = "1.3.1", default-features = false } primitive-types = { version = "0.2", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } wasmi = { version = "0.4.3", optional = true } hash-db = { version = "0.12", default-features = false } hash256-std-hasher = { version = "0.12", default-features = false } -ring = { version = "0.14", optional = true } -untrusted = { version = "0.6", optional = true } -hex-literal = { version = "0.1", optional = true } +ed25519-dalek = { version = "1.0.0-pre.1", optional = true } base58 = { version = "0.1", optional = true } blake2-rfc = { version = "0.2.18", optional = true } schnorrkel = { version = "0.1", optional = true } rand = { version = "0.6", optional = true } sha2 = { version = "0.8", optional = true } substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39", optional = true } -tiny-bip39 = { version = "0.6.0", optional = true } +tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } regex = {version = "1.1", optional = true } [dev-dependencies] substrate-serializer = { path = "../serializer" } -pretty_assertions = "0.5" -heapsize = "0.4" +pretty_assertions = "0.6" +hex-literal = "0.2" +rand = "0.6" +criterion = "0.2" + +[[bench]] +name = "benches" +harness = false + +[lib] +bench = false [features] default = ["std"] @@ -54,14 +60,12 @@ std = [ "rustc-hex/std", "twox-hash", "blake2-rfc", - "ring", - "untrusted", - "hex-literal", + "ed25519-dalek", "hex", "base58", "substrate-bip39", "tiny-bip39", - "serde_derive", + "serde", "byteorder/std", "rand", "sha2", diff --git a/core/primitives/benches/benches.rs b/core/primitives/benches/benches.rs new file mode 100644 index 0000000000000000000000000000000000000000..4a003257e2b6d2630c933de2e2dfb00513ccfe1b --- /dev/null +++ b/core/primitives/benches/benches.rs @@ -0,0 +1,94 @@ +// Copyright 2019 Parity Technologies +// +// 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. + + +#[macro_use] +extern crate criterion; + +use criterion::{Criterion, black_box, Bencher, Fun}; +use std::time::Duration; +use substrate_primitives::crypto::Pair as _; +use substrate_primitives::hashing::{twox_128, blake2_128}; + +const MAX_KEY_SIZE: u32 = 32; + +fn get_key(key_size: u32) -> Vec { + use rand::SeedableRng; + use rand::Rng; + + let rnd: [u8; 32] = rand::rngs::StdRng::seed_from_u64(12).gen(); + let mut rnd = rnd.iter().cycle(); + + (0..key_size) + .map(|_| rnd.next().unwrap().clone()) + .collect() +} + +fn bench_blake2_128(b: &mut Bencher, key: &Vec) { + b.iter(|| { + let _a = blake2_128(black_box(key)); + }); +} + +fn bench_twox_128(b: &mut Bencher, key: &Vec) { + b.iter(|| { + let _a = twox_128(black_box(key)); + }); +} + +fn bench_hash_128_fix_size(c: &mut Criterion) { + let key = get_key(MAX_KEY_SIZE); + let blake_fn = Fun::new("blake2_128", bench_blake2_128); + let twox_fn = Fun::new("twox_128", bench_twox_128); + let fns = vec![blake_fn, twox_fn]; + + c.bench_functions("fixed size hashing", fns, key); +} + +fn bench_hash_128_dyn_size(c: &mut Criterion) { + let mut keys = Vec::new(); + for i in (2..MAX_KEY_SIZE).step_by(4) { + keys.push(get_key(i).clone()) + } + + c.bench_function_over_inputs("dyn size hashing - blake2", |b, key| bench_blake2_128(b, &key), keys.clone()); + c.bench_function_over_inputs("dyn size hashing - twox", |b, key| bench_twox_128(b, &key), keys); +} + +fn bench_ed25519(c: &mut Criterion) { + c.bench_function_over_inputs("signing - ed25519", |b, &msg_size| { + let msg = (0..msg_size) + .map(|_| rand::random::()) + .collect::>(); + let key = substrate_primitives::ed25519::Pair::generate(); + b.iter(|| key.sign(&msg)) + }, vec![32, 1024, 1024 * 1024]); + + c.bench_function_over_inputs("verifying - ed25519", |b, &msg_size| { + let msg = (0..msg_size) + .map(|_| rand::random::()) + .collect::>(); + let key = substrate_primitives::ed25519::Pair::generate(); + let sig = key.sign(&msg); + let public = key.public(); + b.iter(|| substrate_primitives::ed25519::Pair::verify(&sig, &msg, &public)) + }, vec![32, 1024, 1024 * 1024]); +} + +criterion_group!{ + name = benches; + config = Criterion::default().warm_up_time(Duration::from_millis(500)).without_plots(); + targets = bench_hash_128_fix_size, bench_hash_128_dyn_size, bench_ed25519 +} +criterion_main!(benches); diff --git a/core/primitives/src/changes_trie.rs b/core/primitives/src/changes_trie.rs index c8776a6f0873f210f2fac9c246aada2661960fbb..2fa11f5641d59090673a618f04a97cee958ca560 100644 --- a/core/primitives/src/changes_trie.rs +++ b/core/primitives/src/changes_trie.rs @@ -17,7 +17,7 @@ //! Substrate changes trie configuration. #[cfg(any(feature = "std", test))] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use parity_codec::{Encode, Decode}; /// Substrate changes trie configuration. @@ -53,16 +53,7 @@ impl ChangesTrieConfiguration { return 1; } - // FIXME: use saturating_pow once stabilized - https://github.com/rust-lang/rust/issues/48320 - let mut max_digest_interval = self.digest_interval; - for _ in 1..self.digest_levels { - max_digest_interval = match max_digest_interval.checked_mul(self.digest_interval) { - Some(max_digest_interval) => max_digest_interval, - None => return u64::max_value(), - } - } - - max_digest_interval + self.digest_interval.saturating_pow(self.digest_levels) } /// Returns Some if digest must be built at given block number. diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index e0ecd4ce42ec9b2ba5a908c15db833f4c8d3c5a1..9cd71bb9b2a390145e7123764e72c9462922def6 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -215,7 +215,9 @@ pub trait Derive: Sized { /// Derive a child key from a series of given junctions. /// /// Will be `None` for public keys if there are any hard junctions in there. - fn derive>(&self, _path: Iter) -> Option { None } + fn derive>(&self, _path: Iter) -> Option { + None + } } #[cfg(feature = "std")] @@ -266,11 +268,19 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { let cap = re.captures(s).ok_or(PublicError::InvalidFormat)?; let re_junction = Regex::new(r"/(/?[^/]+)") .expect("constructed from known-good static value; qed"); - let path = re_junction.captures_iter(&cap["path"]) - .map(|f| DeriveJunction::from(&f[1])); - Self::from_ss58check(cap.name("ss58").map(|r| r.as_str()).unwrap_or(DEV_ADDRESS))? - .derive(path) - .ok_or(PublicError::InvalidPath) + let addr = Self::from_ss58check( + cap.name("ss58") + .map(|r| r.as_str()) + .unwrap_or(DEV_ADDRESS) + )?; + if cap["path"].is_empty() { + Ok(addr) + } else { + let path = re_junction.captures_iter(&cap["path"]) + .map(|f| DeriveJunction::from(&f[1])); + addr.derive(path) + .ok_or(PublicError::InvalidPath) + } } } @@ -278,7 +288,7 @@ impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { /// /// For now it just specifies how to create a key from a phrase and derivation path. #[cfg(feature = "std")] -pub trait Pair: Sized { +pub trait Pair: Sized + 'static { /// TThe type which is used to encode a public key. type Public; @@ -400,7 +410,7 @@ pub trait Pair: Sized { #[cfg(test)] mod tests { use crate::DeriveJunction; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use super::*; #[derive(Eq, PartialEq, Debug)] diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 937cc19a899c707635a7889cd8da61bc72a282bb..135c551e454b794f3358982e1a9a0e012992ae21 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -22,20 +22,16 @@ use crate::{hash::H256, hash::H512}; use parity_codec::{Encode, Decode}; -#[cfg(feature = "std")] -use untrusted; #[cfg(feature = "std")] use blake2_rfc; #[cfg(feature = "std")] -use ring::{signature, signature::KeyPair, rand::{SecureRandom, SystemRandom}}; -#[cfg(feature = "std")] -use base58::{ToBase58, FromBase58}; -#[cfg(feature = "std")] use substrate_bip39::seed_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive}; +use rand::Rng; +#[cfg(feature = "std")] +use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive, Ss58Codec}; #[cfg(feature = "std")] use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; use crate::crypto::UncheckedFrom; @@ -52,12 +48,16 @@ pub struct Public(pub [u8; 32]); /// A key pair. #[cfg(feature = "std")] -pub struct Pair(signature::Ed25519KeyPair, Seed); +pub struct Pair(ed25519_dalek::Keypair); #[cfg(feature = "std")] impl Clone for Pair { fn clone(&self) -> Self { - Pair::from_seed(self.1.clone()) + Pair(ed25519_dalek::Keypair { + public: self.0.public.clone(), + secret: ed25519_dalek::SecretKey::from_bytes(self.0.secret.as_bytes()) + .expect("key is always the correct size; qed") + }) } } @@ -324,36 +324,6 @@ impl Public { #[cfg(feature = "std")] impl Derive for Public {} -#[cfg(feature = "std")] -impl Public { - /// Some if the string is a properly encoded SS58Check address. - pub fn from_ss58check(s: &str) -> Result { - let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. - if d.len() != 35 { - // Invalid length. - return Err(PublicError::BadLength); - } - if d[0] != 42 { - // Invalid version. - return Err(PublicError::UnknownVersion); - } - if d[33..35] != blake2_rfc::blake2b::blake2b(64, &[], &d[0..33]).as_bytes()[0..2] { - // Invalid checksum. - return Err(PublicError::InvalidChecksum); - } - Ok(Self::from_slice(&d[1..33])) - } - - /// Return the ss58-check string for this key. - pub fn to_ss58check(&self) -> String { - let mut v = vec![42u8]; - v.extend(self.as_slice()); - let r = blake2_rfc::blake2b::blake2b(64, &[], &v); - v.extend(&r.as_bytes()[0..2]); - v.to_base58() - } -} - #[cfg(feature = "std")] impl AsRef for Pair { fn as_ref(&self) -> &Pair { @@ -391,7 +361,7 @@ impl TraitPair for Pair { /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. fn generate() -> Pair { let mut seed: Seed = Default::default(); - SystemRandom::new().fill(seed.as_mut()).expect("system random source should always work! qed"); + rand::rngs::EntropyRng::new().fill(seed.as_mut()); Self::from_seed(seed) } @@ -421,9 +391,10 @@ impl TraitPair for Pair { /// /// You should never need to use this; generate(), generate_with_phrasee fn from_seed(seed: Seed) -> Pair { - let key = signature::Ed25519KeyPair::from_seed_unchecked(untrusted::Input::from(&seed[..])) + let secret = ed25519_dalek::SecretKey::from_bytes(&seed[..]) .expect("seed has valid length; qed"); - Pair(key, seed) + let public = ed25519_dalek::PublicKey::from(&secret); + Pair(ed25519_dalek::Keypair { secret, public }) } /// Make a new key pair from secret seed material. The slice must be 32 bytes long or it @@ -442,7 +413,7 @@ impl TraitPair for Pair { /// Derive a child key from a series of given junctions. fn derive>(&self, path: Iter) -> Result { - let mut acc = self.1.clone(); + let mut acc = self.0.public.to_bytes(); for j in path { match j { DeriveJunction::Soft(_cc) => return Err(DeriveError::SoftKeyInPath), @@ -460,28 +431,20 @@ impl TraitPair for Pair { /// Get the public key. fn public(&self) -> Public { let mut r = [0u8; 32]; - let pk = self.0.public_key().as_ref(); + let pk = self.0.public.as_bytes(); r.copy_from_slice(pk); Public(r) } /// Sign a message. fn sign(&self, message: &[u8]) -> Signature { - let mut r = [0u8; 64]; - r.copy_from_slice(self.0.sign(message).as_ref()); + let r = self.0.sign(message).to_bytes(); Signature::from_raw(r) } /// Verify a signature on a message. Returns true if the signature is good. fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { - let public_key = untrusted::Input::from(&pubkey.as_ref().0[..]); - let msg = untrusted::Input::from(message.as_ref()); - let sig = untrusted::Input::from(&sig.0[..]); - - match signature::verify(&signature::ED25519, public_key, msg, sig) { - Ok(_) => true, - _ => false, - } + Self::verify_weak(&sig.0[..], message.as_ref(), &pubkey.as_ref().0[..]) } /// Verify a signature on a message. Returns true if the signature is good. @@ -489,11 +452,17 @@ impl TraitPair for Pair { /// This doesn't use the type system to ensure that `sig` and `pubkey` are the correct /// size. Use it only if you're coming from byte buffers and need the speed. fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool { - let public_key = untrusted::Input::from(pubkey.as_ref()); - let msg = untrusted::Input::from(message.as_ref()); - let sig = untrusted::Input::from(sig); + let public_key = match ed25519_dalek::PublicKey::from_bytes(pubkey.as_ref()) { + Ok(pk) => pk, + Err(_) => return false, + }; + + let sig = match ed25519_dalek::Signature::from_bytes(sig) { + Ok(s) => s, + Err(_) => return false + }; - match signature::verify(&signature::ED25519, public_key, msg, sig) { + match public_key.verify(message.as_ref(), &sig) { Ok(_) => true, _ => false, } @@ -504,7 +473,7 @@ impl TraitPair for Pair { impl Pair { /// Get the seed for this key. pub fn seed(&self) -> &Seed { - &self.1 + self.0.public.as_bytes() } /// Exactly as `from_string` except that if no matches are found then, the the first 32 @@ -522,7 +491,7 @@ impl Pair { #[cfg(test)] mod test { use super::*; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use crate::crypto::DEV_PHRASE; #[test] @@ -562,6 +531,7 @@ mod test { let message = b"Something important"; let signature = pair.sign(&message[..]); assert!(Pair::verify(&signature, &message[..], &public)); + assert!(!Pair::verify(&signature, b"Something else", &public)); } #[test] @@ -573,6 +543,7 @@ mod test { let signature = pair.sign(&message[..]); println!("Correct signature: {:?}", signature); assert!(Pair::verify(&signature, &message[..], &public)); + assert!(!Pair::verify(&signature, "Other message", &public)); } #[test] diff --git a/core/primitives/src/hash.rs b/core/primitives/src/hash.rs index f3e3583be5771b3d0569753393cf232ad9a68cf4..c63463e32ae2b94fad78ff5789c500dbeeb11109 100644 --- a/core/primitives/src/hash.rs +++ b/core/primitives/src/hash.rs @@ -78,11 +78,4 @@ mod tests { assert!(ser::from_str::("\"0\"").unwrap_err().is_data()); assert!(ser::from_str::("\"10\"").unwrap_err().is_data()); } - - #[test] - fn test_heapsizeof() { - use heapsize::HeapSizeOf; - let h = H256::zero(); - assert_eq!(h.heap_size_of_children(), 0); - } } diff --git a/core/primitives/src/hashing.rs b/core/primitives/src/hashing.rs index 814048fea848da3bdc9732b6521ace0220708da1..87312ce6e46e91e04d9c365d5e9181299e6c23bb 100644 --- a/core/primitives/src/hashing.rs +++ b/core/primitives/src/hashing.rs @@ -55,6 +55,23 @@ pub fn blake2_128(data: &[u8]) -> [u8; 16] { r } +/// Do a XX 64-bit hash and place result in `dest`. +pub fn twox_64_into(data: &[u8], dest: &mut [u8; 8]) { + use ::core::hash::Hasher; + let mut h0 = twox_hash::XxHash::with_seed(0); + h0.write(data); + let r0 = h0.finish(); + use byteorder::{ByteOrder, LittleEndian}; + LittleEndian::write_u64(&mut dest[0..8], r0); +} + +/// Do a XX 64-bit hash and return result. +pub fn twox_64(data: &[u8]) -> [u8; 8] { + let mut r: [u8; 8] = [0; 8]; + twox_64_into(data, &mut r); + r +} + /// Do a XX 128-bit hash and place result in `dest`. pub fn twox_128_into(data: &[u8], dest: &mut [u8; 16]) { use ::core::hash::Hasher; diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index f078b5446f53b2275686722294460c446d4dbee9..c9008171df94376893596b39790d15db3d8bffe4 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -19,7 +19,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] /// Initialize a key-value collection from array. /// @@ -38,7 +37,7 @@ use parity_codec::{Encode, Decode}; #[cfg(feature = "std")] use std::borrow::Cow; #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] pub use impl_serde::serialize as bytes; @@ -46,7 +45,7 @@ pub use impl_serde::serialize as bytes; #[cfg(feature = "std")] pub mod hashing; #[cfg(feature = "std")] -pub use hashing::{blake2_256, twox_128, twox_256}; +pub use hashing::{blake2_128, blake2_256, twox_64, twox_128, twox_256}; #[cfg(feature = "std")] pub mod hexdisplay; pub mod crypto; diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index aa17447a24a29078b2ed2f9cb513cab891c4d04e..8f309ec0306a1523ae9223efc3df8976c94f6e74 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -231,8 +231,10 @@ pub struct LocalizedSignature { impl Signature { /// A new instance from the given 64-byte `data`. /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! + /// NOTE: No checking goes on to ensure this is a real signature. Only use + /// it if you are certain that the array actually is a signature, or if you + /// immediately verify the signature. All functions that verify signatures + /// will fail if the `Signature` is not actually a valid signature. pub fn from_raw(data: [u8; 64]) -> Signature { Signature(data) } @@ -502,7 +504,7 @@ impl Pair { mod test { use super::*; use crate::crypto::{Ss58Codec, DEV_PHRASE, DEV_ADDRESS}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn default_phrase_should_be_used() { diff --git a/core/primitives/src/storage.rs b/core/primitives/src/storage.rs index 79652a8d4ce3a211ac3490e57ebe4fa27164aabf..4746d230d08070e188cf756fab628629016a1e8c 100644 --- a/core/primitives/src/storage.rs +++ b/core/primitives/src/storage.rs @@ -17,7 +17,7 @@ //! Contract execution data. #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use crate::bytes; use rstd::vec::Vec; @@ -83,8 +83,11 @@ pub mod well_known_keys { pub const CHILD_STORAGE_KEY_PREFIX: &'static [u8] = b":child_storage:"; /// Whether a key is a child storage key. + /// + /// This is convenience function which basically checks if the given `key` starts + /// with `CHILD_STORAGE_KEY_PREFIX` and doesn't do anything apart from that. pub fn is_child_storage_key(key: &[u8]) -> bool { + // Other code might depend on this, so be careful changing this. key.starts_with(CHILD_STORAGE_KEY_PREFIX) } - } diff --git a/core/rpc-servers/Cargo.toml b/core/rpc-servers/Cargo.toml index c12adead3f98f7ba910e7d5e541d81726c8ac324..18bdd5185383bcca8091dcb7ac43bc20a9136dbb 100644 --- a/core/rpc-servers/Cargo.toml +++ b/core/rpc-servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-rpc-servers" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/rpc-servers/src/lib.rs b/core/rpc-servers/src/lib.rs index eb84212709c9d402591e75188082b71b53fb3e43..adf560ce5a6375eeee780ecace7ef6c42908959a 100644 --- a/core/rpc-servers/src/lib.rs +++ b/core/rpc-servers/src/lib.rs @@ -24,9 +24,12 @@ use std::io; use log::error; use sr_primitives::{traits::{Block as BlockT, NumberFor}, generic::SignedBlock}; -/// Maximal payload accepted by RPC servers +/// Maximal payload accepted by RPC servers. const MAX_PAYLOAD: usize = 15 * 1024 * 1024; +/// Default maximum number of connections for WS RPC servers. +const WS_MAX_CONNECTIONS: usize = 100; + type Metadata = apis::metadata::Metadata; type RpcHandler = pubsub::PubSubHandler; pub type HttpServer = http::Server; @@ -76,11 +79,13 @@ pub fn start_http( /// Start WS server listening on given address. pub fn start_ws( addr: &std::net::SocketAddr, + max_connections: Option, cors: Option<&Vec>, io: RpcHandler, ) -> io::Result { ws::ServerBuilder::with_meta_extractor(io, |context: &ws::RequestContext| Metadata::new(context.sender())) .max_payload(MAX_PAYLOAD) + .max_connections(max_connections.unwrap_or(WS_MAX_CONNECTIONS)) .allowed_origins(map_cors(cors)) .start(addr) .map_err(|err| match err { diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index 869624ec4c7123f24b346771a1f398cd880178b2..feb8e9ffee167a565559fcdbdcc06622272e554c 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "substrate-rpc" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" jsonrpc-core = "11.0.0" jsonrpc-core-client = "11.0.0" jsonrpc-pubsub = "11.0.0" @@ -13,8 +13,7 @@ jsonrpc-derive = "11.0.0" log = "0.4" parking_lot = "0.7.1" parity-codec = "3.3" -serde = "1.0" -serde_derive = "1.0" +serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" client = { package = "substrate-client", path = "../client" } substrate-executor = { path = "../executor" } @@ -34,4 +33,3 @@ test_client = { package = "substrate-test-client", path = "../test-client" } test_runtime = { package = "substrate-test-runtime", path = "../test-runtime" } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } rustc-hex = "2.0" -hex-literal = "0.1" diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 9c1ec232252001e10640e655f091cd970417559b..5955108249f4fdec31974ae66738045c39d70c95 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -16,33 +16,37 @@ //! Authoring RPC module errors. -use error_chain::*; use client; use transaction_pool::txpool; use crate::rpc; use crate::errors; -error_chain! { - links { - Pool(txpool::error::Error, txpool::error::ErrorKind) #[doc = "Pool error"]; - Client(client::error::Error, client::error::ErrorKind) #[doc = "Client error"]; - } - errors { - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), - } - /// Incorrect extrinsic format. - BadFormat { - description("bad format"), - display("Invalid extrinsic format"), - } - /// Verification error - Verification(e: Box<::std::error::Error + Send>) { - description("extrinsic verification error"), - display("Extrinsic verification error: {}", e.description()), +/// Author RPC Result type. +pub type Result = std::result::Result; + +/// Author RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Transaction pool error, + Pool(txpool::error::Error), + /// Verification error + #[display(fmt="Extrinsic verification error: {}", "_0.description()")] + Verification(Box<::std::error::Error + Send>), + /// Incorrect extrinsic format. + #[display(fmt="Invalid extrinsic format")] + BadFormat, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Pool(ref err) => Some(err), + Error::Verification(ref err) => Some(&**err), + _ => None, } } } @@ -71,49 +75,50 @@ const POOL_IMMEDIATELY_DROPPED: i64 = POOL_INVALID_TX + 6; impl From for rpc::Error { fn from(e: Error) -> Self { + use txpool::error::{Error as PoolError}; + match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), - Error(ErrorKind::BadFormat, _) => rpc::Error { + Error::BadFormat => rpc::Error { code: rpc::ErrorCode::ServerError(BAD_FORMAT), message: "Extrinsic has invalid format.".into(), data: None, }, - Error(ErrorKind::Verification(e), _) => rpc::Error { + Error::Verification(e) => rpc::Error { code: rpc::ErrorCode::ServerError(VERIFICATION_ERROR), message: e.description().into(), data: Some(format!("{:?}", e).into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::InvalidTransaction(code)), _) => rpc::Error { + Error::Pool(PoolError::InvalidTransaction(code)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_INVALID_TX), message: "Invalid Transaction".into(), data: Some(code.into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::UnknownTransactionValidity(code)), _) => rpc::Error { + Error::Pool(PoolError::UnknownTransactionValidity(code)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_UNKNOWN_VALIDITY), message: "Unknown Transaction Validity".into(), data: Some(code.into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::TemporarilyBanned), _) => rpc::Error { + Error::Pool(PoolError::TemporarilyBanned) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_TEMPORARILY_BANNED), message: "Transaction is temporarily banned".into(), data: None, }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::AlreadyImported(hash)), _) => rpc::Error { + Error::Pool(PoolError::AlreadyImported(hash)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_ALREADY_IMPORTED), message: "Transaction Already Imported".into(), data: Some(format!("{:?}", hash).into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::TooLowPriority(old, new)), _) => rpc::Error { + Error::Pool(PoolError::TooLowPriority { old, new }) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_TOO_LOW_PRIORITY), message: format!("Priority is too low: ({} vs {})", old, new), data: Some("The transaction has too low priority to replace another transaction already in the pool.".into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::CycleDetected), _) => rpc::Error { + Error::Pool(PoolError::CycleDetected) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_CYCLE_DETECTED), message: "Cycle Detected".into(), data: None, }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::ImmediatelyDropped), _) => rpc::Error { + Error::Pool(PoolError::ImmediatelyDropped) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_IMMEDIATELY_DROPPED), message: "Immediately Dropped" .into(), data: Some("The transaction couldn't enter the pool because of the limit".into()), diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index 47db819dbfcbf828e5e751422241aea3fca0eb43..eb39619cbfc53c6a98ff1e6c9c5f7988c3ab3286 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -106,13 +106,13 @@ impl AuthorApi, BlockHash

> for Author whe type Metadata = crate::metadata::Metadata; fn submit_extrinsic(&self, ext: Bytes) -> Result> { - let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; + let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::BadFormat)?; let best_block_hash = self.client.info()?.chain.best_hash; self.pool .submit_one(&generic::BlockId::hash(best_block_hash), xt) .map_err(|e| e.into_pool_error() .map(Into::into) - .unwrap_or_else(|e| error::ErrorKind::Verification(Box::new(e)).into()) + .unwrap_or_else(|e| error::Error::Verification(Box::new(e)).into()) ) } @@ -123,12 +123,13 @@ impl AuthorApi, BlockHash

> for Author whe fn watch_extrinsic(&self, _metadata: Self::Metadata, subscriber: Subscriber, BlockHash

>>, xt: Bytes) { let submit = || -> Result<_> { let best_block_hash = self.client.info()?.chain.best_hash; - let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; + let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]) + .ok_or(error::Error::BadFormat)?; self.pool .submit_and_watch(&generic::BlockId::hash(best_block_hash), dxt) .map_err(|e| e.into_pool_error() .map(Into::into) - .unwrap_or_else(|e| error::ErrorKind::Verification(Box::new(e)).into()) + .unwrap_or_else(|e| error::Error::Verification(Box::new(e)).into()) ) }; diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index 53166e76f82ea01f48395472b47e48c5d49c79a0..4d0277f7d656a2ec770dbdb8d84df8f23133181d 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -34,8 +34,7 @@ fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { from: sender.into(), to: Default::default(), }; - let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); - Extrinsic::Transfer(tx, signature) + tx.into_signed_tx() } #[test] @@ -106,8 +105,7 @@ fn should_watch_extrinsic() { from: AccountKeyring::Alice.into(), to: Default::default(), }; - let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); - Extrinsic::Transfer(tx, signature) + tx.into_signed_tx() }; AuthorApi::submit_extrinsic(&p, replacement.encode().into()).unwrap(); let (res, data) = runtime.block_on(data.into_future()).unwrap(); diff --git a/core/rpc/src/chain/error.rs b/core/rpc/src/chain/error.rs index c52d44eddc3392d6a35fa4ec2dc292cb677b2a58..ffd94f464904bd9b8edc7eeb8d213ea2e81fc419 100644 --- a/core/rpc/src/chain/error.rs +++ b/core/rpc/src/chain/error.rs @@ -14,28 +14,42 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use error_chain::*; use client; use crate::rpc; use crate::errors; -error_chain! { - links { - Client(client::error::Error, client::error::ErrorKind) #[doc = "Client error"]; - } - errors { - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), +/// Chain RPC Result type. +pub type Result = std::result::Result; + +/// Chain RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Other error type. + Other(String), +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + _ => None, } } } +/// Base error code for all chain errors. +const BASE_ERROR: i64 = 3000; + impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), + Error::Other(message) => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message, + data: None, + }, e => errors::internal(e), } } diff --git a/core/rpc/src/chain/mod.rs b/core/rpc/src/chain/mod.rs index 491fb1439942fb17a464f1d7efafc9883f93659d..365309939d5fc84407168939f1a6bc5d3313e167 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -147,7 +147,7 @@ impl Chain where let header = best_block_hash() .and_then(|hash| self.header(hash.into())) .and_then(|header| { - header.ok_or_else(|| self::error::ErrorKind::Unimplemented.into()) + header.ok_or_else(|| "Best header missing.".to_owned().into()) }) .map_err(Into::into); @@ -189,7 +189,6 @@ impl ChainApi, Block::Hash, Block::Header, Sig } fn block_hash(&self, number: Option>>) -> Result> { - let number: Option>> = number.into(); Ok(match number { None => Some(self.client.info()?.chain.best_hash), Some(num_or_hex) => self.client.header(&BlockId::number(num_or_hex.to_number()?))?.map(|h| h.hash()), diff --git a/core/rpc/src/chain/number.rs b/core/rpc/src/chain/number.rs index 5d99dbc096a5bed04a3c561ae77fd2022976c3d3..9d4cac7414b831b7f6481e9c700b76ebe18c5cbb 100644 --- a/core/rpc/src/chain/number.rs +++ b/core/rpc/src/chain/number.rs @@ -14,9 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; +use std::{convert::TryFrom, fmt::Debug}; use primitives::U256; -use runtime_primitives::traits; /// RPC Block number type /// @@ -34,24 +34,28 @@ pub enum NumberOrHex { Hex(U256), } -impl> NumberOrHex { +impl + From + Debug + PartialOrd> NumberOrHex { /// Attempts to convert into concrete block number. /// /// Fails in case hex number is too big. pub fn to_number(self) -> Result { - match self { - NumberOrHex::Number(n) => Ok(n), + let num = match self { + NumberOrHex::Number(n) => n, NumberOrHex::Hex(h) => { - // FIXME #1377 this only supports `u64` since `BlockNumber` - // is `As` we could possibly go with `u128`. let l = h.low_u64(); if U256::from(l) != h { - Err(format!("`{}` does not fit into the block number type.", h)) + return Err(format!("`{}` does not fit into u64 type; unsupported for now.", h)) } else { - Ok(traits::As::sa(l)) + Number::try_from(l) + .map_err(|_| format!("`{}` does not fit into block number type.", h))? } }, + }; + // FIXME <2329>: Database seems to limit the block number to u32 for no reason + if num > Number::from(u32::max_value()) { + return Err(format!("`{:?}` > u32::max_value(), the max block number is u32.", num)) } + Ok(num) } } diff --git a/core/rpc/src/errors.rs b/core/rpc/src/errors.rs index a709013ad26801a471f7dd99d94c6ed10390b78b..da910de76215ae18339f942a40394b5cdbae7404 100644 --- a/core/rpc/src/errors.rs +++ b/core/rpc/src/errors.rs @@ -17,14 +17,6 @@ use crate::rpc; use log::warn; -pub fn unimplemented() -> rpc::Error { - rpc::Error { - code: rpc::ErrorCode::ServerError(1), - message: "Not implemented yet".into(), - data: None, - } -} - pub fn internal(e: E) -> rpc::Error { warn!("Unknown error: {:?}", e); rpc::Error { diff --git a/core/rpc/src/state/error.rs b/core/rpc/src/state/error.rs index bd85664099a5bbed55a79884c764b7e37e255c2a..30b3315b7bae04e075dcf53054936e5b62a8ab6c 100644 --- a/core/rpc/src/state/error.rs +++ b/core/rpc/src/state/error.rs @@ -14,34 +14,47 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use error_chain::*; use client; use crate::rpc; use crate::errors; -error_chain! { - links { - Client(client::error::Error, client::error::ErrorKind) #[doc = "Client error"]; - } +/// State RPC Result type. +pub type Result = std::result::Result; - errors { - /// Provided block range couldn't be resolved to a list of blocks. - InvalidBlockRange(from: String, to: String, details: String) { - description("Invalid block range"), - display("Cannot resolve a block range ['{:?}' ... '{:?}]. {}", from, to, details), - } - /// Not implemented yet - Unimplemented { - description("not implemented yet"), - display("Method Not Implemented"), +/// State RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Provided block range couldn't be resolved to a list of blocks. + #[display(fmt = "Cannot resolve a block range ['{:?}' ... '{:?}]. {}", from, to, details)] + InvalidBlockRange { + from: String, + to: String, + details: String, + }, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + _ => None, } } } +/// Base code for all state errors. +const BASE_ERROR: i64 = 4000; + impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), + Error::InvalidBlockRange { .. } => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message: format!("{}", e), + data: None, + }, e => errors::internal(e), } } diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index 8a75142adfb5d8a37d751f795f04f25d1ef02ef9..645d8fd8665176cdb6ccc3eaf6adb29b5df043b0 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -22,7 +22,6 @@ use std::{ sync::Arc, }; -use error_chain::bail; use log::{warn, trace}; use client::{self, Client, CallExecutor, BlockchainEvents, runtime_api::Metadata}; use jsonrpc_derive::rpc; @@ -33,7 +32,10 @@ use primitives::storage::{self, StorageKey, StorageData, StorageChangeSet}; use crate::rpc::Result as RpcResult; use crate::rpc::futures::{stream, Future, Sink, Stream}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header, ProvideRuntimeApi, As, NumberFor}; +use runtime_primitives::traits::{ + Block as BlockT, Header, ProvideRuntimeApi, NumberFor, + SaturatedConversion +}; use runtime_version::RuntimeVersion; use state_machine::{self, ExecutionStrategy}; @@ -59,7 +61,7 @@ pub trait StateApi { /// Returns the keys with prefix, leave empty to get all the keys #[rpc(name = "state_getKeys")] - fn storage_keys(&self, key: StorageKey, hash: Option) -> Result>; + fn storage_keys(&self, prefix: StorageKey, hash: Option) -> Result>; /// Returns a storage entry at a specific block's state. #[rpc(name = "state_getStorage", alias("state_getStorageAt"))] @@ -73,6 +75,40 @@ pub trait StateApi { #[rpc(name = "state_getStorageSize", alias("state_getStorageSizeAt"))] fn storage_size(&self, key: StorageKey, hash: Option) -> Result>; + /// Returns the keys with prefix from a child storage, leave empty to get all the keys + #[rpc(name = "state_getChildKeys")] + fn child_storage_keys( + &self, + child_storage_key: StorageKey, + prefix: StorageKey, + hash: Option + ) -> Result>; + + /// Returns a child storage entry at a specific block's state. + #[rpc(name = "state_getChildStorage")] + fn child_storage( + &self, + child_storage_key: StorageKey, + key: StorageKey, hash: Option + ) -> Result>; + + /// Returns the hash of a child storage entry at a block's state. + #[rpc(name = "state_getChildStorageHash")] + fn child_storage_hash( + &self, + child_storage_key: StorageKey, + key: StorageKey, hash: Option + ) -> Result>; + + /// Returns the size of a child storage entry at a block's state. + #[rpc(name = "state_getChildStorageSize")] + fn child_storage_size( + &self, + child_storage_key: StorageKey, + key: StorageKey, + hash: Option + ) -> Result>; + /// Returns the runtime metadata as an opaque blob. #[rpc(name = "state_getMetadata")] fn metadata(&self, hash: Option) -> Result; @@ -86,7 +122,12 @@ pub trait StateApi { /// NOTE This first returned result contains the initial state of storage for all keys. /// Subsequent values in the vector represent changes to the previous state (diffs). #[rpc(name = "state_queryStorage")] - fn query_storage(&self, keys: Vec, block: Hash, hash: Option) -> Result>>; + fn query_storage( + &self, + keys: Vec, + block: Hash, + hash: Option + ) -> Result>>; /// New runtime version subscription #[pubsub( @@ -108,11 +149,15 @@ pub trait StateApi { /// New storage subscription #[pubsub(subscription = "state_storage", subscribe, name = "state_subscribeStorage")] - fn subscribe_storage(&self, metadata: Self::Metadata, subscriber: Subscriber>, keys: Option>); + fn subscribe_storage( + &self, metadata: Self::Metadata, subscriber: Subscriber>, keys: Option> + ); /// Unsubscribe from storage subscription #[pubsub(subscription = "state_storage", unsubscribe, name = "state_unsubscribeStorage")] - fn unsubscribe_storage(&self, metadata: Option, id: SubscriptionId) -> RpcResult; + fn unsubscribe_storage( + &self, metadata: Option, id: SubscriptionId + ) -> RpcResult; } /// State API with subscriptions support. @@ -173,7 +218,7 @@ impl State where blocks.push(hdr.hash()); last = hdr; } else { - bail!(invalid_block_range( + return Err(invalid_block_range( Some(from), Some(to), format!("Parent of {} ({}) not found", last.number(), last.hash()), @@ -181,7 +226,7 @@ impl State where } } if last.hash() != from.hash() { - bail!(invalid_block_range( + return Err(invalid_block_range( Some(from), Some(to), format!("Expected to reach `from`, got {} ({})", last.number(), last.hash()), @@ -192,7 +237,7 @@ impl State where }; // check if we can filter blocks-with-changes from some (sub)range using changes tries let changes_trie_range = self.client.max_key_changes_range(from_number, BlockId::Hash(to.hash()))?; - let filtered_range_begin = changes_trie_range.map(|(begin, _)| (begin - from_number).as_() as usize); + let filtered_range_begin = changes_trie_range.map(|(begin, _)| (begin - from_number).saturated_into::()); let (unfiltered_range, filtered_range) = split_range(blocks.len(), filtered_range_begin); Ok(QueryStorageRange { hashes: blocks, @@ -201,7 +246,7 @@ impl State where filtered_range, }) }, - (from, to) => bail!( + (from, to) => Err( invalid_block_range(from.as_ref(), to.as_ref(), "Invalid range or unknown block".into()) ), } @@ -244,7 +289,7 @@ impl State where ) -> Result<()> { let (begin, end) = match range.filtered_range { Some(ref filtered_range) => ( - range.first_number + As::sa(filtered_range.start as u64), + range.first_number + filtered_range.start.saturated_into(), BlockId::Hash(range.hashes[filtered_range.end - 1].clone()) ), None => return Ok(()), @@ -256,7 +301,7 @@ impl State where if last_block == Some(block) { continue; } - let block_hash = range.hashes[(block - range.first_number).as_() as usize].clone(); + let block_hash = range.hashes[(block - range.first_number).saturated_into::()].clone(); let id = BlockId::Hash(block_hash); let value_at_block = self.client.storage(&id, key)?; changes_map.entry(block) @@ -326,6 +371,50 @@ impl StateApi for State where Ok(self.storage(key, block)?.map(|x| x.0.len() as u64)) } + fn child_storage( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying child storage at {:?} for key {}", block, HexDisplay::from(&key.0)); + Ok(self.client.child_storage(&BlockId::Hash(block), &child_storage_key, &key)?) + } + + fn child_storage_keys( + &self, + child_storage_key: StorageKey, + key_prefix: StorageKey, + block: Option + ) -> Result> { + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying child storage keys at {:?}", block); + Ok(self.client.child_storage_keys(&BlockId::Hash(block), &child_storage_key, &key_prefix)?) + } + + fn child_storage_hash( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + use runtime_primitives::traits::{Hash, Header as HeaderT}; + Ok( + self.child_storage(child_storage_key, key, block)? + .map(|x| ::Hashing::hash(&x.0)) + ) + } + + fn child_storage_size( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + Ok(self.child_storage(child_storage_key, key, block)?.map(|x| x.0.len() as u64)) + } + fn metadata(&self, block: Option) -> Result { let block = self.unwrap_or_best(block)?; self.client.runtime_api().metadata(&BlockId::Hash(block)).map(Into::into).map_err(Into::into) @@ -399,7 +488,9 @@ impl StateApi for State where } fn subscribe_runtime_version(&self, _meta: Self::Metadata, subscriber: Subscriber) { - let stream = match self.client.storage_changes_notification_stream(Some(&[StorageKey(storage::well_known_keys::CODE.to_vec())])) { + let stream = match self.client.storage_changes_notification_stream( + Some(&[StorageKey(storage::well_known_keys::CODE.to_vec())]) + ) { Ok(stream) => stream, Err(err) => { let _ = subscriber.reject(error::Error::from(err).into()); @@ -467,11 +558,15 @@ pub(crate) fn split_range(size: usize, middle: Option) -> (Range, (range1, range2) } -fn invalid_block_range(from: Option<&H>, to: Option<&H>, reason: String) -> error::ErrorKind { +fn invalid_block_range(from: Option<&H>, to: Option<&H>, reason: String) -> error::Error { let to_string = |x: Option<&H>| match x { None => "unknown hash".into(), Some(h) => format!("{} ({})", h.number(), h.hash()), }; - error::ErrorKind::InvalidBlockRange(to_string(from), to_string(to), reason) + error::Error::InvalidBlockRange { + from: to_string(from), + to: to_string(to), + details: reason, + } } diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index a63b8489eb09007e996ed1d8f832cbca0ea84444..0ad983fc1101af5548bd94759764bcdded1c45c1 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -15,11 +15,12 @@ // along with Substrate. If not, see . use super::*; -use self::error::{Error, ErrorKind}; +use self::error::Error; -use sr_io::twox_128; use assert_matches::assert_matches; use consensus::BlockOrigin; +use primitives::storage::well_known_keys; +use sr_io::blake2_256; use test_client::{self, runtime, AccountKeyring, TestClient, BlockBuilderExt}; #[test] @@ -28,11 +29,46 @@ fn should_return_storage() { let client = Arc::new(test_client::new()); let genesis_hash = client.genesis_hash(); let client = State::new(client, Subscriptions::new(core.executor())); + let key = StorageKey(b":code".to_vec()); + assert!( + client.storage(key.clone(), Some(genesis_hash).into()) + .map(|x| x.map(|x| x.0.len())).unwrap().unwrap() + > 195_000 + ); assert_matches!( - client.storage(StorageKey(vec![10]), Some(genesis_hash).into()), - Ok(None) - ) + client.storage_hash(key.clone(), Some(genesis_hash).into()).map(|x| x.is_some()), + Ok(true) + ); + assert!( + client.storage_size(key.clone(), None).unwrap().unwrap() + > 195_000 + ); +} + +#[test] +fn should_return_child_storage() { + let core = ::tokio::runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let genesis_hash = client.genesis_hash(); + let client = State::new(client, Subscriptions::new(core.executor())); + let child_key = StorageKey(well_known_keys::CHILD_STORAGE_KEY_PREFIX.iter().chain(b"test").cloned().collect()); + let key = StorageKey(b"key".to_vec()); + + + assert_matches!( + client.child_storage(child_key.clone(), key.clone(), Some(genesis_hash).into()), + Ok(Some(StorageData(ref d))) if d[0] == 42 && d.len() == 1 + ); + assert_matches!( + client.child_storage_hash(child_key.clone(), key.clone(), Some(genesis_hash).into()) + .map(|x| x.is_some()), + Ok(true) + ); + assert_matches!( + client.child_storage_size(child_key.clone(), key.clone(), None), + Ok(Some(1)) + ); } #[test] @@ -44,7 +80,7 @@ fn should_call_contract() { assert_matches!( client.call("balanceOf".into(), Bytes(vec![1,2,3]), Some(genesis_hash).into()), - Err(Error(ErrorKind::Client(client::error::ErrorKind::Execution(_)), _)) + Err(Error::Client(client::error::Error::Execution(_))) ) } @@ -88,7 +124,7 @@ fn should_send_initial_storage_changes_and_notifications() { { let api = State::new(Arc::new(test_client::new()), Subscriptions::new(remote)); - let alice_balance_key = twox_128(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); + let alice_balance_key = blake2_256(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); api.subscribe_storage(Default::default(), subscriber, Some(vec![ StorageKey(alice_balance_key.to_vec()), @@ -147,7 +183,7 @@ fn should_query_storage() { let block2_hash = add_block(1); let genesis_hash = client.genesis_hash(); - let alice_balance_key = twox_128(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); + let alice_balance_key = blake2_256(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); let mut expected = vec![ StorageChangeSet { @@ -221,7 +257,7 @@ fn should_return_runtime_version() { assert_eq!( ::serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), - r#"{"specName":"test","implName":"parity-test","authoringVersion":1,"specVersion":1,"implVersion":1,"apis":[["0xdf6acb689907609b",2],["0x37e397fc7c91f5e4",1],["0xd2bc9897eed08f15",1],["0x40fe3ad401f8959a",3],["0xc6e9a76309f39b09",1],["0xdd718d5cc53262d4",1],["0xf78b278be53f454c",1],["0x7801759919ee83e5",1]]}"# + r#"{"specName":"test","implName":"parity-test","authoringVersion":1,"specVersion":1,"implVersion":1,"apis":[["0xdf6acb689907609b",2],["0x37e397fc7c91f5e4",1],["0xd2bc9897eed08f15",1],["0x40fe3ad401f8959a",3],["0xc6e9a76309f39b09",1],["0xdd718d5cc53262d4",1],["0xcbca25e39f142387",1],["0xf78b278be53f454c",1],["0x7801759919ee83e5",1]]}"# ); } @@ -246,3 +282,4 @@ fn should_notify_on_runtime_version_initially() { // no more notifications on this channel assert_eq!(core.block_on(next.into_future()).unwrap().0, None); } + diff --git a/core/rpc/src/system/error.rs b/core/rpc/src/system/error.rs index d3c7e8b33387048385abcad3e620a615646f0dc5..bdd4cbe667e59a084d3b83f41b62e88f1518d5cd 100644 --- a/core/rpc/src/system/error.rs +++ b/core/rpc/src/system/error.rs @@ -16,40 +16,33 @@ //! System RPC module errors. -use error_chain::*; - use crate::rpc; -use crate::errors; use crate::system::helpers::Health; -error_chain! { - errors { - /// Node is not fully functional - NotHealthy(h: Health) { - description("node is not healthy"), - display("Node is not fully functional: {}", h) - } +/// System RPC Result type. +pub type Result = std::result::Result; - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), - } - } +/// System RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Provided block range couldn't be resolved to a list of blocks. + #[display(fmt = "Node is not fully functional: {}", _0)] + NotHealthy(Health), } -const ERROR: i64 = 2000; +impl std::error::Error for Error {} + +/// Base code for all system errors. +const BASE_ERROR: i64 = 2000; impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), - Error(ErrorKind::NotHealthy(h), _) => rpc::Error { - code: rpc::ErrorCode::ServerError(ERROR + 1), - message: "node is not healthy".into(), - data:serde_json::to_value(h).ok(), + Error::NotHealthy(ref h) => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message: format!("{}", e), + data: serde_json::to_value(h).ok(), }, - e => errors::internal(e), } } } diff --git a/core/rpc/src/system/helpers.rs b/core/rpc/src/system/helpers.rs index cd248268f26671179f93590487770fcef9c6ee53..00e2ba9f408b7658ccb45a10d62642bbfed1209c 100644 --- a/core/rpc/src/system/helpers.rs +++ b/core/rpc/src/system/helpers.rs @@ -17,7 +17,7 @@ //! Substrate system API helpers. use std::fmt; -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use serde_json::{Value, map::Map}; /// Node properties diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index 42419261d5fad7dae106802eaffdf3b1b4149e0f..e23bb696211ec0022a71ef6a994e2adf7a6e2e98 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -112,14 +112,14 @@ impl SystemApi::Number> for Sy fn system_health(&self) -> Result { Ok(Health { - peers: self.sync.peers().len(), + peers: self.sync.peers_debug_info().len(), is_syncing: self.sync.is_major_syncing(), should_have_peers: self.should_have_peers, }) } fn system_peers(&self) -> Result::Number>>> { - Ok(self.sync.peers().into_iter().map(|(peer_id, p)| PeerInfo { + Ok(self.sync.peers_debug_info().into_iter().map(|(peer_id, p)| PeerInfo { peer_id: peer_id.to_base58(), roles: format!("{:?}", p.roles), protocol_version: p.protocol_version, diff --git a/core/rpc/src/system/tests.rs b/core/rpc/src/system/tests.rs index b4b71a7937af16e988e6e156a1bdecde1b05ecca..14cd421fd19e2770ab00d781a31344dc7f802e21 100644 --- a/core/rpc/src/system/tests.rs +++ b/core/rpc/src/system/tests.rs @@ -59,7 +59,7 @@ impl network::SyncProvider for Status { } } - fn peers(&self) -> Vec<(PeerId, NetworkPeerInfo)> { + fn peers_debug_info(&self) -> Vec<(PeerId, NetworkPeerInfo)> { let mut peers = vec![]; for _peer in 0..self.peers { peers.push( diff --git a/core/serializer/Cargo.toml b/core/serializer/Cargo.toml index 6aade8fc6ad5e15d6e1c51d62565ab801ffd8f6c..ae320e4277bb5d54a492efc324b04d7796d70298 100644 --- a/core/serializer/Cargo.toml +++ b/core/serializer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 7799e805e6c52abf1c6da4a60374ccad11a55a36..e27c2d61b3007675457bcb3fd5ae4b234a4fa504 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -1,21 +1,20 @@ [package] name = "substrate-service" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] +derive_more = "0.14.0" futures = "0.1.17" parking_lot = "0.7.1" -error-chain = "0.12" lazy_static = "1.0" log = "0.4" -slog = "^2" +slog = {version = "^2", features = ["nested-values"]} tokio = "0.1.7" exit-future = "0.1" -serde = "1.0" +serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -serde_derive = "1.0" target_info = "0.1" inherents = { package = "substrate-inherents", path = "../../core/inherents" } keystore = { package = "substrate-keystore", path = "../../core/keystore" } @@ -35,3 +34,7 @@ offchain = { package = "substrate-offchain", path = "../../core/offchain" } [dev-dependencies] substrate-test-client = { path = "../test-client" } +node-executor = { path = "../../node/executor" } +node-primitives = { path = "../../node/primitives" } +node-runtime = { path = "../../node/runtime" } +grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 36cbee9039395737edb62df50fa0d54d4a80fac3..4df3b06cdf1ca58456710bfdee9fccf925a4c9ee 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -21,7 +21,7 @@ use futures::Future; use log::{info, warn}; use runtime_primitives::generic::{SignedBlock, BlockId}; -use runtime_primitives::traits::{As, Block, Header, NumberFor}; +use runtime_primitives::traits::{SaturatedConversion, Zero, One, Block, Header, NumberFor}; use consensus_common::import_queue::{ImportQueue, IncomingBlock, Link}; use network::message; @@ -50,7 +50,7 @@ pub fn export_blocks( let mut block = from; let last = match to { - Some(v) if v == As::sa(0) => As::sa(1), + Some(v) if v.is_zero() => One::one(), Some(v) => v, None => client.info()?.chain.best_number, }; @@ -66,8 +66,8 @@ pub fn export_blocks( }); info!("Exporting blocks from #{} to #{}", block, last); if !json { - let last_: u64 = last.as_(); - let block_: u64 = block.as_(); + let last_: u64 = last.saturated_into::(); + let block_: u64 = block.saturated_into::(); let len: u64 = last_ - block_ + 1; output.write(&len.encode())?; } @@ -87,13 +87,13 @@ pub fn export_blocks( }, None => break, } - if block.as_() % 10000 == 0 { + if (block % 10000.into()).is_zero() { info!("#{}", block); } if block == last { break; } - block += As::sa(1); + block += One::one(); } Ok(()) } @@ -127,7 +127,8 @@ pub fn import_blocks( { let client = new_client::(&config)?; // FIXME #1134 this shouldn't need a mutable config. - let queue = components::FullComponents::::build_import_queue(&mut config, client.clone())?; + let select_chain = components::FullComponents::::build_select_chain(&mut config, client.clone())?; + let queue = components::FullComponents::::build_import_queue(&mut config, client.clone(), select_chain)?; let (wait_send, wait_recv) = std::sync::mpsc::channel(); let wait_link = WaitLink::new(wait_send); @@ -201,7 +202,7 @@ pub fn revert_chain( let reverted = client.revert(blocks)?; let info = client.info()?.chain; - if reverted.as_() == 0 { + if reverted.is_zero() { info!("There aren't any non-finalized blocks to revert."); } else { info!("Reverted {} blocks. Best: #{} ({})", reverted, info.best_number, info.best_hash); diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index 78aad64dd0730a708dffe83a619d65c953fc4529..6af0f5766e80c3e0bf7ffd6fcaa9c587ba31e30a 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -19,7 +19,7 @@ use std::collections::HashMap; use std::fs::File; use std::path::PathBuf; -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use primitives::storage::{StorageKey, StorageData}; use runtime_primitives::{BuildStorage, StorageOverlay, ChildrenStorageOverlay}; use serde_json as json; diff --git a/core/service/src/components.rs b/core/service/src/components.rs index ba27acb5820e6064711b2d9a1ecbd0e741e48c75..6e6503fc3df6a316caf2f9a9bb54952b5137e9d1 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -16,15 +16,15 @@ //! Substrate service components. -use std::{sync::Arc, net::SocketAddr, marker::PhantomData, ops::Deref, ops::DerefMut}; +use std::{sync::Arc, net::SocketAddr, ops::Deref, ops::DerefMut}; use serde::{Serialize, de::DeserializeOwned}; use tokio::runtime::TaskExecutor; use crate::chain_spec::ChainSpec; use client_db; use client::{self, Client, runtime_api}; use crate::{error, Service, maybe_start_server}; -use consensus_common::import_queue::ImportQueue; -use network::{self, OnDemand}; +use consensus_common::{import_queue::ImportQueue, SelectChain}; +use network::{self, OnDemand, FinalityProofProvider}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; use runtime_primitives::{ @@ -72,7 +72,7 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecu client_db::light::LightStorage<::Block>, network::OnDemand<::Block> >, - network::OnDemand<::Block> + network::OnDemand<::Block>, >, client::LocalCallExecutor< client::light::backend::Backend< @@ -143,6 +143,7 @@ pub trait StartRPC { system_info: SystemInfo, rpc_http: Option, rpc_ws: Option, + rpc_ws_max_connections: Option, rpc_cors: Option>, task_executor: TaskExecutor, transaction_pool: Arc>, @@ -162,6 +163,7 @@ impl StartRPC for C where rpc_system_info: SystemInfo, rpc_http: Option, rpc_ws: Option, + rpc_ws_max_connections: Option, rpc_cors: Option>, task_executor: TaskExecutor, transaction_pool: Arc>, @@ -186,8 +188,19 @@ impl StartRPC for C where }; Ok(( - maybe_start_server(rpc_http, |address| rpc::start_http(address, rpc_cors.as_ref(), handler()))?, - maybe_start_server(rpc_ws, |address| rpc::start_ws(address, rpc_cors.as_ref(), handler()))?.map(Mutex::new), + maybe_start_server( + rpc_http, + |address| rpc::start_http(address, rpc_cors.as_ref(), handler()), + )?, + maybe_start_server( + rpc_ws, + |address| rpc::start_ws( + address, + rpc_ws_max_connections, + rpc_cors.as_ref(), + handler(), + ), + )?.map(Mutex::new), )) } } @@ -304,9 +317,11 @@ pub trait ServiceFactory: 'static + Sized { /// Extended light service type. type LightService: ServiceTrait>; /// ImportQueue for full client - type FullImportQueue: consensus_common::import_queue::ImportQueue + 'static; + type FullImportQueue: ImportQueue + 'static; /// ImportQueue for light clients - type LightImportQueue: consensus_common::import_queue::ImportQueue + 'static; + type LightImportQueue: ImportQueue + 'static; + /// The Fork Choice Strategy for the chain + type SelectChain: SelectChain + 'static; //TODO: replace these with a constructor trait. that TransactionPool implements. (#1242) /// Extrinsic pool constructor for the full client. @@ -320,6 +335,17 @@ pub trait ServiceFactory: 'static + Sized { fn build_network_protocol(config: &FactoryFullConfiguration) -> Result; + /// Build finality proof provider for serving network requests on full node. + fn build_finality_proof_provider( + client: Arc> + ) -> Result>>, error::Error>; + + /// Build the Fork Choice algorithm for full client + fn build_select_chain( + config: &mut FactoryFullConfiguration, + client: Arc>, + ) -> Result; + /// Build full service. fn new_full(config: FactoryFullConfiguration, executor: TaskExecutor) -> Result; @@ -330,7 +356,8 @@ pub trait ServiceFactory: 'static + Sized { /// ImportQueue for a full client fn build_full_import_queue( config: &mut FactoryFullConfiguration, - _client: Arc> + _client: Arc>, + _select_chain: Self::SelectChain, ) -> Result { if let Some(name) = config.chain_spec.consensus_engine() { match name { @@ -378,6 +405,8 @@ pub trait Components: Sized + 'static { >; /// Our Import Queue type ImportQueue: ImportQueue> + 'static; + /// The Fork Choice Strategy for the chain + type SelectChain: SelectChain>; /// Create client. fn build_client( @@ -398,13 +427,24 @@ pub trait Components: Sized + 'static { /// instance of import queue for clients fn build_import_queue( config: &mut FactoryFullConfiguration, - client: Arc> + client: Arc>, + select_chain: Option, ) -> Result; + + /// Finality proof provider for serving network requests. + fn build_finality_proof_provider( + client: Arc> + ) -> Result::Block>>>, error::Error>; + + /// Build fork choice selector + fn build_select_chain( + config: &mut FactoryFullConfiguration, + client: Arc> + ) -> Result, error::Error>; } /// A struct that implement `Components` for the full client. pub struct FullComponents { - _factory: PhantomData, service: Service>, } @@ -416,7 +456,6 @@ impl FullComponents { ) -> Result { Ok( Self { - _factory: Default::default(), service: Service::new(config, task_executor)?, } ) @@ -445,6 +484,7 @@ impl Components for FullComponents { type ImportQueue = Factory::FullImportQueue; type RuntimeApi = Factory::RuntimeApi; type RuntimeServices = Factory::FullService; + type SelectChain = Factory::SelectChain; fn build_client( config: &FactoryFullConfiguration, @@ -457,6 +497,7 @@ impl Components for FullComponents { { let db_settings = client_db::DatabaseSettings { cache_size: config.database_cache_size.map(|u| u as usize), + state_cache_size: config.state_cache_size, path: config.database_path.as_str().into(), pruning: config.pruning.clone(), }; @@ -468,23 +509,39 @@ impl Components for FullComponents { )?), None)) } - fn build_transaction_pool(config: TransactionPoolOptions, client: Arc>) - -> Result, error::Error> - { + fn build_transaction_pool( + config: TransactionPoolOptions, + client: Arc> + ) -> Result, error::Error> { Factory::build_full_transaction_pool(config, client) } fn build_import_queue( config: &mut FactoryFullConfiguration, - client: Arc> + client: Arc>, + select_chain: Option, ) -> Result { - Factory::build_full_import_queue(config, client) + let select_chain = select_chain + .ok_or(error::Error::SelectChainRequired)?; + Factory::build_full_import_queue(config, client, select_chain) + } + + fn build_select_chain( + config: &mut FactoryFullConfiguration, + client: Arc> + ) -> Result, error::Error> { + Self::Factory::build_select_chain(config, client).map(Some) + } + + fn build_finality_proof_provider( + client: Arc> + ) -> Result::Block>>>, error::Error> { + Factory::build_finality_proof_provider(client) } } /// A struct that implement `Components` for the light client. pub struct LightComponents { - _factory: PhantomData, service: Service>, } @@ -496,7 +553,6 @@ impl LightComponents { ) -> Result { Ok( Self { - _factory: Default::default(), service: Service::new(config, task_executor)?, } ) @@ -519,6 +575,7 @@ impl Components for LightComponents { type ImportQueue = ::LightImportQueue; type RuntimeApi = Factory::RuntimeApi; type RuntimeServices = Factory::LightService; + type SelectChain = Factory::SelectChain; fn build_client( config: &FactoryFullConfiguration, @@ -532,6 +589,7 @@ impl Components for LightComponents { { let db_settings = client_db::DatabaseSettings { cache_size: None, + state_cache_size: config.state_cache_size, path: config.database_path.as_str().into(), pruning: config.pruning.clone(), }; @@ -552,35 +610,47 @@ impl Components for LightComponents { fn build_import_queue( config: &mut FactoryFullConfiguration, - client: Arc> + client: Arc>, + _select_chain: Option, ) -> Result { Factory::build_light_import_queue(config, client) } + + fn build_finality_proof_provider( + _client: Arc> + ) -> Result::Block>>>, error::Error> { + Ok(None) + } + fn build_select_chain( + _config: &mut FactoryFullConfiguration, + _client: Arc> + ) -> Result, error::Error> { + Ok(None) + } } #[cfg(test)] mod tests { use super::*; - use parity_codec::Encode; use consensus_common::BlockOrigin; - use substrate_test_client::{self, TestClient, AccountKeyring, runtime::{Extrinsic, Transfer}}; + use client::LongestChain; + use substrate_test_client::{self, TestClient, AccountKeyring, runtime::Transfer}; #[test] fn should_remove_transactions_from_the_pool() { let client = Arc::new(substrate_test_client::new()); let pool = TransactionPool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone())); - let transaction = { - let transfer = Transfer { - amount: 5, - nonce: 0, - from: AccountKeyring::Alice.into(), - to: Default::default(), - }; - let signature = AccountKeyring::from_public(&transfer.from).unwrap().sign(&transfer.encode()).into(); - Extrinsic::Transfer(transfer, signature) - }; + let transaction = Transfer { + amount: 5, + nonce: 0, + from: AccountKeyring::Alice.into(), + to: Default::default(), + }.into_signed_tx(); + let best = LongestChain::new(client.backend().clone(), client.import_lock()) + .best_chain().unwrap(); + // store the transaction in the pool - pool.submit_one(&BlockId::hash(client.best_block_header().unwrap().hash()), transaction.clone()).unwrap(); + pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); // import the block let mut builder = client.new_block().unwrap(); diff --git a/core/service/src/config.rs b/core/service/src/config.rs index 6f0f5032e19549673e1f02e16eaecc1c8ca6429d..5996ec837d38ea707bb3bcec9a92b6b515ca14b6 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -48,6 +48,8 @@ pub struct Configuration { pub database_path: String, /// Cache Size for internal database in MiB pub database_cache_size: Option, + /// Size of internal state cache in Bytes + pub state_cache_size: usize, /// Pruning settings. pub pruning: PruningMode, /// Additional key seeds. @@ -64,6 +66,8 @@ pub struct Configuration { pub rpc_http: Option, /// RPC over Websockets binding address. `None` if disabled. pub rpc_ws: Option, + /// Maximum number of connections for WebSockets RPC server. `None` if default. + pub rpc_ws_max_connections: Option, /// CORS settings for HTTP & WS servers. `None` if all origins are allowed. pub rpc_cors: Option>, /// Telemetry service URL. `None` if disabled. @@ -76,6 +80,8 @@ pub struct Configuration { pub force_authoring: bool, /// Disable GRANDPA when running in validator mode pub disable_grandpa: bool, + /// Node keystore's password + pub password: String, } impl Configuration { @@ -93,18 +99,21 @@ impl Configuration = std::result::Result; - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - Consensus(consensus_common::Error, consensus_common::ErrorKind) #[doc="Consesus error"]; - Network(network::error::Error, network::error::ErrorKind) #[doc="Network error"]; - Keystore(keystore::Error, keystore::ErrorKind) #[doc="Keystore error"]; +/// Service errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// IO error. + Io(std::io::Error), + /// Consensus error. + Consensus(consensus_common::Error), + /// Network error. + Network(network::error::Error), + /// Keystore error. + Keystore(keystore::Error), + /// Best chain selection strategy is missing. + #[display(fmt="Best chain selection strategy (SelectChain) is not provided.")] + SelectChainRequired, + /// Other error. + Other(String), +} + +impl<'a> From<&'a str> for Error { + fn from(s: &'a str) -> Self { + Error::Other(s.into()) } +} - errors { +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Io(ref err) => Some(err), + Error::Consensus(ref err) => Some(err), + Error::Network(ref err) => Some(err), + Error::Keystore(ref err) => Some(err), + _ => None, + } } } diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 789b05e9dc94cfcff335826e4fb5579de63029a7..2a69dc83c7bbccdd1f40e91a47748c90375ead13 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -20,14 +20,16 @@ #![warn(missing_docs)] mod components; -mod error; mod chain_spec; pub mod config; pub mod chain_ops; +pub mod error; use std::io; use std::net::SocketAddr; use std::collections::HashMap; +use futures::sync::mpsc; +use parking_lot::Mutex; use client::BlockchainEvents; use exit_future::Signal; @@ -38,11 +40,11 @@ use log::{info, warn, debug}; use parity_codec::{Encode, Decode}; use primitives::Pair; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, As}; +use runtime_primitives::traits::{Header, SaturatedConversion}; use substrate_executor::NativeExecutor; use tel::{telemetry, SUBSTRATE_INFO}; -pub use self::error::{ErrorKind, Error}; +pub use self::error::Error; pub use config::{Configuration, Roles, PruningMode}; pub use chain_spec::{ChainSpec, Properties}; pub use transaction_pool::txpool::{ @@ -62,7 +64,7 @@ use components::{StartRPC, MaintainTransactionPool, OffchainWorker}; #[doc(hidden)] pub use std::{ops::Deref, result::Result, sync::Arc}; #[doc(hidden)] -pub use network::OnDemand; +pub use network::{FinalityProofProvider, OnDemand}; #[doc(hidden)] pub use tokio::runtime::TaskExecutor; @@ -71,6 +73,7 @@ const DEFAULT_PROTOCOL_ID: &str = "sup"; /// Substrate service. pub struct Service { client: Arc>, + select_chain: Option<::SelectChain>, network: Option>>, transaction_pool: Arc>, inherents_pool: Arc>>, @@ -82,6 +85,7 @@ pub struct Service { _rpc: Box<::std::any::Any + Send + Sync>, _telemetry: Option>, _offchain_workers: Option, ComponentBlock>>>, + _telemetry_on_connect_sinks: Arc>>>, } /// Creates bare client without any networking. @@ -96,7 +100,27 @@ pub fn new_client(config: &FactoryFullConfi Ok(client) } +/// Stream of events for connection established to a telemetry server. +pub type TelemetryOnConnectNotifications = mpsc::UnboundedReceiver<()>; + +/// Used to hook on telemetry connection established events. +pub struct TelemetryOnConnect<'a> { + /// Handle to a future that will resolve on exit. + pub on_exit: Box + Send + 'static>, + /// Event stream. + pub telemetry_connection_sinks: TelemetryOnConnectNotifications, + /// Executor to which the hook is spawned. + pub executor: &'a TaskExecutor, +} + impl Service { + /// Get event stream for telemetry connection established events. + pub fn telemetry_on_connect_stream(&self) -> TelemetryOnConnectNotifications { + let (sink, stream) = mpsc::unbounded(); + self._telemetry_on_connect_sinks.lock().push(sink); + stream + } + /// Creates a new service. pub fn new( mut config: FactoryFullConfiguration, @@ -118,7 +142,7 @@ impl Service { let public_key = match keystore.contents()?.get(0) { Some(public_key) => public_key.clone(), None => { - let key = keystore.generate("")?; + let key = keystore.generate(&config.password)?; let public_key = key.public(); info!("Generated a new keypair: {:?}", public_key); @@ -127,19 +151,28 @@ impl Service { }; let (client, on_demand) = Components::build_client(&config, executor)?; - let import_queue = Box::new(Components::build_import_queue(&mut config, client.clone())?); - let best_header = client.best_block_header()?; + let select_chain = Components::build_select_chain(&mut config, client.clone())?; + let import_queue = Box::new(Components::build_import_queue( + &mut config, + client.clone(), + select_chain.clone(), + )?); + let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; + let chain_info = client.info()?.chain; let version = config.full_version(); - info!("Best block: #{}", best_header.number()); - telemetry!(SUBSTRATE_INFO; "node.start"; "height" => best_header.number().as_(), "best" => ?best_header.hash()); + info!("Highest known block at #{}", chain_info.best_number); + telemetry!(SUBSTRATE_INFO; "node.start"; + "height" => chain_info.best_number.saturated_into::(), + "best" => ?chain_info.best_hash + ); let network_protocol = ::build_network_protocol(&config)?; let transaction_pool = Arc::new( Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? ); let transaction_pool_adapter = Arc::new(TransactionPoolAdapter:: { - imports_external_transactions: !(config.roles == Roles::LIGHT), + imports_external_transactions: !config.roles.is_light(), pool: transaction_pool.clone(), client: client.clone(), }); @@ -148,7 +181,8 @@ impl Service { config: network::config::ProtocolConfig { roles: config.roles }, network_config: config.network.clone(), chain: client.clone(), - on_demand: on_demand.as_ref().map(|d| d.clone() as _), + finality_proof_provider, + on_demand, transaction_pool: transaction_pool_adapter.clone() as _, specialization: network_protocol, }; @@ -163,22 +197,11 @@ impl Service { DEFAULT_PROTOCOL_ID } }.as_bytes(); - let mut protocol_id = network::ProtocolId::default(); - if protocol_id_full.len() > protocol_id.len() { - warn!("Protocol ID truncated to {} chars", protocol_id.len()); - } - let id_len = protocol_id_full.len().min(protocol_id.len()); - &mut protocol_id[0..id_len].copy_from_slice(&protocol_id_full[0..id_len]); - protocol_id + network::ProtocolId::from(protocol_id_full) }; let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); - let (network, network_chan) = network::Service::new( - network_params, - protocol_id, - import_queue - )?; - on_demand.map(|on_demand| on_demand.set_network_sender(network_chan)); + let network = network::Service::new(network_params, protocol_id, import_queue)?; let inherents_pool = Arc::new(InherentsPool::default()); let offchain_workers = if config.offchain_worker { @@ -300,10 +323,20 @@ impl Service { properties: config.chain_spec.properties(), }; let rpc = Components::RuntimeServices::start_rpc( - client.clone(), network.clone(), has_bootnodes, system_info, config.rpc_http, - config.rpc_ws, config.rpc_cors.clone(), task_executor.clone(), transaction_pool.clone(), + client.clone(), + network.clone(), + has_bootnodes, + system_info, + config.rpc_http, + config.rpc_ws, + config.rpc_ws_max_connections, + config.rpc_cors.clone(), + task_executor.clone(), + transaction_pool.clone(), )?; + let telemetry_connection_sinks: Arc>>> = Default::default(); + // Telemetry let telemetry = config.telemetry_endpoints.clone().map(|endpoints| { let is_authority = config.roles == Roles::AUTHORITY; @@ -313,6 +346,7 @@ impl Service { let impl_name = config.impl_name.to_owned(); let version = version.clone(); let chain_name = config.chain_spec.name().to_owned(); + let telemetry_connection_sinks_ = telemetry_connection_sinks.clone(); Arc::new(tel::init_telemetry(tel::TelemetryConfig { endpoints, on_connect: Box::new(move || { @@ -326,6 +360,10 @@ impl Service { "authority" => is_authority, "network_id" => network_id.clone() ); + + telemetry_connection_sinks_.lock().retain(|sink| { + sink.unbounded_send(()).is_ok() + }); }), })) }); @@ -333,6 +371,7 @@ impl Service { Ok(Service { client, network: Some(network), + select_chain, transaction_pool, inherents_pool, signal: Some(signal), @@ -342,6 +381,7 @@ impl Service { _rpc: Box::new(rpc), _telemetry: telemetry, _offchain_workers: offchain_workers, + _telemetry_on_connect_sinks: telemetry_connection_sinks.clone(), }) } @@ -350,7 +390,7 @@ impl Service { if self.config.roles != Roles::AUTHORITY { return None } let keystore = &self.keystore; if let Ok(Some(Ok(key))) = keystore.contents().map(|keys| keys.get(0) - .map(|k| keystore.load(k, ""))) + .map(|k| keystore.load(k, &self.config.password))) { Some(key) } else { @@ -358,7 +398,7 @@ impl Service { } } - /// return a shared instance of Telemtry (if enabled) + /// return a shared instance of Telemetry (if enabled) pub fn telemetry(&self) -> Option> { self._telemetry.as_ref().map(|t| t.clone()) } @@ -370,6 +410,11 @@ impl Service where Components: components::Components { self.client.clone() } + /// Get clone of select chain. + pub fn select_chain(&self) -> Option<::SelectChain> { + self.select_chain.clone() + } + /// Get shared network instance. pub fn network(&self) -> Arc> { self.network.as_ref().expect("self.network always Some").clone() @@ -470,7 +515,7 @@ impl network::TransactionPool, ComponentBlock< match self.pool.submit_one(&best_block_id, uxt) { Ok(hash) => Some(hash), Err(e) => match e.into_pool_error() { - Ok(txpool::error::Error(txpool::error::ErrorKind::AlreadyImported(hash), _)) => { + Ok(txpool::error::Error::AlreadyImported(hash)) => { hash.downcast::>().ok() .map(|x| x.as_ref().clone()) }, @@ -503,33 +548,77 @@ impl network::TransactionPool, ComponentBlock< /// /// # Example /// -/// ```nocompile +/// ``` +/// # use substrate_service::{ +/// # construct_service_factory, Service, FullBackend, FullExecutor, LightBackend, LightExecutor, +/// # FullComponents, LightComponents, FactoryFullConfiguration, FullClient, TaskExecutor +/// # }; +/// # use transaction_pool::{self, txpool::{Pool as TransactionPool}}; +/// # use network::construct_simple_protocol; +/// # use client::{self, LongestChain}; +/// # use primitives::{Pair as PairT, ed25519}; +/// # use consensus_common::import_queue::{BasicQueue, Verifier}; +/// # use consensus_common::{BlockOrigin, ImportBlock}; +/// # use node_runtime::{GenesisConfig, RuntimeApi}; +/// # use std::sync::Arc; +/// # use node_primitives::Block; +/// # use runtime_primitives::Justification; +/// # use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT}; +/// # use grandpa; +/// # construct_simple_protocol! { +/// # pub struct NodeProtocol where Block = Block { } +/// # } +/// # struct MyVerifier; +/// # impl Verifier for MyVerifier { +/// # fn verify( +/// # &self, +/// # origin: BlockOrigin, +/// # header: B::Header, +/// # justification: Option, +/// # body: Option>, +/// # ) -> Result<(ImportBlock, Option>>), String> { +/// # unimplemented!(); +/// # } +/// # } +/// type FullChainApi = transaction_pool::ChainApi< +/// client::Client, FullExecutor, Block, RuntimeApi>, Block>; +/// type LightChainApi = transaction_pool::ChainApi< +/// client::Client, LightExecutor, Block, RuntimeApi>, Block>; +/// /// construct_service_factory! { /// struct Factory { -/// // Declare the block type +/// // Declare the block type /// Block = Block, -/// // Declare the network protocol and give an initializer. +/// RuntimeApi = RuntimeApi, +/// // Declare the network protocol and give an initializer. /// NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, /// RuntimeDispatch = node_executor::Executor, -/// FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block> +/// FullTransactionPoolApi = FullChainApi /// { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, -/// LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block> +/// LightTransactionPoolApi = LightChainApi /// { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, /// Genesis = GenesisConfig, /// Configuration = (), -/// FullService = Service> -/// { |config, executor| Service::>::new(config, executor) }, -/// // Setup as Consensus Authority (if the role and key are given) +/// FullService = FullComponents +/// { |config, executor| >::new(config, executor) }, +/// // Setup as Consensus Authority (if the role and key are given) /// AuthoritySetup = { -/// |service: Self::FullService, executor: TaskExecutor, key: Arc| { Ok(service) }}, -/// LightService = Service> -/// { |config, executor| Service::>::new(config, executor) }, -/// // Declare the import queue. The import queue is special as it takes two initializers. -/// // The first one is for the initializing the full import queue and the second for the -/// // light import queue. -/// ImportQueue = BasicQueue -/// { |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) } -/// { |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) }, +/// |service: Self::FullService, executor: TaskExecutor, key: Option>| { +/// Ok(service) +/// }}, +/// LightService = LightComponents +/// { |config, executor| >::new(config, executor) }, +/// FullImportQueue = BasicQueue +/// { |_, client, _| Ok(BasicQueue::new(Arc::new(MyVerifier), client, None, None, None)) }, +/// LightImportQueue = BasicQueue +/// { |_, client| Ok(BasicQueue::new(Arc::new(MyVerifier), client, None, None, None)) }, +/// SelectChain = LongestChain, Self::Block> +/// { |config: &FactoryFullConfiguration, client: Arc>| { +/// Ok(LongestChain::new(client.backend().clone(), client.import_lock())) +/// }}, +/// FinalityProofProvider = { |client: Arc>| { +/// Ok(Some(Arc::new(grandpa::FinalityProofProvider::new(client.clone(), client)) as _)) +/// }}, /// } /// } /// ``` @@ -553,6 +642,9 @@ macro_rules! construct_service_factory { { $( $full_import_queue_init:tt )* }, LightImportQueue = $light_import_queue:ty { $( $light_import_queue_init:tt )* }, + SelectChain = $select_chain:ty + { $( $select_chain_init:tt )* }, + FinalityProofProvider = { $( $finality_proof_provider_init:tt )* }, } ) => { $( #[$attr] )* @@ -572,6 +664,7 @@ macro_rules! construct_service_factory { type LightService = $light_service; type FullImportQueue = $full_import_queue; type LightImportQueue = $light_import_queue; + type SelectChain = $select_chain; fn build_full_transaction_pool( config: $crate::TransactionPoolOptions, @@ -595,11 +688,19 @@ macro_rules! construct_service_factory { ( $( $protocol_init )* ) (config) } + fn build_select_chain( + config: &mut $crate::FactoryFullConfiguration, + client: Arc<$crate::FullClient> + ) -> $crate::Result { + ( $( $select_chain_init )* ) (config, client) + } + fn build_full_import_queue( config: &mut $crate::FactoryFullConfiguration, client: $crate::Arc<$crate::FullClient>, + select_chain: Self::SelectChain ) -> $crate::Result { - ( $( $full_import_queue_init )* ) (config, client) + ( $( $full_import_queue_init )* ) (config, client, select_chain) } fn build_light_import_queue( @@ -609,6 +710,12 @@ macro_rules! construct_service_factory { ( $( $light_import_queue_init )* ) (config, client) } + fn build_finality_proof_provider( + client: Arc<$crate::FullClient> + ) -> Result>>, $crate::Error> { + ( $( $finality_proof_provider_init )* ) (client) + } + fn new_light( config: $crate::FactoryFullConfiguration, executor: $crate::TaskExecutor diff --git a/core/service/test/Cargo.toml b/core/service/test/Cargo.toml index b06e7fcb08eabd4b4ade423a8d7e3655efc7c952..38cdd042d6b22cd6cfce80027547c46ef83bcd10 100644 --- a/core/service/test/Cargo.toml +++ b/core/service/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-service-test" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 2d382c8ffa1c2c80b8de9853c7c4d1aa5bc6bc9a..dc4676dc0aff1536648c2561865978fdf76491f7 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -34,16 +34,15 @@ use service::{ Roles, FactoryExtrinsic, }; -use network::{multiaddr, SyncProvider, ManageNetwork}; +use network::{multiaddr, Multiaddr, SyncProvider, ManageNetwork}; use network::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPeerMode}; -use sr_primitives::traits::As; use sr_primitives::generic::BlockId; use consensus::{ImportBlock, BlockImport}; struct TestNet { runtime: Runtime, - authority_nodes: Vec<(u32, Arc)>, - full_nodes: Vec<(u32, Arc)>, + authority_nodes: Vec<(u32, Arc, Multiaddr)>, + full_nodes: Vec<(u32, Arc, Multiaddr)>, _light_nodes: Vec<(u32, Arc)>, chain_spec: FactoryChainSpec, base_port: u16, @@ -54,7 +53,7 @@ impl TestNet { pub fn run_until_all_full bool + 'static>(&mut self, predicate: P) { let full_nodes = self.full_nodes.clone(); let interval = Interval::new_interval(Duration::from_millis(100)).map_err(|_| ()).for_each(move |_| { - if full_nodes.iter().all(|&(ref id, ref service)| predicate(*id, service)) { + if full_nodes.iter().all(|&(ref id, ref service, _)| predicate(*id, service)) { Err(()) } else { Ok(()) @@ -112,6 +111,7 @@ fn node_config ( keystore_path: root.join("key").to_str().unwrap().into(), database_path: root.join("db").to_str().unwrap().into(), database_cache_size: None, + state_cache_size: 16777216, pruning: Default::default(), keys: keys, chain_spec: (*spec).clone(), @@ -120,12 +120,14 @@ fn node_config ( execution_strategies: Default::default(), rpc_http: None, rpc_ws: None, + rpc_ws_max_connections: None, rpc_cors: None, telemetry_endpoints: None, default_heap_pages: None, offchain_worker: false, force_authoring: false, disable_grandpa: false, + password: "".to_string(), } } @@ -152,16 +154,24 @@ impl TestNet { let base_port = self.base_port; let spec = self.chain_spec.clone(); let executor = self.runtime.executor(); - self.authority_nodes.extend(authorities.iter().enumerate().map(|(index, key)| ((index + nodes) as u32, - Arc::new(F::new_full(node_config::(index as u32, &spec, Roles::AUTHORITY, Some(key.clone()), base_port, &temp), executor.clone()) - .expect("Error creating test node service"))) - )); + self.authority_nodes.extend(authorities.iter().enumerate().map(|(index, key)| { + let node_config = node_config::(index as u32, &spec, Roles::AUTHORITY, Some(key.clone()), base_port, &temp); + let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); + let service = Arc::new(F::new_full(node_config, executor.clone()) + .expect("Error creating test node service")); + let addr = addr.with(multiaddr::Protocol::P2p(service.network().local_peer_id().into())); + ((index + nodes) as u32, service, addr) + })); nodes += authorities.len(); - self.full_nodes.extend((nodes..nodes + full as usize).map(|index| (index as u32, - Arc::new(F::new_full(node_config::(index as u32, &spec, Roles::FULL, None, base_port, &temp), executor.clone()) - .expect("Error creating test node service"))) - )); + self.full_nodes.extend((nodes..nodes + full as usize).map(|index| { + let node_config = node_config::(index as u32, &spec, Roles::FULL, None, base_port, &temp); + let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); + let service = Arc::new(F::new_full(node_config, executor.clone()) + .expect("Error creating test node service")); + let addr = addr.with(multiaddr::Protocol::P2p(service.network().local_peer_id().into())); + (index as u32, service, addr) + })); nodes += full as usize; self._light_nodes.extend((nodes..nodes + light as usize).map(|index| (index as u32, @@ -180,12 +190,12 @@ pub fn connectivity(spec: FactoryChainSpec) { let runtime = { let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES, 0, vec![], 30400); info!("Checking star topology"); - let first_address = network.full_nodes[0].1.network().node_id().expect("No node address"); - for (_, service) in network.full_nodes.iter().skip(1) { - service.network().add_reserved_peer(first_address.clone()).expect("Error adding reserved peer"); + let first_address = network.full_nodes[0].2.clone(); + for (_, service, _) in network.full_nodes.iter().skip(1) { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } network.run_until_all_full(|_index, service| - service.network().peers().len() == NUM_NODES as usize - 1 + service.network().peers_debug_info().len() == NUM_NODES as usize - 1 ); network.runtime }; @@ -199,13 +209,13 @@ pub fn connectivity(spec: FactoryChainSpec) { { let mut network = TestNet::::new(&temp, spec, NUM_NODES, 0, vec![], 30400); info!("Checking linked topology"); - let mut address = network.full_nodes[0].1.network().node_id().expect("No node address"); - for (_, service) in network.full_nodes.iter().skip(1) { - service.network().add_reserved_peer(address.clone()).expect("Error adding reserved peer"); - address = service.network().node_id().expect("No node address"); + let mut address = network.full_nodes[0].2.clone(); + for (_, service, node_id) in network.full_nodes.iter().skip(1) { + service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); + address = node_id.clone(); } network.run_until_all_full(|_index, service| { - service.network().peers().len() == NUM_NODES as usize - 1 + service.network().peers_debug_info().len() == NUM_NODES as usize - 1 }); } temp.close().expect("Error removing temp dir"); @@ -219,7 +229,7 @@ where E: Fn(&F::FullService) -> FactoryExtrinsic, { const NUM_NODES: u32 = 10; - const NUM_BLOCKS: usize = 512; + const NUM_BLOCKS: u32 = 512; let temp = TempDir::new("substrate-sync-test").expect("Error creating test dir"); let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES, 0, vec![], 30500); info!("Checking block sync"); @@ -232,14 +242,14 @@ where let import_data = block_factory(&first_service); first_service.client().import_block(import_data, HashMap::new()).expect("Error importing test block"); } - first_service.network().node_id().unwrap() + network.full_nodes[0].2.clone() }; info!("Running sync"); - for (_, service) in network.full_nodes.iter().skip(1) { - service.network().add_reserved_peer(first_address.clone()).expect("Error adding reserved peer"); + for (_, service, _) in network.full_nodes.iter().skip(1) { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } network.run_until_all_full(|_index, service| - service.client().info().unwrap().chain.best_number == As::sa(NUM_BLOCKS as u64) + service.client().info().unwrap().chain.best_number == NUM_BLOCKS.into() ); info!("Checking extrinsic propagation"); let first_service = network.full_nodes[0].1.clone(); @@ -255,26 +265,26 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) F: ServiceFactory, { const NUM_NODES: u32 = 20; - const NUM_BLOCKS: u64 = 200; + const NUM_BLOCKS: u32 = 200; let temp = TempDir::new("substrate-conensus-test").expect("Error creating test dir"); let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES / 2, 0, authorities, 30600); info!("Checking consensus"); - let first_address = network.authority_nodes[0].1.network().node_id().unwrap(); - for (_, service) in network.full_nodes.iter() { - service.network().add_reserved_peer(first_address.clone()).expect("Error adding reserved peer"); + let first_address = network.authority_nodes[0].2.clone(); + for (_, service, _) in network.full_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - for (_, service) in network.authority_nodes.iter().skip(1) { - service.network().add_reserved_peer(first_address.clone()).expect("Error adding reserved peer"); + for (_, service, _) in network.authority_nodes.iter().skip(1) { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } network.run_until_all_full(|_index, service| { - service.client().info().unwrap().chain.finalized_number >= As::sa(NUM_BLOCKS / 2) + service.client().info().unwrap().chain.finalized_number >= (NUM_BLOCKS / 2).into() }); info!("Adding more peers"); network.insert_nodes(&temp, NUM_NODES / 2, 0, vec![]); - for (_, service) in network.full_nodes.iter() { - service.network().add_reserved_peer(first_address.clone()).expect("Error adding reserved peer"); + for (_, service, _) in network.full_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } network.run_until_all_full(|_index, service| - service.client().info().unwrap().chain.finalized_number >= As::sa(NUM_BLOCKS) + service.client().info().unwrap().chain.finalized_number >= NUM_BLOCKS.into() ); } diff --git a/core/sr-api-macros/Cargo.toml b/core/sr-api-macros/Cargo.toml index 2dfedcfe3bcaed6f53e21123ef46dbc1013720cf..a87b53b7327ae831e7e28e0e2e015b4d8dd039ee 100644 --- a/core/sr-api-macros/Cargo.toml +++ b/core/sr-api-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -8,8 +8,8 @@ edition = "2018" proc-macro = true [dependencies] -quote = "0.6" -syn = { version = "^0.15.22", features = [ "full", "fold", "extra-traits", "visit" ] } +quote = "0.6.12" +syn = { version = "^0.15.30", features = [ "full", "fold", "extra-traits", "visit" ] } proc-macro2 = "0.4" blake2-rfc = "0.2" proc-macro-crate = "0.1.3" @@ -22,6 +22,9 @@ runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } sr-version = { path = "../sr-version" } substrate-primitives = { path = "../primitives" } criterion = "0.2" +consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } +codec = { package = "parity-codec", version = "3.5.1" } +trybuild = "1.0" [[bench]] name = "bench" diff --git a/core/sr-api-macros/src/compile_fail_tests.rs b/core/sr-api-macros/src/compile_fail_tests.rs deleted file mode 100644 index e562f8b2fe598a7e7a994b3c46748ec0952a0ad6..0000000000000000000000000000000000000000 --- a/core/sr-api-macros/src/compile_fail_tests.rs +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// 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 Substrate. If not, see . - -//! Compile fail tests. - -mod declaring_own_block { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - use runtime_primitives::traits::Block as BlockT; - - decl_runtime_apis! { - pub trait Api { - fn test(); - } - } - - fn main() {} - ``` - */ -} - -mod declaring_own_block_with_different_name { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - use runtime_primitives::traits::Block as BlockT; - - decl_runtime_apis! { - pub trait Api { - fn test(); - } - } - - fn main() {} - ``` - */ -} - -mod adding_self_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - pub trait Api { - fn test(&self); - } - } - - fn main() {} - ``` - */ -} - -mod adding_at_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - pub trait Api { - fn test(at: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version_2 { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version("1")] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version_3 { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version()] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod missing_block_generic_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod missing_path_for_trait { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl Api for Runtime { - fn test(data: u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod empty_impl_runtime_apis_call { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! {} - - fn main() {} - ``` - */ -} - -mod type_reference_in_impl_runtime_apis_call { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: &u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod impl_incorrect_method_signature { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: String) {} - } - } - - fn main() {} - ``` - */ -} - -mod impl_two_traits_with_same_name { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - mod second { - decl_runtime_apis! { - pub trait Api { - fn test2(data: u64); - } - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: u64) {} - } - - impl second::Api for Runtime { - fn test2(data: u64) {} - } - } - - fn main() {} - ``` - */ -} - -mod changed_at_unknown_version { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - #[changed_in(2)] - fn test(data: u64); - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} diff --git a/core/sr-api-macros/src/decl_runtime_apis.rs b/core/sr-api-macros/src/decl_runtime_apis.rs index 1f390267a92bb745fb5b5ab82ef2fb55d0f44861..c2501220b6193641467d4a0f081199dabed54d56 100644 --- a/core/sr-api-macros/src/decl_runtime_apis.rs +++ b/core/sr-api-macros/src/decl_runtime_apis.rs @@ -57,9 +57,21 @@ const CHANGED_IN_ATTRIBUTE: &str = "changed_in"; /// /// Is used when a trait method was renamed. const RENAMED_ATTRIBUTE: &str = "renamed"; +/// The `skip_initialize_block` attribute. +/// +/// Is used when a trait method does not require that the block is initialized +/// before being called. +const SKIP_INITIALIZE_BLOCK_ATTRIBUTE: &str = "skip_initialize_block"; +/// The `initialize_block` attribute. +/// +/// A trait method tagged with this attribute, initializes the runtime at +/// certain block. +const INITIALIZE_BLOCK_ATTRIBUTE: &str = "initialize_block"; /// All attributes that we support in the declaration of a runtime api trait. const SUPPORTED_ATTRIBUTE_NAMES: &[&str] = &[ - CORE_TRAIT_ATTRIBUTE, API_VERSION_ATTRIBUTE, CHANGED_IN_ATTRIBUTE, RENAMED_ATTRIBUTE + CORE_TRAIT_ATTRIBUTE, API_VERSION_ATTRIBUTE, CHANGED_IN_ATTRIBUTE, + RENAMED_ATTRIBUTE, SKIP_INITIALIZE_BLOCK_ATTRIBUTE, + INITIALIZE_BLOCK_ATTRIBUTE, ]; /// The structure used for parsing the runtime api declarations. @@ -338,7 +350,12 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { if attrs.contains_key(RENAMED_ATTRIBUTE) && attrs.contains_key(CHANGED_IN_ATTRIBUTE) { return Err(Error::new( - fn_.span(), format!("`{}` and `{}` are not supported at once.", RENAMED_ATTRIBUTE, CHANGED_IN_ATTRIBUTE) + fn_.span(), + format!( + "`{}` and `{}` are not supported at once.", + RENAMED_ATTRIBUTE, + CHANGED_IN_ATTRIBUTE + ) )); } @@ -347,6 +364,15 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { continue; } + let skip_initialize_block = attrs.contains_key(SKIP_INITIALIZE_BLOCK_ATTRIBUTE); + let update_initialized_block = if attrs.contains_key(INITIALIZE_BLOCK_ATTRIBUTE) { + quote!( + || *initialized_block.borrow_mut() = Some(*at) + ) + } else { + quote!(|| ()) + }; + // Parse the renamed attributes. let mut renames = Vec::new(); if let Some((_, a)) = attrs @@ -375,43 +401,63 @@ fn generate_call_api_at_calls(decl: &ItemTrait) -> Result { NC: FnOnce() -> ::std::result::Result + ::std::panic::UnwindSafe, Block: #crate_::runtime_api::BlockT, T: #crate_::runtime_api::CallRuntimeAt, + C: #crate_::runtime_api::Core, >( call_runtime_at: &T, + core_api: &C, at: &#crate_::runtime_api::BlockId, args: Vec, - changes: &mut #crate_::runtime_api::OverlayedChanges, - initialized_block: &mut Option<#crate_::runtime_api::BlockId>, + changes: &std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + initialized_block: &std::cell::RefCell>>, native_call: Option, context: #crate_::runtime_api::ExecutionContext, + recorder: &Option>>>, ) -> #crate_::error::Result<#crate_::runtime_api::NativeOrEncoded> { let version = call_runtime_at.runtime_version_at(at)?; + use #crate_::runtime_api::InitializeBlock; + let initialize_block = if #skip_initialize_block { + InitializeBlock::Skip + } else { + InitializeBlock::Do(&initialized_block) + }; + let update_initialized_block = #update_initialized_block; #( // Check if we need to call the function by an old name. if version.apis.iter().any(|(s, v)| { s == &ID && *v < #versions }) { - return call_runtime_at.call_api_at:: _>( + let ret = call_runtime_at.call_api_at:: _, _>( + core_api, at, #old_names, args, changes, - initialized_block, + initialize_block, None, - context - ); + context, + recorder, + )?; + + update_initialized_block(); + return Ok(ret); } )* - call_runtime_at.call_api_at( + let ret = call_runtime_at.call_api_at( + core_api, at, #trait_fn_name, args, changes, - initialized_block, + initialize_block, native_call, - context - ) + context, + recorder, + )?; + + update_initialized_block(); + Ok(ret) } )); } @@ -637,7 +683,7 @@ impl<'a> ToClientSideDecl<'a> { #crate_::runtime_api::NativeOrEncoded::Encoded(r) => { <#ret_type as #crate_::runtime_api::Decode>::decode(&mut &r[..]) .ok_or_else(|| - #crate_::error::ErrorKind::CallResultDecode( + #crate_::error::Error::CallResultDecode( #function_name ).into() ) diff --git a/core/sr-api-macros/src/impl_runtime_apis.rs b/core/sr-api-macros/src/impl_runtime_apis.rs index 903f3e4028754f3661a51ba9df7736bb105800aa..530405068a13d197161d86e750860431709a46a6 100644 --- a/core/sr-api-macros/src/impl_runtime_apis.rs +++ b/core/sr-api-macros/src/impl_runtime_apis.rs @@ -82,6 +82,7 @@ fn generate_impl_call( }; )* + #[allow(deprecated)] let output = <#runtime as #impl_trait>::#fn_name(#( #pborrow #pnames2 ),*); #c::runtime_api::Encode::encode(&output) ) @@ -263,9 +264,10 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result + 'static> { call: &'static C, - commit_on_success: ::std::cell::RefCell, - initialized_block: ::std::cell::RefCell>, - changes: ::std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + commit_on_success: std::cell::RefCell, + initialized_block: std::cell::RefCell>, + changes: std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + recorder: Option>>>, } // `RuntimeApi` itself is not threadsafe. However, an instance is only available in a @@ -299,6 +301,22 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result #crate_::error::Result<#crate_::runtime_api::RuntimeVersion> { self.call.runtime_version_at(at) } + + fn record_proof(&mut self) { + self.recorder = Some(Default::default()); + } + + fn extract_proof(&mut self) -> Option>> { + self.recorder + .take() + .map(|r| { + r.borrow_mut() + .drain() + .into_iter() + .map(|n| n.data.to_vec()) + .collect() + }) + } } #[cfg(any(feature = "std", test))] @@ -315,6 +333,7 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result Result>, - ) -> #crate_::error::Result<#crate_::runtime_api::NativeOrEncoded> + &Self, + &std::cell::RefCell<#crate_::runtime_api::OverlayedChanges>, + &std::cell::RefCell>>, + &Option>>>, + ) -> #crate_::error::Result<#crate_::runtime_api::NativeOrEncoded>, >( &self, call_api_at: F, @@ -335,8 +356,10 @@ fn generate_runtime_api_base_structures(impls: &[ItemImpl]) -> Result Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { #( #error )* self.call_api_at( - |call_runtime_at, changes, initialized_block| { + |call_runtime_at, core_api, changes, initialized_block, recorder| { #runtime_mod_path #call_api_at_call( call_runtime_at, + core_api, at, params_encoded, changes, @@ -493,6 +517,7 @@ impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { ) }), context, + recorder, ) } ) diff --git a/core/sr-api-macros/src/lib.rs b/core/sr-api-macros/src/lib.rs index 72e143eb1a0088a2e16dcae9ae955b6c4a3faf43..c5f894100219361cd852b116747981ebde5da745 100644 --- a/core/sr-api-macros/src/lib.rs +++ b/core/sr-api-macros/src/lib.rs @@ -24,7 +24,6 @@ use proc_macro::TokenStream; mod impl_runtime_apis; mod decl_runtime_apis; mod utils; -mod compile_fail_tests; /// Tags given trait implementations as runtime apis. /// diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index d26bed134e5db518f5fc8088014cd47ca63d316e..fb3cad3238e6ff7247f4c94d64b631bfa6ffb94c 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -14,9 +14,22 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use test_client::runtime::{TestAPI, DecodeFails}; -use runtime_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; -use state_machine::ExecutionStrategy; +use test_client::{ + AccountKeyring, runtime::{TestAPI, DecodeFails, Transfer, Header}, + NativeExecutor, LocalExecutor, +}; +use runtime_primitives::{ + generic::BlockId, + traits::{ProvideRuntimeApi, Header as HeaderT, Hash as HashT}, +}; +use state_machine::{ + ExecutionStrategy, create_proof_check_backend, + execution_proof_check_on_trie_backend, +}; + +use client::LongestChain; +use consensus_common::SelectChain; +use codec::Encode; fn calling_function_with_strat(strat: ExecutionStrategy) { let client = test_client::new_with_execution_strategy(strat); @@ -114,3 +127,67 @@ fn use_trie_function() { let block_id = BlockId::Number(client.info().unwrap().chain.best_number); assert_eq!(runtime_api.use_trie(&block_id).unwrap(), 2); } + +#[test] +fn initialize_block_works() { + let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + assert_eq!(runtime_api.get_block_number(&block_id).unwrap(), 1); +} + +#[test] +fn initialize_block_is_called_only_once() { + let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + assert_eq!(runtime_api.take_block_number(&block_id).unwrap(), Some(1)); + assert_eq!(runtime_api.take_block_number(&block_id).unwrap(), None); +} + +#[test] +fn initialize_block_is_skipped() { + let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let runtime_api = client.runtime_api(); + let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + assert!(runtime_api.without_initialize_block(&block_id).unwrap()); +} + +#[test] +fn record_proof_works() { + let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + + let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let storage_root = LongestChain::new(client.backend().clone(), client.import_lock()) + .best_chain().unwrap().state_root().clone(); + + let transaction = Transfer { + amount: 1000, + nonce: 0, + from: AccountKeyring::Alice.into(), + to: Default::default(), + }.into_signed_tx(); + + // Build the block and record proof + let mut builder = client + .new_block_at_with_proof_recording(&block_id) + .expect("Creates block builder"); + builder.push(transaction.clone()).unwrap(); + let (block, proof) = builder.bake_and_extract_proof().expect("Bake block"); + + let backend = create_proof_check_backend::<<

::Hashing as HashT>::Hasher>( + storage_root, + proof.expect("Proof was generated"), + ).expect("Creates proof backend."); + + // Use the proof backend to execute `execute_block`. + let mut overlay = Default::default(); + let executor = NativeExecutor::::new(None); + execution_proof_check_on_trie_backend( + &backend, + &mut overlay, + &executor, + "Core_execute_block", + &block.encode(), + ).expect("Executes block while using the proof backend"); +} \ No newline at end of file diff --git a/core/sr-api-macros/tests/trybuild.rs b/core/sr-api-macros/tests/trybuild.rs new file mode 100644 index 0000000000000000000000000000000000000000..e04c67737a486835e7818aa98bfaea46d6b975c6 --- /dev/null +++ b/core/sr-api-macros/tests/trybuild.rs @@ -0,0 +1,5 @@ +#[test] +fn ui() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/ui/*.rs"); +} diff --git a/core/sr-api-macros/tests/ui/adding_at_parameter.rs b/core/sr-api-macros/tests/ui/adding_at_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..d4757e256f024514613090300169440258d70ee3 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_at_parameter.rs @@ -0,0 +1,9 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(at: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/adding_at_parameter.stderr b/core/sr-api-macros/tests/ui/adding_at_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..1c7e07a418c0a250b57e5a758b8ec4678d415f34 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_at_parameter.stderr @@ -0,0 +1,5 @@ +error: `decl_runtime_apis!` adds automatically a parameter `at: &BlockId`. Please rename/remove your parameter. + --> $DIR/adding_at_parameter.rs:5:11 + | +5 | fn test(at: u64); + | ^^ diff --git a/core/sr-api-macros/tests/ui/adding_self_parameter.rs b/core/sr-api-macros/tests/ui/adding_self_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..fb048211adac3792390926c6c2be2ecb9947e297 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_self_parameter.rs @@ -0,0 +1,9 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(&self); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/adding_self_parameter.stderr b/core/sr-api-macros/tests/ui/adding_self_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e7249e9f732f55fe84707266da3eac32d3835141 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_self_parameter.stderr @@ -0,0 +1,5 @@ +error: Self values are not supported. + --> $DIR/adding_self_parameter.rs:5:11 + | +5 | fn test(&self); + | ^ diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs new file mode 100644 index 0000000000000000000000000000000000000000..27aa60c624e63be142bcc5fbe0cb9ddfcbe1dcc5 --- /dev/null +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs @@ -0,0 +1,20 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::decl_runtime_apis; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + #[changed_in(2)] + fn test(data: u64); + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr b/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr new file mode 100644 index 0000000000000000000000000000000000000000..c62befbab362a0b846624283d8f216857e92c991 --- /dev/null +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr @@ -0,0 +1,5 @@ +error: `changed_in` version can not be greater than the `api_version` + --> $DIR/changed_in_unknown_version.rs:15:3 + | +15 | fn test(data: u64); + | ^^ diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.rs b/core/sr-api-macros/tests/ui/declaring_old_block.rs new file mode 100644 index 0000000000000000000000000000000000000000..6b7f380ef208a31ff0af5f6f0d7d4e9e485856bd --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_old_block.rs @@ -0,0 +1,10 @@ +use runtime_primitives::traits::Block as BlockT; +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.stderr b/core/sr-api-macros/tests/ui/declaring_old_block.stderr new file mode 100644 index 0000000000000000000000000000000000000000..2ab1cc675d109e146d766ea7f355e9cc16a54213 --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_old_block.stderr @@ -0,0 +1,19 @@ +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! + --> $DIR/declaring_old_block.rs:5:16 + | +5 | pub trait Api { + | ^^^^^ + +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. + --> $DIR/declaring_old_block.rs:5:23 + | +5 | pub trait Api { + | ^^^^^^ + +warning: unused import: `runtime_primitives::traits::Block as BlockT` + --> $DIR/declaring_old_block.rs:1:5 + | +1 | use runtime_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs new file mode 100644 index 0000000000000000000000000000000000000000..1371295cc0ebb89f55ecc70d489502c807336b4b --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs @@ -0,0 +1,10 @@ +use runtime_primitives::traits::Block as BlockT; +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr new file mode 100644 index 0000000000000000000000000000000000000000..cf5fe0f53ff5af3425e9bb7da29767808f2ac9a3 --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr @@ -0,0 +1,13 @@ +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. + --> $DIR/declaring_own_block_with_different_name.rs:5:19 + | +5 | pub trait Api { + | ^^^^^^ + +warning: unused import: `runtime_primitives::traits::Block as BlockT` + --> $DIR/declaring_own_block_with_different_name.rs:1:5 + | +1 | use runtime_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs new file mode 100644 index 0000000000000000000000000000000000000000..4cf56bf54bdd1d601bf20df6fc2c37a594e334c5 --- /dev/null +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs @@ -0,0 +1,20 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! {} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr new file mode 100644 index 0000000000000000000000000000000000000000..61527a34803613b50089674ef24540d48deb6336 --- /dev/null +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr @@ -0,0 +1,5 @@ +error: No api implementation given! + --> $DIR/empty_impl_runtime_apis_call.rs:18:1 + | +18 | impl_runtime_apis! {} + | ^^^^^^^^^^^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs new file mode 100644 index 0000000000000000000000000000000000000000..91ffdd798ad0499783ac21320ad6a19227adbd3e --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs @@ -0,0 +1,24 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: String) {} + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr new file mode 100644 index 0000000000000000000000000000000000000000..6d5d484efe0954ff752b865ec78788b63a2c5f6c --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr @@ -0,0 +1,13 @@ +error[E0053]: method `test` has an incompatible type for trait + --> $DIR/impl_incorrect_method_signature.rs:20:17 + | +14 | fn test(data: u64); + | --- type in trait +... +20 | fn test(data: String) {} + | ^^^^^^ expected u64, found struct `std::string::String` + | + = note: expected type `fn(u64)` + found type `fn(std::string::String)` + +For more information about this error, try `rustc --explain E0053`. diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs new file mode 100644 index 0000000000000000000000000000000000000000..0871b0ff3398eeb80c82fccdbc4534a6c3c36f3c --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs @@ -0,0 +1,36 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +mod second { + decl_runtime_apis! { + pub trait Api { + fn test2(data: u64); + } + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: u64) {} + } + + impl second::Api for Runtime { + fn test2(data: u64) {} + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr new file mode 100644 index 0000000000000000000000000000000000000000..355db2864bb784a7011b5c0b8376a713371f88b2 --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr @@ -0,0 +1,25 @@ +error: Two traits with the same name detected! The trait name is used to generate its ID. Please rename one trait at the declaration! + --> $DIR/impl_two_traits_with_same_name.rs:31:15 + | +31 | impl second::Api for Runtime { + | ^^^ + +error: cannot find macro `decl_runtime_apis!` in this scope + --> $DIR/impl_two_traits_with_same_name.rs:19:2 + | +19 | decl_runtime_apis! { + | ^^^^^^^^^^^^^^^^^ + +error[E0433]: failed to resolve: could not find `runtime_decl_for_Api` in `second` + --> $DIR/impl_two_traits_with_same_name.rs:26:1 + | +26 | / impl_runtime_apis! { +27 | | impl self::Api for Runtime { +28 | | fn test(data: u64) {} +29 | | } +... | +33 | | } +34 | | } + | |_^ could not find `runtime_decl_for_Api` in `second` + +For more information about this error, try `rustc --explain E0433`. diff --git a/core/sr-api-macros/tests/ui/invalid_api_version.rs b/core/sr-api-macros/tests/ui/invalid_api_version.rs new file mode 100644 index 0000000000000000000000000000000000000000..b5afa1d6998efe374fb67cf268aed23f2102a554 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version.stderr b/core/sr-api-macros/tests/ui/invalid_api_version.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e7d6aa0ed133f64453b675fb552504ceb6895bc1 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version.rs:4:4 + | +4 | #[api_version] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_2.rs b/core/sr-api-macros/tests/ui/invalid_api_version_2.rs new file mode 100644 index 0000000000000000000000000000000000000000..71586307933fb45943af1dcbdc76e5b843d47abd --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_2.rs @@ -0,0 +1,11 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version("1")] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} + diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr b/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr new file mode 100644 index 0000000000000000000000000000000000000000..3e46efb258052c873240a42e92fd23d42627b9bc --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version_2.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version("1")] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_2.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version("1")] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_2.rs:4:4 + | +4 | #[api_version("1")] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_3.rs b/core/sr-api-macros/tests/ui/invalid_api_version_3.rs new file mode 100644 index 0000000000000000000000000000000000000000..6f365b146b222c906881eb40225f4140efa2c75c --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_3.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version()] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr b/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr new file mode 100644 index 0000000000000000000000000000000000000000..661221f28e89290f792ea2c227195bc8920132d4 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version_3.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version()] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_3.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version()] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_3.rs:4:4 + | +4 | #[api_version()] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..eafe53e23b875e5728a22b4f9fa20c743206aab1 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..5c8563a8b89d01d12e904380e7c4e62a1138a042 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr @@ -0,0 +1,13 @@ +error: Missing `Block` generic parameter. + --> $DIR/missing_block_generic_parameter.rs:19:13 + | +19 | impl self::Api for Runtime { + | ^^^ + +error[E0107]: wrong number of type arguments: expected 1, found 0 + --> $DIR/missing_block_generic_parameter.rs:19:7 + | +19 | impl self::Api for Runtime { + | ^^^^^^^^^ expected 1 type argument + +For more information about this error, try `rustc --explain E0107`. diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.rs b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs new file mode 100644 index 0000000000000000000000000000000000000000..cbf339e73bd3b3b9adcc58b1f233cd1995c75469 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl Api for Runtime { + fn test(data: u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr b/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr new file mode 100644 index 0000000000000000000000000000000000000000..4018712e3f5b3be57316b3001a74eab66b5828aa --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr @@ -0,0 +1,5 @@ +error: The implemented trait has to be referenced with a path, e.g. `impl client::Core for Runtime`. + --> $DIR/missing_path_for_trait.rs:19:7 + | +19 | impl Api for Runtime { + | ^^^ diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs new file mode 100644 index 0000000000000000000000000000000000000000..014b7bd1e84f51e63298314c35024cab83d98e0c --- /dev/null +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: &u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr new file mode 100644 index 0000000000000000000000000000000000000000..12ec399972efa763784b24e5243368cd10ae6641 --- /dev/null +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr @@ -0,0 +1,13 @@ +error[E0053]: method `test` has an incompatible type for trait + --> $DIR/type_reference_in_impl_runtime_apis_call.rs:20:17 + | +14 | fn test(data: u64); + | --- type in trait +... +20 | fn test(data: &u64) { + | ^^^^ expected u64, found &u64 + | + = note: expected type `fn(u64)` + found type `fn(&u64)` + +For more information about this error, try `rustc --explain E0053`. diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index a4c4778561c46ed716fd27067f5bfd6bb41c8eab..dbe699b4b5ec2c197126505642e91e81ae4cfa82 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-io" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" @@ -11,7 +11,7 @@ rustc_version = "0.2" [dependencies] rstd = { package = "sr-std", path = "../sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } -parity-codec = { version = "3.3", default-features = false } +codec = { package = "parity-codec", version = "3.5.1", default-features = false } hash-db = { version = "0.12", default-features = false } libsecp256k1 = { version = "0.2.1", optional = true } tiny-keccak = { version = "1.4.2", optional = true } @@ -23,7 +23,7 @@ trie = { package = "substrate-trie", path = "../trie", optional = true } default = ["std"] std = [ "primitives/std", - "parity-codec/std", + "codec/std", "rstd/std", "hash-db/std", "trie", @@ -35,3 +35,5 @@ std = [ nightly = [] strict = [] wasm-nice-panic-message = [] +no_panic_handler = [] +no_oom = [] diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 6a00e6ca2734d1b73fe7ec6e7063b9bf2e03b3f2..47af4de98ba642133a0069ceccf0e97a90114daa 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -16,23 +16,241 @@ //! This is part of the Substrate runtime. +#![warn(missing_docs)] + #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(lang_items))] #![cfg_attr(not(feature = "std"), feature(alloc_error_handler))] #![cfg_attr(not(feature = "std"), feature(core_intrinsics))] -#![cfg_attr(not(feature = "std"), feature(alloc))] #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Substrate's runtime standard library as compiled without Rust's standard library.")] +use hash_db::Hasher; +use rstd::vec::Vec; + +#[doc(hidden)] +pub use codec; + +pub use primitives::Blake2Hasher; + +/// Error verifying ECDSA signature pub enum EcdsaVerifyError { + /// Incorrect value of R or S BadRS, + /// Incorrect value of V BadV, + /// Invalid signature BadSignature, } -#[cfg(feature = "std")] -include!("../with_std.rs"); +/// Trait for things which can be printed. +pub trait Printable { + /// Print the object. + fn print(self); +} + +/// Converts a public trait definition into a private trait and set of public functions +/// that assume the trait is implemented for `()` for ease of calling. +macro_rules! export_api { + ( + $( #[$trait_attr:meta] )* + pub(crate) trait $trait_name:ident { + $( + $( #[$attr:meta] )* + fn $name:ident + $(< $( $g_name:ident $( : $g_ty:path )? ),+ >)? + ( $( $arg:ident : $arg_ty:ty ),* ) + $( -> $ret:ty )? + $( where $( $w_name:path : $w_ty:path ),+ )?; + )* + } + ) => { + $( #[$trait_attr] )* + pub(crate) trait $trait_name { + $( + $( #[$attr] )* + fn $name $(< $( $g_name $( : $g_ty )? ),+ >)? ( $($arg : $arg_ty ),* ) $( -> $ret )? + $( where $( $w_name : $w_ty ),+ )?; + )* + } + + $( + $( #[$attr] )* + pub fn $name $(< $( $g_name $( : $g_ty )? ),+ >)? ( $($arg : $arg_ty ),* ) $( -> $ret )? + $( where $( $w_name : $w_ty ),+ )? + { + #[allow(deprecated)] + <()>:: $name $(::< $( $g_name ),+ > )? ( $( $arg ),* ) + } + )* + } +} + +export_api! { + pub(crate) trait StorageApi { + /// Get `key` from storage and return a `Vec`, empty if there's a problem. + fn storage(key: &[u8]) -> Option>; + + /// Get `key` from child storage and return a `Vec`, empty if there's a problem. + fn child_storage(storage_key: &[u8], key: &[u8]) -> Option>; + + /// Get `key` from storage, placing the value into `value_out` (as much of it as possible) and return + /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry + /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned + /// number of bytes is not equal to the number of bytes written to the `value_out`. + fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; + + /// Get `key` from child storage, placing the value into `value_out` (as much of it as possible) and return + /// the number of bytes that the entry in storage had beyond the offset or None if the storage entry + /// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned + /// number of bytes is not equal to the number of bytes written to the `value_out`. + fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option; + + /// Set the storage of some particular key to Some value. + fn set_storage(key: &[u8], value: &[u8]); + + /// Set the child storage of some particular key to Some value. + fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]); + + /// Clear the storage of a key. + fn clear_storage(key: &[u8]); + + /// Clear the storage of a key. + fn clear_child_storage(storage_key: &[u8], key: &[u8]); + + /// Clear an entire child storage. + fn kill_child_storage(storage_key: &[u8]); + + /// Check whether a given `key` exists in storage. + fn exists_storage(key: &[u8]) -> bool; + + /// Check whether a given `key` exists in storage. + fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool; + + /// Clear the storage entries with a key that starts with the given prefix. + fn clear_prefix(prefix: &[u8]); + + /// "Commit" all existing operations and compute the resultant storage root. + fn storage_root() -> [u8; 32]; + + /// "Commit" all existing operations and compute the resultant child storage root. + fn child_storage_root(storage_key: &[u8]) -> Vec; + + /// "Commit" all existing operations and get the resultant storage change root. + fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]>; + + /// A trie root formed from the enumerated items. + /// TODO [#2382] remove (just use `ordered_trie_root` (NOTE currently not implemented for without_std)) + fn enumerated_trie_root(input: &[&[u8]]) -> H::Out + where + H: Hasher, + H: self::imp::HasherBounds, + H::Out: Ord + ; + /// A trie root formed from the iterated items. + fn trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]>, + A: Ord, + B: AsRef<[u8]>, + H: Hasher, + H: self::imp::HasherBounds, + H::Out: Ord + ; + + /// A trie root formed from the enumerated items. + fn ordered_trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]>, + H: Hasher, + H: self::imp::HasherBounds, + H::Out: Ord + ; + } +} + +export_api! { + pub(crate) trait OtherApi { + /// The current relay chain identifier. + fn chain_id() -> u64; + + /// Print a printable value. + fn print(value: T) + where + T: Printable, + T: Sized + ; + } +} + +export_api! { + pub(crate) trait CryptoApi { + /// Verify a ed25519 signature. + fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + + /// Verify an sr25519 signature. + fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool; + + /// Verify and recover a SECP256k1 ECDSA signature. + /// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. + /// - returns `Err` if the signature is bad, otherwise the 64-byte pubkey (doesn't include the 0x04 prefix). + fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError>; + } +} + +export_api! { + pub(crate) trait HashingApi { + /// Conduct a 256-bit Keccak hash. + fn keccak_256(data: &[u8]) -> [u8; 32] ; + + /// Conduct a 128-bit Blake2 hash. + fn blake2_128(data: &[u8]) -> [u8; 16]; + + /// Conduct a 256-bit Blake2 hash. + fn blake2_256(data: &[u8]) -> [u8; 32]; + + /// Conduct four XX hashes to give a 256-bit result. + fn twox_256(data: &[u8]) -> [u8; 32]; + + /// Conduct two XX hashes to give a 128-bit result. + fn twox_128(data: &[u8]) -> [u8; 16]; + + /// Conduct two XX hashes to give a 64-bit result. + fn twox_64(data: &[u8]) -> [u8; 8]; + } +} + +export_api! { + pub(crate) trait OffchainApi { + /// Submit extrinsic from the runtime. + /// + /// Depending on the kind of extrinsic it will either be: + /// 1. scheduled to be included in the next produced block (inherent) + /// 2. added to the pool and propagated (transaction) + fn submit_extrinsic(data: &T); + } +} + +/// API trait that should cover all other APIs. +/// +/// Implement this to make sure you implement all APIs. +trait Api: StorageApi + OtherApi + CryptoApi + HashingApi + OffchainApi {} + +mod imp { + use super::*; + + #[cfg(feature = "std")] + include!("../with_std.rs"); + + #[cfg(not(feature = "std"))] + include!("../without_std.rs"); +} + +#[cfg(feature = "std")] +pub use self::imp::{StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities, TestExternalities}; #[cfg(not(feature = "std"))] -include!("../without_std.rs"); +pub use self::imp::ext::*; diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 1f4ce56fc9b0ed5cda73c6c7513ce34e978cf6fe..d73ccf4b6615c1eaaf05fdb23bb4dfa7109bb1b7 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -14,218 +14,254 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -#[doc(hidden)] -pub use parity_codec as codec; -// re-export hashing functions. -pub use primitives::{ - blake2_256, twox_128, twox_256, ed25519, Blake2Hasher, sr25519, - Pair +use primitives::{ + blake2_128, blake2_256, twox_128, twox_256, twox_64, ed25519, Blake2Hasher, + sr25519, Pair }; -pub use tiny_keccak::keccak256 as keccak_256; // Switch to this after PoC-3 // pub use primitives::BlakeHasher; -pub use substrate_state_machine::{Externalities, BasicExternalities, TestExternalities}; +pub use substrate_state_machine::{ + Externalities, + BasicExternalities, + TestExternalities, + ChildStorageKey +}; use environmental::environmental; use primitives::{hexdisplay::HexDisplay, H256}; -use hash_db::Hasher; #[cfg(feature = "std")] use std::collections::HashMap; environmental!(ext: trait Externalities); -/// A set of key value pairs for storage. -pub type StorageOverlay = HashMap, Vec>; +/// Additional bounds for `Hasher` trait for with_std. +pub trait HasherBounds {} +impl HasherBounds for T {} + +/// Returns a `ChildStorageKey` if the given `storage_key` slice is a valid storage +/// key or panics otherwise. +/// +/// Panicking here is aligned with what the `without_std` environment would do +/// in the case of an invalid child storage key. +fn child_storage_key_or_panic(storage_key: &[u8]) -> ChildStorageKey { + match ChildStorageKey::from_slice(storage_key) { + Some(storage_key) => storage_key, + None => panic!("child storage key is invalid"), + } +} -/// A set of key value pairs for children storage; -pub type ChildrenStorageOverlay = HashMap, StorageOverlay>; +impl StorageApi for () { + fn storage(key: &[u8]) -> Option> { + ext::with(|ext| ext.storage(key).map(|s| s.to_vec())) + .expect("storage cannot be called outside of an Externalities-provided environment.") + } -/// Get `key` from storage and return a `Vec`, empty if there's a problem. -pub fn storage(key: &[u8]) -> Option> { - ext::with(|ext| ext.storage(key).map(|s| s.to_vec())) - .expect("storage cannot be called outside of an Externalities-provided environment.") -} + fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { + ext::with(|ext| ext.storage(key).map(|value| { + let value = &value[value_offset..]; + let written = std::cmp::min(value.len(), value_out.len()); + value_out[..written].copy_from_slice(&value[..written]); + value.len() + })).expect("read_storage cannot be called outside of an Externalities-provided environment.") + } -/// Get `key` from child storage and return a `Vec`, empty if there's a problem. -pub fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { - ext::with(|ext| ext.child_storage(storage_key, key).map(|s| s.to_vec())) + fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.child_storage(storage_key, key).map(|s| s.to_vec()) + }) .expect("storage cannot be called outside of an Externalities-provided environment.") -} + } -/// Get `key` from storage, placing the value into `value_out` (as much of it as possible) and return -/// the number of bytes that the entry in storage had beyond the offset or None if the storage entry -/// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned -/// number of bytes is not equal to the number of bytes written to the `value_out`. -pub fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { - ext::with(|ext| ext.storage(key).map(|value| { - let value = &value[value_offset..]; - let written = ::std::cmp::min(value.len(), value_out.len()); - value_out[..written].copy_from_slice(&value[..written]); - value.len() - })).expect("read_storage cannot be called outside of an Externalities-provided environment.") -} + fn set_storage(key: &[u8], value: &[u8]) { + ext::with(|ext| + ext.set_storage(key.to_vec(), value.to_vec()) + ); + } -/// Get `key` from child storage, placing the value into `value_out` (as much of it as possible) and return -/// the number of bytes that the entry in storage had beyond the offset or None if the storage entry -/// doesn't exist at all. Note that if the buffer is smaller than the storage entry length, the returned -/// number of bytes is not equal to the number of bytes written to the `value_out`. -pub fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { - ext::with(|ext| ext.child_storage(storage_key, key).map(|value| { - let value = &value[value_offset..]; - let written = ::std::cmp::min(value.len(), value_out.len()); - value_out[..written].copy_from_slice(&value[..written]); - value.len() - })).expect("read_storage cannot be called outside of an Externalities-provided environment.") -} + fn read_child_storage( + storage_key: &[u8], + key: &[u8], + value_out: &mut [u8], + value_offset: usize, + ) -> Option { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.child_storage(storage_key, key) + .map(|value| { + let value = &value[value_offset..]; + let written = std::cmp::min(value.len(), value_out.len()); + value_out[..written].copy_from_slice(&value[..written]); + value.len() + }) + }) + .expect("read_child_storage cannot be called outside of an Externalities-provided environment.") + } -/// Set the storage of a key to some value. -pub fn set_storage(key: &[u8], value: &[u8]) { - ext::with(|ext| - ext.set_storage(key.to_vec(), value.to_vec()) - ); -} + fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.set_child_storage(storage_key, key.to_vec(), value.to_vec()) + }); + } -/// Set the child storage of a key to some value. -pub fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { - ext::with(|ext| - ext.set_child_storage(storage_key.to_vec(), key.to_vec(), value.to_vec()) - ); -} + fn clear_storage(key: &[u8]) { + ext::with(|ext| + ext.clear_storage(key) + ); + } -/// Clear the storage of a key. -pub fn clear_storage(key: &[u8]) { - ext::with(|ext| - ext.clear_storage(key) - ); -} + fn clear_child_storage(storage_key: &[u8], key: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.clear_child_storage(storage_key, key) + }); + } -/// Clear the storage of a key. -pub fn clear_child_storage(storage_key: &[u8], key: &[u8]) { - ext::with(|ext| - ext.clear_child_storage(storage_key, key) - ); -} + fn kill_child_storage(storage_key: &[u8]) { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.kill_child_storage(storage_key) + }); + } -/// Check whether a given `key` exists in storage. -pub fn exists_storage(key: &[u8]) -> bool { - ext::with(|ext| - ext.exists_storage(key) - ).unwrap_or(false) -} + fn exists_storage(key: &[u8]) -> bool { + ext::with(|ext| + ext.exists_storage(key) + ).unwrap_or(false) + } -/// Check whether a given `key` exists in storage. -pub fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { - ext::with(|ext| - ext.exists_child_storage(storage_key, key) - ).unwrap_or(false) -} + fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.exists_child_storage(storage_key, key) + }).unwrap_or(false) + } -/// Clear the storage entries with a key that starts with the given prefix. -pub fn clear_prefix(prefix: &[u8]) { - ext::with(|ext| - ext.clear_prefix(prefix) - ); -} + fn clear_prefix(prefix: &[u8]) { + ext::with(|ext| + ext.clear_prefix(prefix) + ); + } -/// Clear an entire child storage. -pub fn kill_child_storage(storage_key: &[u8]) { - ext::with(|ext| - ext.kill_child_storage(storage_key) - ); -} + fn storage_root() -> [u8; 32] { + ext::with(|ext| + ext.storage_root() + ).unwrap_or(H256::zero()).into() + } -/// The current relay chain identifier. -pub fn chain_id() -> u64 { - ext::with(|ext| - ext.chain_id() - ).unwrap_or(0) -} + fn child_storage_root(storage_key: &[u8]) -> Vec { + ext::with(|ext| { + let storage_key = child_storage_key_or_panic(storage_key); + ext.child_storage_root(storage_key) + }).expect("child_storage_root cannot be called outside of an Externalities-provided environment.") + } -/// "Commit" all existing operations and compute the resultant storage root. -pub fn storage_root() -> H256 { - ext::with(|ext| - ext.storage_root() - ).unwrap_or(H256::zero()) -} + fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { + ext::with(|ext| + ext.storage_changes_root(parent_hash.into(), parent_num).map(Into::into) + ).unwrap_or(None) + } -/// "Commit" all existing operations and compute the resultant child storage root. -pub fn child_storage_root(storage_key: &[u8]) -> Option> { - ext::with(|ext| - ext.child_storage_root(storage_key) - ).unwrap_or(None) -} + fn enumerated_trie_root(input: &[&[u8]]) -> H::Out + where + H: Hasher, + H::Out: Ord, + { + trie::ordered_trie_root::(input.iter()) + } -/// "Commit" all existing operations and get the resultant storage change root. -pub fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option { - ext::with(|ext| - ext.storage_changes_root(parent_hash.into(), parent_num) - ).unwrap_or(None) -} + fn trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + H: Hasher, + H::Out: Ord, + { + trie::trie_root::(input) + } -/// A trie root formed from the enumerated items. -// TODO: remove (just use `ordered_trie_root`) -pub fn enumerated_trie_root(input: &[&[u8]]) -> H::Out -where - H: Hasher, - H::Out: Ord, -{ - trie::ordered_trie_root::(input.iter()) + fn ordered_trie_root(input: I) -> H::Out + where + I: IntoIterator, + A: AsRef<[u8]>, + H: Hasher, + H::Out: Ord, + { + trie::ordered_trie_root::(input) + } } -/// A trie root formed from the iterated items. -pub fn trie_root(input: I) -> H::Out -where - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, - H: Hasher, - ::Out: Ord, -{ - trie::trie_root::(input) -} +impl OtherApi for () { + fn chain_id() -> u64 { + ext::with(|ext| + ext.chain_id() + ).unwrap_or(0) + } -/// A trie root formed from the enumerated items. -pub fn ordered_trie_root(input: I) -> H::Out -where - I: IntoIterator + Iterator, - A: AsRef<[u8]>, - H: Hasher, - ::Out: Ord, -{ - trie::ordered_trie_root::(input) + fn print(value: T) { + value.print() + } } -/// Verify a ed25519 signature. -pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - ed25519::Pair::verify_weak(sig, msg, pubkey) -} +impl CryptoApi for () { + fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + ed25519::Pair::verify_weak(sig, msg, pubkey) + } -/// Verify an sr25519 signature. -pub fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - sr25519::Pair::verify_weak(sig, msg, pubkey) + fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + sr25519::Pair::verify_weak(sig, msg, pubkey) + } + + fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { + let rs = secp256k1::Signature::parse_slice(&sig[0..64]).map_err(|_| EcdsaVerifyError::BadRS)?; + let v = secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8).map_err(|_| EcdsaVerifyError::BadV)?; + let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v).map_err(|_| EcdsaVerifyError::BadSignature)?; + let mut res = [0u8; 64]; + res.copy_from_slice(&pubkey.serialize()[1..65]); + Ok(res) + } } -/// Verify and recover a SECP256k1 ECDSA signature. -/// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. -/// - returns `Err` if the signature is bad, otherwise the 64-byte pubkey (doesn't include the 0x04 prefix). -pub fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { - let rs = secp256k1::Signature::parse_slice(&sig[0..64]).map_err(|_| EcdsaVerifyError::BadRS)?; - let v = secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8).map_err(|_| EcdsaVerifyError::BadV)?; - let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v).map_err(|_| EcdsaVerifyError::BadSignature)?; - let mut res = [0u8; 64]; - res.copy_from_slice(&pubkey.serialize()[1..65]); - Ok(res) +impl HashingApi for () { + fn keccak_256(data: &[u8]) -> [u8; 32] { + tiny_keccak::keccak256(data) + } + + fn blake2_128(data: &[u8]) -> [u8; 16] { + blake2_128(data) + } + + fn blake2_256(data: &[u8]) -> [u8; 32] { + blake2_256(data) + } + + fn twox_256(data: &[u8]) -> [u8; 32] { + twox_256(data) + } + + fn twox_128(data: &[u8]) -> [u8; 16] { + twox_128(data) + } + + fn twox_64(data: &[u8]) -> [u8; 8] { + twox_64(data) + } } -/// Submit extrinsic. -pub fn submit_extrinsic(data: &T) { - ext::with(|ext| ext - .submit_extrinsic(codec::Encode::encode(data)) - .expect("submit_extrinsic can be called only in offchain worker context") - ).expect("submit_extrinsic cannot be called outside of an Externalities-provided environment.") +impl OffchainApi for () { + fn submit_extrinsic(data: &T) { + ext::with(|ext| ext + .submit_extrinsic(codec::Encode::encode(data)) + .expect("submit_extrinsic can be called only in offchain worker context") + ).expect("submit_extrinsic cannot be called outside of an Externalities-provided environment.") + } } +impl Api for () {} + /// Execute the given closure with global function available whose functionality routes into the /// externalities `ext`. Forwards the value that the closure returns. // NOTE: need a concrete hasher here due to limitations of the `environmental!` macro, otherwise a type param would have been fine I think. @@ -233,6 +269,12 @@ pub fn with_externalities R>(ext: &mut Externalities, Vec>; + +/// A set of key value pairs for children storage; +pub type ChildrenStorageOverlay = HashMap, StorageOverlay>; + /// Execute the given closure with global functions available whose functionality routes into /// externalities that draw from and populate `storage`. Forwards the value that the closure returns. pub fn with_storage R>(storage: &mut StorageOverlay, f: F) -> R { @@ -244,11 +286,6 @@ pub fn with_storage R>(storage: &mut StorageOverlay, f: F) -> r } -/// Trait for things which can be printed. -pub trait Printable { - fn print(self); -} - impl<'a> Printable for &'a [u8] { fn print(self) { println!("Runtime: {}", HexDisplay::from(&self)); @@ -267,11 +304,6 @@ impl Printable for u64 { } } -/// Print a printable value. -pub fn print(value: T) { - value.print(); -} - #[cfg(test)] mod std_tests { use super::*; diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index e4e32bd17d5811d6c98aa4e14ce39f1196a81c17..2f2b482f5e0cdb4f2282603e15e00e4a0a85367b 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -14,17 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -#[doc(hidden)] -pub use parity_codec as codec; #[doc(hidden)] pub use rstd; pub use rstd::{mem, slice}; use core::{intrinsics, panic::PanicInfo}; use rstd::{vec::Vec, cell::Cell}; -use hash_db::Hasher; use primitives::Blake2Hasher; +#[cfg(not(feature = "no_panic_handler"))] #[panic_handler] #[no_mangle] pub fn panic(info: &PanicInfo) -> ! { @@ -46,6 +44,7 @@ pub fn panic(info: &PanicInfo) -> ! { } } +#[cfg(not(feature = "no_oom"))] #[alloc_error_handler] pub extern fn oom(_: ::core::alloc::Layout) -> ! { static OOM_MSG: &str = "Runtime memory exhausted. Aborting"; @@ -56,568 +55,585 @@ pub extern fn oom(_: ::core::alloc::Layout) -> ! { } } -/// The state of an exchangeable function. -#[derive(Clone, Copy)] -enum ExchangeableFunctionState { - Original, - Replaced, -} - -/// A function which implementation can be exchanged. -/// -/// Internally this works by swapping function pointers. -pub struct ExchangeableFunction(Cell<(T, ExchangeableFunctionState)>); +/// External (Host) APIs +pub mod ext { + use super::*; -impl ExchangeableFunction { - /// Create a new instance of `ExchangeableFunction`. - pub const fn new(impl_: T) -> Self { - Self(Cell::new((impl_, ExchangeableFunctionState::Original))) + /// The state of an exchangeable function. + #[derive(Clone, Copy)] + enum ExchangeableFunctionState { + /// Original function is present + Original, + /// The function has been replaced. + Replaced, } -} -impl ExchangeableFunction { - /// Replace the implementation with `new_impl`. - /// - /// # Panics - /// - /// Panics when trying to replace an already replaced implementation. - /// - /// # Returns + /// A function which implementation can be exchanged. /// - /// Returns the original implementation wrapped in [`RestoreImplementation`]. - pub fn replace_implementation(&'static self, new_impl: T) -> RestoreImplementation { - if let ExchangeableFunctionState::Replaced = self.0.get().1 { - panic!("Trying to replace an already replaced implementation!") + /// Internally this works by swapping function pointers. + pub struct ExchangeableFunction(Cell<(T, ExchangeableFunctionState)>); + + impl ExchangeableFunction { + /// Create a new instance of `ExchangeableFunction`. + pub const fn new(impl_: T) -> Self { + Self(Cell::new((impl_, ExchangeableFunctionState::Original))) } + } - let old = self.0.replace((new_impl, ExchangeableFunctionState::Replaced)); + impl ExchangeableFunction { + /// Replace the implementation with `new_impl`. + /// + /// # Panics + /// + /// Panics when trying to replace an already replaced implementation. + /// + /// # Returns + /// + /// Returns the original implementation wrapped in [`RestoreImplementation`]. + pub fn replace_implementation(&'static self, new_impl: T) -> RestoreImplementation { + if let ExchangeableFunctionState::Replaced = self.0.get().1 { + panic!("Trying to replace an already replaced implementation!") + } - RestoreImplementation(self, Some(old.0)) - } + let old = self.0.replace((new_impl, ExchangeableFunctionState::Replaced)); - /// Restore the original implementation. - fn restore_orig_implementation(&self, orig: T) { - self.0.set((orig, ExchangeableFunctionState::Original)); - } + RestoreImplementation(self, Some(old.0)) + } - /// Returns the internal function pointer. - pub fn get(&self) -> T { - self.0.get().0 + /// Restore the original implementation. + fn restore_orig_implementation(&self, orig: T) { + self.0.set((orig, ExchangeableFunctionState::Original)); + } + + /// Returns the internal function pointer. + pub fn get(&self) -> T { + self.0.get().0 + } } -} -// WASM does not support threads, so this is safe; qed. -unsafe impl Sync for ExchangeableFunction {} + // WASM does not support threads, so this is safe; qed. + unsafe impl Sync for ExchangeableFunction {} -/// Restores a function implementation on drop. -/// -/// Stores a static reference to the function object and the original implementation. -pub struct RestoreImplementation(&'static ExchangeableFunction, Option); + /// Restores a function implementation on drop. + /// + /// Stores a static reference to the function object and the original implementation. + pub struct RestoreImplementation(&'static ExchangeableFunction, Option); -impl Drop for RestoreImplementation { - fn drop(&mut self) { - self.0.restore_orig_implementation(self.1.take().expect("Value is only taken on drop; qed")); + impl Drop for RestoreImplementation { + fn drop(&mut self) { + self.0.restore_orig_implementation(self.1.take().expect("Value is only taken on drop; qed")); + } } -} -/// Declare extern functions -macro_rules! extern_functions { - ( - $( - $( #[$attr:meta] )* - fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) $( -> $ret:ty )?; - )* - ) => { - $( - $( #[$attr] )* - #[allow(non_upper_case_globals)] - pub static $name: ExchangeableFunction $ret )?> = - ExchangeableFunction::new(extern_functions_host_impl::$name); - )* - - /// The exchangeable extern functions host implementations. - mod extern_functions_host_impl { + /// Ensures we use the right crypto when calling into native + pub trait ExternTrieCrypto: Hasher { + /// Calculate enumerated trie root. + fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out; + } + + /// Additional bounds for Hasher trait for without_std. + pub trait HasherBounds: ExternTrieCrypto {} + impl HasherBounds for T {} + + // Ensures we use a Blake2_256-flavored Hasher when calling into native + impl ExternTrieCrypto for Blake2Hasher { + fn enumerated_trie_root(values: &[&[u8]]) -> Self::Out { + let lengths = values.iter().map(|v| (v.len() as u32).to_le()).collect::>(); + let values = values.iter().fold(Vec::new(), |mut acc, sl| { acc.extend_from_slice(sl); acc }); + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_blake2_256_enumerated_trie_root.get()( + values.as_ptr(), + lengths.as_ptr(), + lengths.len() as u32, + result.as_mut_ptr() + ); + } + result.into() + } + } + + /// Declare extern functions + macro_rules! extern_functions { + ( $( - pub unsafe fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )? { - implementation::$name ( $( $arg ),* ) - } + $( #[$attr:meta] )* + fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) $( -> $ret:ty )?; + )* + ) => { + $( + $( #[$attr] )* + #[allow(non_upper_case_globals)] + pub static $name: ExchangeableFunction $ret )?> = + ExchangeableFunction::new(extern_functions_host_impl::$name); )* - mod implementation { - extern "C" { - $( - pub fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )?; - )* + /// The exchangeable extern functions host implementations. + pub(crate) mod extern_functions_host_impl { + $( + pub unsafe fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )? { + implementation::$name ( $( $arg ),* ) + } + )* + + mod implementation { + extern "C" { + $( + pub fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )?; + )* + } } } + }; + } + + /// Host functions, provided by the executor. + /// A WebAssembly runtime module would "import" these to access the execution environment + /// (most importantly, storage) or perform heavy hash calculations. + /// See also "ext_" functions in sr-sandbox and sr-std + extern_functions! { + /// Host functions for printing, useful for debugging. + fn ext_print_utf8(utf8_data: *const u8, utf8_len: u32); + /// Print data as hex. + fn ext_print_hex(data: *const u8, len: u32); + /// Print a number + fn ext_print_num(value: u64); + + /// Set value for key in storage. + fn ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); + /// Remove key and value from storage. + fn ext_clear_storage(key_data: *const u8, key_len: u32); + /// Checks if the given key exists in the storage. + /// + /// # Returns + /// + /// - `1` if the value exists. + /// - `0` if the value does not exists. + fn ext_exists_storage(key_data: *const u8, key_len: u32) -> u32; + /// Remove storage entries which key starts with given prefix. + fn ext_clear_prefix(prefix_data: *const u8, prefix_len: u32); + /// Gets the value of the given key from storage. + /// + /// The host allocates the memory for storing the value. + /// + /// # Returns + /// + /// - `0` if no value exists to the given key. `written_out` is set to `u32::max_value()`. + /// + /// - Otherwise, pointer to the value in memory. `written_out` contains the length of the value. + fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; + /// Gets the value of the given key from storage. + /// + /// The value is written into `value` starting at `value_offset`. + /// + /// If the value length is greater than `value_len - value_offset`, the value is written partially. + /// + /// # Returns + /// + /// - `u32::max_value()` if the value does not exists. + /// + /// - Otherwise, the number of bytes written for value. + fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; + /// Gets the trie root of the storage. + fn ext_storage_root(result: *mut u8); + /// Get the change trie root of the current storage overlay at a block with given parent. + /// + /// # Returns + /// + /// - `1` if the change trie root was found. + /// - `0` if the change trie root was not found. + fn ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_num: u64, result: *mut u8) -> u32; + + /// A child storage function. + /// + /// See [`ext_set_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); + /// A child storage function. + /// + /// See [`ext_clear_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32); + /// A child storage function. + /// + /// See [`ext_exists_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32; + /// A child storage function. + /// + /// See [`ext_kill_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32); + /// A child storage function. + /// + /// See [`ext_get_allocated_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_get_allocated_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + written_out: *mut u32 + ) -> *mut u8; + /// A child storage function. + /// + /// See [`ext_get_storage_into`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_get_child_storage_into( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + value_data: *mut u8, + value_len: u32, + value_offset: u32 + ) -> u32; + /// Commits all changes and calculates the child-storage root. + /// + /// A child storage is used e.g. by a contract. + /// + /// # Returns + /// + /// - The pointer to the result vector and `written_out` contains its length. + fn ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8; + + /// The current relay chain identifier. + fn ext_chain_id() -> u64; + + /// Calculate a blake2_256 merkle trie root. + fn ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8); + /// BLAKE2_128 hash + fn ext_blake2_128(data: *const u8, len: u32, out: *mut u8); + /// BLAKE2_256 hash + fn ext_blake2_256(data: *const u8, len: u32, out: *mut u8); + /// XX64 hash + fn ext_twox_64(data: *const u8, len: u32, out: *mut u8); + /// XX128 hash + fn ext_twox_128(data: *const u8, len: u32, out: *mut u8); + /// XX256 hash + fn ext_twox_256(data: *const u8, len: u32, out: *mut u8); + /// Keccak256 hash + fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); + /// Note: ext_ed25519_verify returns 0 if the signature is correct, nonzero otherwise. + fn ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; + /// Note: ext_sr25519_verify returns 0 if the signature is correct, nonzero otherwise. + fn ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; + /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. + fn ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32; + + //================================ + // Offchain-worker Context + //================================ + + /// Submit extrinsic. + fn ext_submit_extrinsic(data: *const u8, len: u32); + } +} + +pub use self::ext::*; + +impl StorageApi for () { + fn storage(key: &[u8]) -> Option> { + let mut length: u32 = 0; + unsafe { + let ptr = ext_get_allocated_storage.get()(key.as_ptr(), key.len() as u32, &mut length); + if length == u32::max_value() { + None + } else { + // Invariants required by Vec::from_raw_parts are not formally fulfilled. + // We don't allocate via String/Vec, but use a custom allocator instead. + // See #300 for more details. + Some(>::from_raw_parts(ptr, length as usize, length as usize)) + } } - }; -} - -/// Host functions, provided by the executor. -/// A WebAssembly runtime module would "import" these to access the execution environment -/// (most importantly, storage) or perform heavy hash calculations. -/// See also "ext_" functions in sr-sandbox and sr-std -extern_functions! { - /// Host functions for printing, useful for debugging. - fn ext_print_utf8(utf8_data: *const u8, utf8_len: u32); - fn ext_print_hex(data: *const u8, len: u32); - fn ext_print_num(value: u64); - - /// Set value for key in storage. - fn ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); - /// Remove key and value from storage. - fn ext_clear_storage(key_data: *const u8, key_len: u32); - /// Checks if the given key exists in the storage. - /// - /// # Returns - /// - /// - `1` if the value exists. - /// - `0` if the value does not exists. - fn ext_exists_storage(key_data: *const u8, key_len: u32) -> u32; - /// Remove storage entries which key starts with given prefix. - fn ext_clear_prefix(prefix_data: *const u8, prefix_len: u32); - /// Gets the value of the given key from storage. - /// - /// The host allocates the memory for storing the value. - /// - /// # Returns - /// - /// - `0` if no value exists to the given key. `written_out` is set to `u32::max_value()`. - /// - /// - Otherwise, pointer to the value in memory. `written_out` contains the length of the value. - fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; - /// Gets the value of the given key from storage. - /// - /// The value is written into `value` starting at `value_offset`. - /// - /// If the value length is greater than `value_len - value_offset`, the value is written partially. - /// - /// # Returns - /// - /// - `u32::max_value()` if the value does not exists. - /// - /// - Otherwise, the number of bytes written for value. - fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; - /// Gets the trie root of the storage. - fn ext_storage_root(result: *mut u8); - /// Get the change trie root of the current storage overlay at a block with given parent. - /// - /// # Returns - /// - /// - `1` if the change trie root was found. - /// - `0` if the change trie root was not found. - fn ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_num: u64, result: *mut u8) -> u32; - - /// A child storage function. - /// - /// See [`ext_set_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); - /// A child storage function. - /// - /// See [`ext_clear_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32); - /// A child storage function. - /// - /// See [`ext_exists_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32; - /// A child storage function. - /// - /// See [`ext_kill_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32); - /// A child storage function. - /// - /// See [`ext_get_allocated_storage`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_get_allocated_child_storage( - storage_key_data: *const u8, - storage_key_len: u32, - key_data: *const u8, - key_len: u32, - written_out: *mut u32 - ) -> *mut u8; - /// A child storage function. - /// - /// See [`ext_get_storage_into`] for details. - /// - /// A child storage is used e.g. by a contract. - fn ext_get_child_storage_into( - storage_key_data: *const u8, - storage_key_len: u32, - key_data: *const u8, - key_len: u32, - value_data: *mut u8, - value_len: u32, - value_offset: u32 - ) -> u32; - /// Commits all changes and calculates the child-storage root. - /// - /// A child storage is used e.g. by a contract. - /// - /// # Returns - /// - /// - The pointer to the result vector and `written_out` contains its length. - fn ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8; - - /// The current relay chain identifier. - fn ext_chain_id() -> u64; - - /// Hash calculation and verification - fn ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8); - fn ext_blake2_256(data: *const u8, len: u32, out: *mut u8); - fn ext_twox_128(data: *const u8, len: u32, out: *mut u8); - fn ext_twox_256(data: *const u8, len: u32, out: *mut u8); - fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); - /// Note: ext_ed25519_verify returns 0 if the signature is correct, nonzero otherwise. - fn ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; - /// Note: ext_sr25519_verify returns 0 if the signature is correct, nonzero otherwise. - fn ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; - /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. - fn ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32; - - //================================ - // Offchain-worker Context - //================================ - - /// Submit extrinsic. - fn ext_submit_extrinsic(data: *const u8, len: u32); -} - -/// Ensures we use the right crypto when calling into native -pub trait ExternTrieCrypto { - fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32]; -} + } -// Ensures we use a Blake2_256-flavored Hasher when calling into native -impl ExternTrieCrypto for Blake2Hasher { - fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32] { - let lengths = values.iter().map(|v| (v.len() as u32).to_le()).collect::>(); - let values = values.iter().fold(Vec::new(), |mut acc, sl| { acc.extend_from_slice(sl); acc }); - let mut result: [u8; 32] = Default::default(); + fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { + let mut length: u32 = 0; unsafe { - ext_blake2_256_enumerated_trie_root.get()( - values.as_ptr(), - lengths.as_ptr(), - lengths.len() as u32, - result.as_mut_ptr() + let ptr = ext_get_allocated_child_storage.get()( + storage_key.as_ptr(), + storage_key.len() as u32, + key.as_ptr(), + key.len() as u32, + &mut length ); + if length == u32::max_value() { + None + } else { + // Invariants required by Vec::from_raw_parts are not formally fulfilled. + // We don't allocate via String/Vec, but use a custom allocator instead. + // See #300 for more details. + Some(>::from_raw_parts(ptr, length as usize, length as usize)) + } } - result } -} -/// Get `key` from storage and return a `Vec`, empty if there's a problem. -pub fn storage(key: &[u8]) -> Option> { - let mut length: u32 = 0; - unsafe { - let ptr = ext_get_allocated_storage.get()(key.as_ptr(), key.len() as u32, &mut length); - if length == u32::max_value() { - None - } else { - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - Some(>::from_raw_parts(ptr, length as usize, length as usize)) + fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { + unsafe { + match ext_get_storage_into.get()( + key.as_ptr(), + key.len() as u32, + value_out.as_mut_ptr(), + value_out.len() as u32, + value_offset as u32, + ) { + none if none == u32::max_value() => None, + length => Some(length as usize), + } } } -} -/// Get `key` from child storage and return a `Vec`, empty if there's a problem. -pub fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { - let mut length: u32 = 0; - unsafe { - let ptr = ext_get_allocated_child_storage.get()( - storage_key.as_ptr(), - storage_key.len() as u32, - key.as_ptr(), - key.len() as u32, - &mut length - ); - if length == u32::max_value() { - None - } else { - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - Some(>::from_raw_parts(ptr, length as usize, length as usize)) + fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { + unsafe { + match ext_get_child_storage_into.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32, + value_out.as_mut_ptr(), value_out.len() as u32, + value_offset as u32 + ) { + none if none == u32::max_value() => None, + length => Some(length as usize), + } } } -} -/// Set the storage of some particular key to Some value. -pub fn set_storage(key: &[u8], value: &[u8]) { - unsafe { - ext_set_storage.get()( - key.as_ptr(), key.len() as u32, - value.as_ptr(), value.len() as u32 - ); + fn set_storage(key: &[u8], value: &[u8]) { + unsafe { + ext_set_storage.get()( + key.as_ptr(), key.len() as u32, + value.as_ptr(), value.len() as u32 + ); + } } -} -/// Set the child storage of some particular key to Some value. -pub fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { - unsafe { - ext_set_child_storage.get()( - storage_key.as_ptr(), key.len() as u32, - key.as_ptr(), key.len() as u32, - value.as_ptr(), value.len() as u32 - ); + fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { + unsafe { + ext_set_child_storage.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32, + value.as_ptr(), value.len() as u32 + ); + } } -} -/// Clear the storage of some particular key. -pub fn clear_storage(key: &[u8]) { - unsafe { - ext_clear_storage.get()( - key.as_ptr(), key.len() as u32 - ); + fn clear_storage(key: &[u8]) { + unsafe { + ext_clear_storage.get()( + key.as_ptr(), key.len() as u32 + ); + } } -} -/// Clear the storage of some particular key. -pub fn clear_child_storage(storage_key: &[u8], key: &[u8]) { - unsafe { - ext_clear_child_storage.get()( - storage_key.as_ptr(), storage_key.len() as u32, - key.as_ptr(), key.len() as u32 - ); + fn clear_child_storage(storage_key: &[u8], key: &[u8]) { + unsafe { + ext_clear_child_storage.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32 + ); + } } -} -/// Determine whether a particular key exists in storage. -pub fn exists_storage(key: &[u8]) -> bool { - unsafe { - ext_exists_storage.get()( - key.as_ptr(), key.len() as u32 - ) != 0 + fn exists_storage(key: &[u8]) -> bool { + unsafe { + ext_exists_storage.get()( + key.as_ptr(), key.len() as u32 + ) != 0 + } } -} -/// Determine whether a particular key exists in storage. -pub fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { - unsafe { - ext_exists_child_storage.get()( - storage_key.as_ptr(), storage_key.len() as u32, - key.as_ptr(), key.len() as u32 - ) != 0 + fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { + unsafe { + ext_exists_child_storage.get()( + storage_key.as_ptr(), storage_key.len() as u32, + key.as_ptr(), key.len() as u32 + ) != 0 + } } -} -/// Clear the storage entries key of which starts with the given prefix. -pub fn clear_prefix(prefix: &[u8]) { - unsafe { - ext_clear_prefix.get()( - prefix.as_ptr(), - prefix.len() as u32 - ); + fn clear_prefix(prefix: &[u8]) { + unsafe { + ext_clear_prefix.get()( + prefix.as_ptr(), + prefix.len() as u32 + ); + } } -} -/// Clear an entire child storage. -pub fn kill_child_storage(storage_key: &[u8]) { - unsafe { - ext_kill_child_storage.get()( - storage_key.as_ptr(), - storage_key.len() as u32 - ); + fn kill_child_storage(storage_key: &[u8]) { + unsafe { + ext_kill_child_storage.get()( + storage_key.as_ptr(), + storage_key.len() as u32 + ); + } } -} -/// Get `key` from storage, placing the value into `value_out` (as much as possible) and return -/// the number of bytes that the key in storage was beyond the offset. -pub fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { - unsafe { - match ext_get_storage_into.get()( - key.as_ptr(), - key.len() as u32, - value_out.as_mut_ptr(), - value_out.len() as u32, - value_offset as u32, - ) { - none if none == u32::max_value() => None, - length => Some(length as usize), + fn storage_root() -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_storage_root.get()(result.as_mut_ptr()); } + result } -} -/// Get `key` from child storage, placing the value into `value_out` (as much as possible) and return -/// the number of bytes that the key in storage was beyond the offset. -pub fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { - unsafe { - match ext_get_child_storage_into.get()( - storage_key.as_ptr(), storage_key.len() as u32, - key.as_ptr(), key.len() as u32, - value_out.as_mut_ptr(), value_out.len() as u32, - value_offset as u32 - ) { - none if none == u32::max_value() => None, - length => Some(length as usize), + fn child_storage_root(storage_key: &[u8]) -> Vec { + let mut length: u32 = 0; + unsafe { + let ptr = ext_child_storage_root.get()( + storage_key.as_ptr(), + storage_key.len() as u32, + &mut length + ); + // Invariants required by Vec::from_raw_parts are not formally fulfilled. + // We don't allocate via String/Vec, but use a custom allocator instead. + // See #300 for more details. + >::from_raw_parts(ptr, length as usize, length as usize) } } -} -/// The current storage's root. -pub fn storage_root() -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_storage_root.get()(result.as_mut_ptr()); - } - result -} + fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { + let mut result: [u8; 32] = Default::default(); + let is_set = unsafe { + ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, parent_num, result.as_mut_ptr()) + }; -/// "Commit" all existing operations and compute the resultant child storage root. -pub fn child_storage_root(storage_key: &[u8]) -> Option> { - let mut length: u32 = 0; - unsafe { - let ptr = ext_child_storage_root.get()(storage_key.as_ptr(), storage_key.len() as u32, &mut length); - if length == u32::max_value() { - None + if is_set != 0 { + Some(result) } else { - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - Some(>::from_raw_parts(ptr, length as usize, length as usize)) + None } } -} -/// The current storage' changes root. -pub fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { - let mut result: [u8; 32] = Default::default(); - let is_set = unsafe { - ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, parent_num, result.as_mut_ptr()) - }; + fn enumerated_trie_root(values: &[&[u8]]) -> H::Out { + H::enumerated_trie_root(values) + } - if is_set != 0 { - Some(result) - } else { - None + fn trie_root< + H: Hasher + ExternTrieCrypto, + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, + >(_input: I) -> H::Out { + unimplemented!() } -} -/// A trie root calculated from enumerated values. -pub fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32] { - H::enumerated_trie_root(values) + fn ordered_trie_root< + H: Hasher + ExternTrieCrypto, + I: IntoIterator, + A: AsRef<[u8]> + >(_input: I) -> H::Out { + unimplemented!() + } } -/// A trie root formed from the iterated items. -pub fn trie_root< - H: Hasher + ExternTrieCrypto, - I: IntoIterator, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, ->(_input: I) -> [u8; 32] { - unimplemented!() -} +impl OtherApi for () { + fn chain_id() -> u64 { + unsafe { + ext_chain_id.get()() + } + } + + fn print(value: T) { + value.print() + } -/// A trie root formed from the enumerated items. -pub fn ordered_trie_root< - H: Hasher + ExternTrieCrypto, - I: IntoIterator, - A: AsRef<[u8]> ->(_input: I) -> [u8; 32] { - unimplemented!() } -/// The current relay chain identifier. -pub fn chain_id() -> u64 { - unsafe { - ext_chain_id.get()() +impl HashingApi for () { + fn keccak_256(data: &[u8]) -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_keccak_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } -} -/// Conduct a 256-bit Blake2 hash. -pub fn blake2_256(data: &[u8]) -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_blake2_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn blake2_128(data: &[u8]) -> [u8; 16] { + let mut result: [u8; 16] = Default::default(); + unsafe { + ext_blake2_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } - result -} -/// Conduct a 256-bit Keccak hash. -pub fn keccak_256(data: &[u8]) -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_keccak_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn blake2_256(data: &[u8]) -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_blake2_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } - result -} -/// Conduct four XX hashes to give a 256-bit result. -pub fn twox_256(data: &[u8]) -> [u8; 32] { - let mut result: [u8; 32] = Default::default(); - unsafe { - ext_twox_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn twox_256(data: &[u8]) -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_twox_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } - result -} -/// Conduct two XX hashes to give a 128-bit result. -pub fn twox_128(data: &[u8]) -> [u8; 16] { - let mut result: [u8; 16] = Default::default(); - unsafe { - ext_twox_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + fn twox_128(data: &[u8]) -> [u8; 16] { + let mut result: [u8; 16] = Default::default(); + unsafe { + ext_twox_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } - result -} -/// Verify a ed25519 signature. -pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - unsafe { - ext_ed25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + fn twox_64(data: &[u8]) -> [u8; 8] { + let mut result: [u8; 8] = Default::default(); + unsafe { + ext_twox_64.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + } + result } } -/// Verify a sr25519 signature. -pub fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - unsafe { - ext_sr25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 +impl CryptoApi for () { + fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + unsafe { + ext_ed25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + } } -} -/// Verify and recover a SECP256k1 ECDSA signature. -/// - `sig` is passed in RSV format. V should be either 0/1 or 27/28. -/// - returns `None` if the signature is bad, the 64-byte pubkey (doesn't include the 0x04 prefix). -pub fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { - let mut pubkey = [0u8; 64]; - match unsafe { - ext_secp256k1_ecdsa_recover.get()(msg.as_ptr(), sig.as_ptr(), pubkey.as_mut_ptr()) - } { - 0 => Ok(pubkey), - 1 => Err(EcdsaVerifyError::BadRS), - 2 => Err(EcdsaVerifyError::BadV), - 3 => Err(EcdsaVerifyError::BadSignature), - _ => unreachable!("`ext_secp256k1_ecdsa_recover` only returns 0, 1, 2 or 3; qed"), + fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { + unsafe { + ext_sr25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + } } -} -/// Submit extrinsic from the runtime. -/// -/// Depending on the kind of extrinsic it will either be: -/// 1. scheduled to be included in the next produced block (inherent) -/// 2. added to the pool and propagated (transaction) -pub fn submit_extrinsic(data: &T) { - let encoded_data = codec::Encode::encode(data); - unsafe { - ext_submit_extrinsic.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { + let mut pubkey = [0u8; 64]; + match unsafe { + ext_secp256k1_ecdsa_recover.get()(msg.as_ptr(), sig.as_ptr(), pubkey.as_mut_ptr()) + } { + 0 => Ok(pubkey), + 1 => Err(EcdsaVerifyError::BadRS), + 2 => Err(EcdsaVerifyError::BadV), + 3 => Err(EcdsaVerifyError::BadSignature), + _ => unreachable!("`ext_secp256k1_ecdsa_recover` only returns 0, 1, 2 or 3; qed"), + } } } -/// Trait for things which can be printed. -pub trait Printable { - fn print(self); +impl OffchainApi for () { + fn submit_extrinsic(data: &T) { + let encoded_data = codec::Encode::encode(data); + unsafe { + ext_submit_extrinsic.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + } + } } +impl Api for () {} + impl<'a> Printable for &'a [u8] { fn print(self) { unsafe { @@ -639,8 +655,3 @@ impl Printable for u64 { unsafe { ext_print_num.get()(self); } } } - -/// Print a printable value. -pub fn print(value: T) { - value.print(); -} diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml index dfd47f097c04a63469edd33c825e9ceb63b6fe82..bb6c7b995148f991c32922dfed0b5e5d50828a80 100644 --- a/core/sr-primitives/Cargo.toml +++ b/core/sr-primitives/Cargo.toml @@ -1,14 +1,13 @@ [package] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] num-traits = { version = "0.2", default-features = false } integer-sqrt = { version = "0.1.2" } -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } substrate-primitives = { path = "../primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } @@ -17,13 +16,13 @@ log = { version = "0.4", optional = true } [dev-dependencies] serde_json = "1.0" +primitive-types = "0.2" [features] default = ["std"] std = [ "num-traits/std", "serde", - "serde_derive", "log", "rstd/std", "runtime_io/std", diff --git a/core/sr-primitives/src/generic/block.rs b/core/sr-primitives/src/generic/block.rs index 5fb83a2a4f766251ca7908196148e89ade4a075e..f0f3c88fe7ea2f937fba51572f35a29094c7146d 100644 --- a/core/sr-primitives/src/generic/block.rs +++ b/core/sr-primitives/src/generic/block.rs @@ -20,7 +20,7 @@ use std::fmt; #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; use rstd::prelude::*; use crate::codec::{Codec, Encode, Decode}; diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 8eed63900ffe89662e6c69fdafc5655a61e07c37..265ceb5941a3d71ae30278dff781c467ebabb542 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -17,7 +17,7 @@ //! Generic implementation of a digest. #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; use rstd::prelude::*; @@ -72,7 +72,10 @@ pub enum DigestItem { /// trie creation. ChangesTrieRoot(Hash), /// The old way to put a Seal on it. Deprecated. - #[deprecated] + #[deprecated( + since = "1.0", + note = "New versions of Substrate will never generate this, and it will be rejected on new blockchains.", + )] Seal(u64, SealSignature), /// Put a Seal on it Consensus(ConsensusEngineId, Vec), diff --git a/core/sr-primitives/src/generic/era.rs b/core/sr-primitives/src/generic/era.rs index e5a7b24f0cc5f3f975c6aaf80ec086456ed21e97..22f47b6769df403549da754d50c115065b892367 100644 --- a/core/sr-primitives/src/generic/era.rs +++ b/core/sr-primitives/src/generic/era.rs @@ -17,7 +17,7 @@ //! Generic implementation of an unchecked (pre-verification) extrinsic. #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use crate::codec::{Decode, Encode, Input, Output}; diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index 60ccd93b3ded8ccebeb7f8770d1ca649c4ff5354..efcc7614ed7c8e725f57796691b2ba3bf5c5ed4a 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -17,7 +17,7 @@ //! Generic implementation of a block header. #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef}; use crate::traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Hash as HashT, DigestItem as DigestItemT, MaybeSerializeDebug, MaybeSerializeDebugButNotDeserialize}; diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index 47ce3cb25184f7b2c44d4cb1d4837247d981027f..b0f86f959fe6285b037826dd7e27da1d50ee8adb 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -52,7 +52,7 @@ fn encode_with_vec_prefix)>(encoder: F) -> Vec v.resize(reserve, 0); encoder(&mut v); - // need to prefix with the total length to ensure it's binary comptible with + // need to prefix with the total length to ensure it's binary compatible with // Vec. let mut length: Vec<()> = Vec::new(); length.resize(v.len() - reserve, ()); diff --git a/core/sr-primitives/src/generic/tests.rs b/core/sr-primitives/src/generic/tests.rs index 91fc8f3faf90486b67174463e2993a73caa10ac9..b42c05ea4cd4293960a241fd2f325df074bb28f2 100644 --- a/core/sr-primitives/src/generic/tests.rs +++ b/core/sr-primitives/src/generic/tests.rs @@ -27,7 +27,7 @@ fn system_digest_item_encoding() { assert_eq!(encoded, vec![ // type = DigestItemType::AuthoritiesChange 1, - // number of items in athorities set + // number of items in authorities set 12, // authorities 10, 0, 0, 0, diff --git a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs index 243747092c49ca8100b6aa9a8490cb72c3cf775d..36e17fc277cdeed0ef742cb1da20e3203263739e 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs @@ -22,8 +22,8 @@ use std::fmt; use rstd::prelude::*; use runtime_io::blake2_256; use crate::codec::{Decode, Encode, Input, Compact}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, Lookup, - Checkable, Extrinsic}; +use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, + Lookup, Checkable, Extrinsic, SaturatedConversion}; use super::{CheckedExtrinsic, Era}; const TRANSACTION_VERSION: u8 = 1; @@ -84,7 +84,8 @@ where fn check(self, context: &Context) -> Result { Ok(match self.signature { Some((signed, signature, index, era)) => { - let h = context.block_number_to_hash(BlockNumber::sa(era.birth(context.current_height().as_()))) + let current_u64 = context.current_height().saturated_into::(); + let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) .ok_or("transaction birth block ancient")?; let signed = context.lookup(signed)?; let raw_payload = (index, self.function, era, h); @@ -191,7 +192,7 @@ mod tests { use super::*; use runtime_io::blake2_256; use crate::codec::{Encode, Decode}; - use serde_derive::{Serialize, Deserialize}; + use serde::{Serialize, Deserialize}; struct TestContext; impl Lookup for TestContext { diff --git a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs index 93eeb55884479281a77071953602553e576e012f..7f92b20edd0c3143e3b35d1dc47327d9f575ec62 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs @@ -22,8 +22,10 @@ use std::fmt; use rstd::prelude::*; use runtime_io::blake2_256; use crate::codec::{Decode, Encode, Input}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, Lookup, - Checkable, Extrinsic}; +use crate::traits::{ + self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, + Lookup, Checkable, Extrinsic, SaturatedConversion +}; use super::{CheckedExtrinsic, Era}; const TRANSACTION_VERSION: u8 = 1; @@ -83,7 +85,8 @@ where fn check(self, context: &Context) -> Result { Ok(match self.signature { Some((signed, signature, index, era)) => { - let h = context.block_number_to_hash(BlockNumber::sa(era.birth(context.current_height().as_()))) + let current_u64 = context.current_height().saturated_into::(); + let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) .ok_or("transaction birth block ancient")?; let signed = context.lookup(signed)?; let raw_payload = (index, self.function, era, h); @@ -190,7 +193,7 @@ mod tests { use super::*; use runtime_io::blake2_256; use crate::codec::{Encode, Decode}; - use serde_derive::{Serialize, Deserialize}; + use serde::{Serialize, Deserialize}; struct TestContext; impl Lookup for TestContext { diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 5167e57072a2b2e93373a04f2dc8d3d8fbc787aa..05938a6a8204c9f60c03ca2bca4f654c0e8de6b8 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -24,22 +24,21 @@ pub use parity_codec as codec; #[cfg(feature = "std")] #[doc(hidden)] -pub use serde_derive; +pub use serde; #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; -use rstd::prelude::*; -use substrate_primitives::{ed25519, sr25519, hash::H512}; +use rstd::{prelude::*, ops}; +use substrate_primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; -#[cfg(feature = "std")] -use substrate_primitives::hexdisplay::ascii_format; - #[cfg(feature = "std")] pub mod testing; pub mod traits; +use traits::{SaturatedConversion, UniqueSaturatedInto}; + pub mod generic; pub mod transaction_validity; @@ -83,21 +82,11 @@ macro_rules! create_runtime_str { } #[cfg(feature = "std")] -pub use serde::{Serialize, de::DeserializeOwned}; -#[cfg(feature = "std")] -pub use serde_derive::{Serialize, Deserialize}; +pub use serde::{Serialize, Deserialize, de::DeserializeOwned}; /// Complex storage builder stuff. #[cfg(feature = "std")] pub trait BuildStorage: Sized { - /// Hash given slice. - /// - /// Default to xx128 hashing. - fn hash(data: &[u8]) -> [u8; 16] { - let r = runtime_io::twox_128(data); - log::trace!(target: "build_storage", "{} <= {}", substrate_primitives::hexdisplay::HexDisplay::from(&r), ascii_format(data)); - r - } /// Build the storage out of this builder. fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { let mut storage = Default::default(); @@ -114,12 +103,32 @@ impl BuildStorage for StorageOverlay { fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { Ok((self, Default::default())) } - fn assimilate_storage(self, storage: &mut StorageOverlay, _child_storage: &mut ChildrenStorageOverlay) -> Result<(), String> { + fn assimilate_storage( + self, + storage: &mut StorageOverlay, + _child_storage: &mut ChildrenStorageOverlay + ) -> Result<(), String> { storage.extend(self); Ok(()) } } +#[cfg(feature = "std")] +impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { + fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { + Ok(self) + } + fn assimilate_storage( + self, + storage: &mut StorageOverlay, + child_storage: &mut ChildrenStorageOverlay + )-> Result<(), String> { + storage.extend(self.0); + child_storage.extend(self.1); + Ok(()) + } +} + /// Consensus engine unique ID. pub type ConsensusEngineId = [u8; 4]; @@ -129,24 +138,55 @@ pub type ConsensusEngineId = [u8; 4]; pub struct Permill(u32); impl Permill { - /// Wraps the argument into `Permill` type. - pub fn from_millionths(x: u32) -> Permill { Permill(x) } + /// Nothing. + pub fn zero() -> Self { Self(0) } + + /// `true` if this is nothing. + pub fn is_zero(&self) -> bool { self.0 == 0 } + + /// Everything. + pub fn one() -> Self { Self(1_000_000) } - /// Converts percents into `Permill`. - pub fn from_percent(x: u32) -> Permill { Permill(x * 10_000) } + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000)) } + + /// Converts from a percent. Equal to `x / 100`. + pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000) } /// Converts a fraction into `Permill`. #[cfg(feature = "std")] - pub fn from_fraction(x: f64) -> Permill { Permill((x * 1_000_000.0) as u32) } + pub fn from_fraction(x: f64) -> Self { Self((x * 1_000_000.0) as u32) } } -impl ::rstd::ops::Mul for Permill +impl ops::Mul for Permill where - N: traits::As + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - >::sa(b.as_().saturating_mul(self.0 as u64) / 1_000_000) + let million: N = 1_000_000.into(); + let part: N = self.0.into(); + + let rem_multiplied_divided = { + let rem = b.clone().rem(million.clone()); + + // `rem` is inferior to one million, thus it fits into u32 + let rem_u32 = rem.saturated_into::(); + + // `self` and `rem` are inferior to one million, thus the product is less than 10^12 + // and fits into u64 + let rem_multiplied_u64 = rem_u32 as u64 * self.0 as u64; + + // `rem_multiplied_u64` is less than 10^12 therefore divided by a million it fits into + // u32 + let rem_multiplied_divided_u32 = (rem_multiplied_u64 / 1_000_000) as u32; + + // `rem_multiplied_divided` is inferior to b, thus it can be converted back to N type + rem_multiplied_divided_u32.into() + }; + + (b / million) * part + rem_multiplied_divided } } @@ -188,39 +228,57 @@ pub struct Perbill(u32); impl Perbill { /// Nothing. - pub fn zero() -> Perbill { Perbill(0) } + pub fn zero() -> Self { Self(0) } /// `true` if this is nothing. pub fn is_zero(&self) -> bool { self.0 == 0 } /// Everything. - pub fn one() -> Perbill { Perbill(1_000_000_000) } + pub fn one() -> Self { Self(1_000_000_000) } - /// Construct new instance where `x` is in billionths. Value equivalent to `x / 1,000,000,000`. - pub fn from_billionths(x: u32) -> Perbill { Perbill(x.min(1_000_000_000)) } + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000_000)) } - /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. - pub fn from_millionths(x: u32) -> Perbill { Perbill(x.min(1_000_000) * 1000) } + /// Converts from a percent. Equal to `x / 100`. + pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000_000) } - /// Construct new instance where `x` is a percent. Value equivalent to `x%`. - pub fn from_percent(x: u32) -> Perbill { Perbill(x.min(100) * 10_000_000) } + /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. + pub fn from_millionths(x: u32) -> Self { Self(x.min(1_000_000) * 1000) } #[cfg(feature = "std")] /// Construct new instance whose value is equal to `x` (between 0 and 1). - pub fn from_fraction(x: f64) -> Perbill { Perbill((x.max(0.0).min(1.0) * 1_000_000_000.0) as u32) } - - #[cfg(feature = "std")] - /// Construct new instance whose value is equal to `n / d` (between 0 and 1). - pub fn from_rational(n: f64, d: f64) -> Perbill { Perbill(((n / d).max(0.0).min(1.0) * 1_000_000_000.0) as u32) } + pub fn from_fraction(x: f64) -> Self { Self((x.max(0.0).min(1.0) * 1_000_000_000.0) as u32) } } -impl ::rstd::ops::Mul for Perbill +impl ops::Mul for Perbill where - N: traits::As + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - >::sa(b.as_().saturating_mul(self.0 as u64) / 1_000_000_000) + let billion: N = 1_000_000_000.into(); + let part: N = self.0.into(); + + let rem_multiplied_divided = { + let rem = b.clone().rem(billion.clone()); + + // `rem` is inferior to one billion, thus it fits into u32 + let rem_u32 = rem.saturated_into::(); + + // `self` and `rem` are inferior to one billion, thus the product is less than 10^18 + // and fits into u64 + let rem_multiplied_u64 = rem_u32 as u64 * self.0 as u64; + + // `rem_multiplied_u64` is less than 10^18 therefore divided by a billion it fits into + // u32 + let rem_multiplied_divided_u32 = (rem_multiplied_u64 / 1_000_000_000) as u32; + + // `rem_multiplied_divided` is inferior to b, thus it can be converted back to N type + rem_multiplied_divided_u32.into() + }; + + (b / billion) * part + rem_multiplied_divided } } @@ -266,11 +324,14 @@ impl PerU128 { /// Nothing. pub fn zero() -> Self { Self(0) } + /// `true` if this is nothing. + pub fn is_zero(&self) -> bool { self.0 == 0 } + /// Everything. pub fn one() -> Self { Self(U128) } - /// Construct new instance where `x` is parts in u128::max_value. Equal to x/U128::max_value. - pub fn from_max_value(x: u128) -> Self { Self(x) } + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u128) -> Self { Self(x) } /// Construct new instance where `x` is denominator and the nominator is 1. pub fn from_xth(x: u128) -> Self { Self(U128/x.max(1)) } @@ -310,6 +371,18 @@ pub enum MultiSignature { Sr25519(sr25519::Signature), } +impl From for MultiSignature { + fn from(x: ed25519::Signature) -> Self { + MultiSignature::Ed25519(x) + } +} + +impl From for MultiSignature { + fn from(x: sr25519::Signature) -> Self { + MultiSignature::Sr25519(x) + } +} + impl Default for MultiSignature { fn default() -> Self { MultiSignature::Ed25519(Default::default()) @@ -332,6 +405,45 @@ impl Default for MultiSigner { } } +/// NOTE: This implementations is required by `SimpleAddressDeterminator`, +/// we convert the hash into some AccountId, it's fine to use any scheme. +impl> crypto::UncheckedFrom for MultiSigner { + fn unchecked_from(x: T) -> Self { + ed25519::Public::unchecked_from(x.into()).into() + } +} + +impl AsRef<[u8]> for MultiSigner { + fn as_ref(&self) -> &[u8] { + match *self { + MultiSigner::Ed25519(ref who) => who.as_ref(), + MultiSigner::Sr25519(ref who) => who.as_ref(), + } + } +} + +impl From for MultiSigner { + fn from(x: ed25519::Public) -> Self { + MultiSigner::Ed25519(x) + } +} + +impl From for MultiSigner { + fn from(x: sr25519::Public) -> Self { + MultiSigner::Sr25519(x) + } +} + + #[cfg(feature = "std")] +impl std::fmt::Display for MultiSigner { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + match *self { + MultiSigner::Ed25519(ref who) => write!(fmt, "ed25519: {}", who), + MultiSigner::Sr25519(ref who) => write!(fmt, "sr25519: {}", who), + } + } +} + impl Verify for MultiSignature { type Signer = MultiSigner; fn verify>(&self, msg: L, signer: &Self::Signer) -> bool { @@ -357,8 +469,14 @@ impl Verify for AnySignature { } impl From for AnySignature { - fn from(s: sr25519::Signature) -> AnySignature { - AnySignature(s.0.into()) + fn from(s: sr25519::Signature) -> Self { + AnySignature(s.into()) + } +} + +impl From for AnySignature { + fn from(s: ed25519::Signature) -> Self { + AnySignature(s.into()) } } @@ -471,7 +589,7 @@ macro_rules! impl_outer_config { ) => { $crate::__impl_outer_config_types! { $concrete $( $config $snake $( < $generic $(, $instance)? > )* )* } #[cfg(any(feature = "std", test))] - #[derive($crate::serde_derive::Serialize, $crate::serde_derive::Deserialize)] + #[derive($crate::serde::Serialize, $crate::serde::Deserialize)] #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] pub struct $main { @@ -519,7 +637,7 @@ macro_rules! impl_outer_log { /// Wrapper for all possible log entries for the `$trait` runtime. Provides binary-compatible /// `Encode`/`Decode` implementations with the corresponding `generic::DigestItem`. #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, $crate::serde_derive::Serialize))] + #[cfg_attr(feature = "std", derive(Debug, $crate::serde::Serialize))] $(#[$attr])* #[allow(non_camel_case_types)] pub struct $name($internal); @@ -527,7 +645,7 @@ macro_rules! impl_outer_log { /// All possible log entries for the `$trait` runtime. `Encode`/`Decode` implementations /// are auto-generated => it is not binary-compatible with `generic::DigestItem`. #[derive(Clone, PartialEq, Eq, $crate::codec::Encode, $crate::codec::Decode)] - #[cfg_attr(feature = "std", derive(Debug, $crate::serde_derive::Serialize))] + #[cfg_attr(feature = "std", derive(Debug, $crate::serde::Serialize))] $(#[$attr])* #[allow(non_camel_case_types)] pub enum InternalLog { @@ -671,7 +789,7 @@ mod tests { mod a { use super::RuntimeT; use crate::codec::{Encode, Decode}; - use serde_derive::Serialize; + use serde::Serialize; pub type Log = RawLog<::AuthorityId>; #[derive(Serialize, Debug, Encode, Decode, PartialEq, Eq, Clone)] @@ -681,7 +799,7 @@ mod tests { mod b { use super::RuntimeT; use crate::codec::{Encode, Decode}; - use serde_derive::Serialize; + use serde::Serialize; pub type Log = RawLog<::AuthorityId>; #[derive(Serialize, Debug, Encode, Decode, PartialEq, Eq, Clone)] @@ -694,6 +812,24 @@ mod tests { } } + macro_rules! per_thing_mul_upper_test { + ($num_type:tt, $per:tt) => { + // all sort of from_percent + assert_eq!($per::from_percent(100) * $num_type::max_value(), $num_type::max_value()); + assert_eq!( + $per::from_percent(99) * $num_type::max_value(), + ((Into::::into($num_type::max_value()) * 99u32) / 100u32).as_u128() as $num_type + ); + assert_eq!($per::from_percent(50) * $num_type::max_value(), $num_type::max_value() / 2); + assert_eq!($per::from_percent(1) * $num_type::max_value(), $num_type::max_value() / 100); + assert_eq!($per::from_percent(0) * $num_type::max_value(), 0); + + // bounds + assert_eq!($per::one() * $num_type::max_value(), $num_type::max_value()); + assert_eq!($per::zero() * $num_type::max_value(), 0); + } + } + #[test] fn impl_outer_log_works() { // encode/decode regular item @@ -775,8 +911,36 @@ mod tests { } #[test] - fn saturating_mul() { - assert_eq!(super::Perbill::one() * std::u64::MAX, std::u64::MAX/1_000_000_000); - assert_eq!(super::Permill::from_percent(100) * std::u64::MAX, std::u64::MAX/1_000_000); + fn per_things_should_work() { + use super::{Perbill, Permill}; + use primitive_types::U256; + + per_thing_mul_upper_test!(u32, Perbill); + per_thing_mul_upper_test!(u64, Perbill); + per_thing_mul_upper_test!(u128, Perbill); + + per_thing_mul_upper_test!(u32, Permill); + per_thing_mul_upper_test!(u64, Permill); + per_thing_mul_upper_test!(u128, Permill); + } + + #[test] + fn per_things_operate_in_output_type() { + assert_eq!(super::Perbill::one() * 255_u64, 255); + } + + #[test] + fn per_things_one_minus_one_part() { + use primitive_types::U256; + + assert_eq!( + super::Perbill::from_parts(999_999_999) * std::u128::MAX, + ((Into::::into(std::u128::MAX) * 999_999_999u32) / 1_000_000_000u32).as_u128() + ); + + assert_eq!( + super::Permill::from_parts(999_999) * std::u128::MAX, + ((Into::::into(std::u128::MAX) * 999_999u32) / 1_000_000u32).as_u128() + ); } } diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index 2711c0e623d62a171f249ab8adbe9bb998a77e07..e8e5aa20b46fe6351014860f8eea982a0123a85d 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -17,16 +17,13 @@ //! Testing utilities. use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializer}; -use serde_derive::Serialize; -#[cfg(feature = "std")] -use serde_derive::Deserialize; use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; use crate::traits::{self, Checkable, Applyable, BlakeTwo256, Convert}; use crate::generic::DigestItem as GenDigestItem; pub use substrate_primitives::H256; use substrate_primitives::U256; -use substrate_primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; +use substrate_primitives::sr25519::{Public as AuthorityId, Signature as AuthoritySignature}; /// Authority Id #[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] @@ -202,7 +199,10 @@ impl<'a, Xt> Deserialize<'a> for Block where Block: Decode { } } -/// Test transaction +/// Test transaction, tuple of (sender, index, call) +/// with index only used if sender is some. +/// +/// If sender is some then the transaction is signed otherwise it is unsigned. #[derive(PartialEq, Eq, Clone, Encode, Decode)] pub struct TestXt(pub Option, pub u64, pub Call); @@ -225,7 +225,7 @@ impl Checkable for TestXt { } impl traits::Extrinsic for TestXt { fn is_signed(&self) -> Option { - None + Some(self.0.is_some()) } } impl Applyable for TestXt where diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index b62bc067b6b84c8e5374ae0af5aefdcacc9a9ffb..8906bbf07485faa4b1664c3c4b820b3f755dd479 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -17,18 +17,17 @@ //! Primitives for the runtime modules. use rstd::prelude::*; -use rstd::{self, result, marker::PhantomData}; +use rstd::{self, result, marker::PhantomData, convert::{TryFrom, TryInto}}; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; -#[cfg(feature = "std")] use serde::{Serialize, de::DeserializeOwned}; -#[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +#[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; use substrate_primitives::{self, Hasher, Blake2Hasher}; use crate::codec::{Codec, Encode, HasCompact}; +use crate::transaction_validity::TransactionValidity; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, - CheckedShl, CheckedShr, Saturating + CheckedShl, CheckedShr }; use rstd::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, @@ -152,106 +151,149 @@ impl Convert for () { fn convert(_: A) -> B { Default::default() } } -/// A structure that converts the currency type into a lossy u64 -/// And back from u128 -pub struct CurrencyToVoteHandler; - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u64 { - if x >> 96 == 0 { - // Remove dust; divide by 2^32 - (x >> 32) as u64 - } else { - u64::max_value() - } - } -} - -impl Convert for CurrencyToVoteHandler { - fn convert(x: u128) -> u128 { - // if it practically fits in u64 - if x >> 64 == 0 { - // Add zero dust; multiply by 2^32 - x << 32 - } - else { - // 0000_0000_FFFF_FFFF_FFFF_FFFF_0000_0000 - (u64::max_value() << 32) as u128 - } - } -} - /// A structure that performs identity conversion. pub struct Identity; impl Convert for Identity { fn convert(a: T) -> T { a } } -/// Simple trait similar to `Into`, except that it can be used to convert numerics between each -/// other. -pub trait As { - /// Convert forward (ala `Into::into`). - fn as_(self) -> T; - /// Convert backward (ala `From::from`). - fn sa(_: T) -> Self; -} - -macro_rules! impl_numerics { - ( $( $t:ty ),* ) => { - $( - impl_numerics!($t: u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize,); - )* - }; - ( $f:ty : $t:ty, $( $rest:ty, )* ) => { - impl As<$t> for $f { - fn as_(self) -> $t { self as $t } - fn sa(t: $t) -> Self { t as Self } - } - impl_numerics!($f: $( $rest, )*); - }; - ( $f:ty : ) => {} -} - -impl_numerics!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize); - /// A meta trait for arithmetic. +/// +/// Arithmetic types do all the usual stuff you'd expect numbers to do. They are guaranteed to +/// be able to represent at least `u32` values without loss, hence the trait implies `From` +/// and smaller ints. All other conversions are fallible. pub trait SimpleArithmetic: - Zero + One + IntegerSquareRoot + As + + Zero + One + IntegerSquareRoot + + From + From + From + TryInto + TryInto + TryInto + + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + - CheckedShl + - CheckedShr + - CheckedAdd + - CheckedSub + - CheckedMul + - CheckedDiv + - Saturating + - PartialOrd + Ord + Bounded + - HasCompact + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + + Saturating + PartialOrd + Ord + Bounded + + HasCompact + Sized {} impl + + Zero + One + IntegerSquareRoot + + From + From + From + TryInto + TryInto + TryInto + + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + - CheckedShl + - CheckedShr + - CheckedAdd + - CheckedSub + - CheckedMul + - CheckedDiv + - Saturating + - PartialOrd + Ord + Bounded + - HasCompact + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + + Saturating + PartialOrd + Ord + Bounded + + HasCompact + Sized > SimpleArithmetic for T {} +/// Just like `From` except that if the source value is too big to fit into the destination type +/// then it'll saturate the destination. +pub trait UniqueSaturatedFrom: Sized { + /// Convert from a value of `T` into an equivalent instance of `Self`. + fn unique_saturated_from(t: T) -> Self; +} + +/// Just like `Into` except that if the source value is too big to fit into the destination type +/// then it'll saturate the destination. +pub trait UniqueSaturatedInto: Sized { + /// Consume self to return an equivalent value of `T`. + fn unique_saturated_into(self) -> T; +} + +impl + Bounded + Sized> UniqueSaturatedFrom for S { + fn unique_saturated_from(t: T) -> Self { + S::try_from(t).unwrap_or_else(|_| Bounded::max_value()) + } +} + +impl + Sized> UniqueSaturatedInto for S { + fn unique_saturated_into(self) -> T { + self.try_into().unwrap_or_else(|_| Bounded::max_value()) + } +} + +/// Simple trait to use checked mul and max value to give a saturated mul operation over +/// supported types. +pub trait Saturating { + /// Saturated addition - if the product can't fit in the type then just use max-value. + fn saturating_add(self, o: Self) -> Self; + + /// Saturated subtraction - if the product can't fit in the type then just use max-value. + fn saturating_sub(self, o: Self) -> Self; + + /// Saturated multiply - if the product can't fit in the type then just use max-value. + fn saturating_mul(self, o: Self) -> Self; +} + +impl Saturating for T { + fn saturating_add(self, o: Self) -> Self { + ::saturating_add(self, o) + } + fn saturating_sub(self, o: Self) -> Self { + ::saturating_sub(self, o) + } + fn saturating_mul(self, o: Self) -> Self { + self.checked_mul(&o).unwrap_or_else(Bounded::max_value) + } +} + +/// Convenience type to work around the highly unergonomic syntax needed +/// to invoke the functions of overloaded generic traits, in this case +/// `SaturatedFrom` and `SaturatedInto`. +pub trait SaturatedConversion { + /// Convert from a value of `T` into an equivalent instance of `Self`. + /// + /// This just uses `UniqueSaturatedFrom` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn saturated_from(t: T) -> Self where Self: UniqueSaturatedFrom { + >::unique_saturated_from(t) + } + + /// Consume self to return an equivalent value of `T`. + /// + /// This just uses `UniqueSaturatedInto` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn saturated_into(self) -> T where Self: UniqueSaturatedInto { + >::unique_saturated_into(self) + } +} +impl SaturatedConversion for T {} + +/// Convenience type to work around the highly unergonomic syntax needed +/// to invoke the functions of overloaded generic traits, in this case +/// `TryFrom` and `TryInto`. +pub trait CheckedConversion { + /// Convert from a value of `T` into an equivalent instance of `Option`. + /// + /// This just uses `TryFrom` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn checked_from(t: T) -> Option where Self: TryFrom { + >::try_from(t).ok() + } + /// Consume self to return `Some` equivalent value of `Option`. + /// + /// This just uses `TryInto` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn checked_into(self) -> Option where Self: TryInto { + >::try_into(self).ok() + } +} +impl CheckedConversion for T {} + /// Trait for things that can be clear (have no bits set). For numeric types, essentially the same /// as `Zero`. pub trait Clear { @@ -301,9 +343,9 @@ impl OnInitialize for () {} /// Off-chain computation trait. /// -/// Implementing this trait on a module allows you to perform a long-running tasks +/// Implementing this trait on a module allows you to perform long-running tasks /// that make validators generate extrinsics (either transactions or inherents) -/// with results of those long-running computations. +/// with the results of those long-running computations. /// /// NOTE: This function runs off-chain, so it can access the block state, /// but cannot preform any alterations. @@ -318,56 +360,39 @@ pub trait OffchainWorker { impl OffchainWorker for () {} macro_rules! tuple_impl { - ($one:ident,) => { - impl> OnFinalize for ($one,) { - fn on_finalize(n: Number) { - $one::on_finalize(n); - } - } - impl> OnInitialize for ($one,) { - fn on_initialize(n: Number) { - $one::on_initialize(n); - } - } - impl> OffchainWorker for ($one,) { - fn generate_extrinsics(n: Number) { - $one::generate_extrinsics(n); - } - } - }; ($first:ident, $($rest:ident,)+) => { + tuple_impl!([$first] [$first] [$($rest)+]); + }; + ([$($direct:ident)+] [$($reverse:ident)+] []) => { impl< Number: Copy, - $first: OnFinalize, - $($rest: OnFinalize),+ - > OnFinalize for ($first, $($rest),+) { + $($direct: OnFinalize),+ + > OnFinalize for ($($direct),+,) { fn on_finalize(n: Number) { - $first::on_finalize(n); - $($rest::on_finalize(n);)+ + $($reverse::on_finalize(n);)+ } } impl< Number: Copy, - $first: OnInitialize, - $($rest: OnInitialize),+ - > OnInitialize for ($first, $($rest),+) { + $($direct: OnInitialize),+ + > OnInitialize for ($($direct),+,) { fn on_initialize(n: Number) { - $first::on_initialize(n); - $($rest::on_initialize(n);)+ + $($direct::on_initialize(n);)+ } } impl< Number: Copy, - $first: OffchainWorker, - $($rest: OffchainWorker),+ - > OffchainWorker for ($first, $($rest),+) { + $($direct: OffchainWorker),+ + > OffchainWorker for ($($direct),+,) { fn generate_extrinsics(n: Number) { - $first::generate_extrinsics(n); - $($rest::generate_extrinsics(n);)+ + $($direct::generate_extrinsics(n);)+ } } - tuple_impl!($($rest,)+); - } + }; + ([$($direct:ident)+] [$($reverse:ident)+] [$first:ident $($rest:ident)*]) => { + tuple_impl!([$($direct)+] [$($reverse)+] []); + tuple_impl!([$($direct)+ $first] [$first $($reverse)+] [$($rest)*]); + }; } #[allow(non_snake_case)] @@ -779,6 +804,12 @@ impl<'a, T> rstd::ops::Deref for ApiRef<'a, T> { } } +impl<'a, T> rstd::ops::DerefMut for ApiRef<'a, T> { + fn deref_mut(&mut self) -> &mut T { + &mut self.0 + } +} + /// Something that provides a runtime api. pub trait ProvideRuntimeApi { /// The concrete type that provides the api. @@ -811,3 +842,17 @@ pub trait RuntimeApiInfo { /// The version of the runtime api. const VERSION: u32; } + +/// Something that can validate unsigned extrinsics. +pub trait ValidateUnsigned { + /// The call to validate + type Call; + + /// Return the validity of the call + /// + /// This doesn't execute any side-effects; it merely checks + /// whether the transaction would panic if it were included or not. + /// + /// Changes made to storage should be discarded by caller. + fn validate_unsigned(call: &Self::Call) -> TransactionValidity; +} diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index 7cf3aa1d6d6a1bb62f1f94a90ff523c48bdb4a28..d927bd74e452a5b894ce23c96a2bdb2e8712e938 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -49,7 +49,7 @@ pub enum TransactionValidity { requires: Vec, /// Provided tags /// - /// A list of tags this transaction provides. Successfuly importing the transaction + /// A list of tags this transaction provides. Successfully importing the transaction /// will enable other transactions that depend on (require) those tags to be included as well. /// Provided and requried tags allow Substrate to build a dependency graph of transactions /// and import them in the right (linear) order. diff --git a/core/sr-sandbox/Cargo.toml b/core/sr-sandbox/Cargo.toml index eac21de9527a40712975a2f1a680f1eaced5e09a..f8d98253ad7143e083a4dc039d5da81f2a1f7224 100755 --- a/core/sr-sandbox/Cargo.toml +++ b/core/sr-sandbox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" diff --git a/core/sr-sandbox/src/lib.rs b/core/sr-sandbox/src/lib.rs index e8bdd5727ea8795ea16efeae71426aecc014e73f..1e8b2b3f1df5e63f76012f7e642f8dd04422aabf 100755 --- a/core/sr-sandbox/src/lib.rs +++ b/core/sr-sandbox/src/lib.rs @@ -37,7 +37,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(core_intrinsics))] -#![cfg_attr(not(feature = "std"), feature(alloc))] use rstd::prelude::*; diff --git a/core/sr-std/Cargo.toml b/core/sr-std/Cargo.toml index 2c4a63af1b88644ef5253700cfe6bdcc5f94bf91..2a8b7d37ca27295194b1139e07c8f5d85efc1fde 100644 --- a/core/sr-std/Cargo.toml +++ b/core/sr-std/Cargo.toml @@ -1,15 +1,16 @@ [package] name = "sr-std" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" edition = "2018" [build-dependencies] -rustc_version = "0.2" +rustc_version = "0.2.3" [features] default = ["std"] std = [] nightly = [] strict = [] +no_global_allocator = [] diff --git a/core/sr-std/src/lib.rs b/core/sr-std/src/lib.rs index 45857b33eda784a3107bc162a3c12c1b610d0342..b9874bcc2018d5e680fdf51025ffaa77165700ac 100644 --- a/core/sr-std/src/lib.rs +++ b/core/sr-std/src/lib.rs @@ -19,7 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(core_intrinsics))] -#![cfg_attr(not(feature = "std"), feature(alloc))] #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Substrate's runtime standard library as compiled without Rust's standard library.")] diff --git a/core/sr-std/with_std.rs b/core/sr-std/with_std.rs index 9d8a7342f38221b95a21ef4b534756c1a5e8bcc1..d71b9dcb69ce81a33c97336dec4094cbbdd20690 100644 --- a/core/sr-std/with_std.rs +++ b/core/sr-std/with_std.rs @@ -32,7 +32,9 @@ pub use std::slice; pub use std::vec; pub use std::default; pub use std::result; +pub use std::convert; pub mod collections { pub use std::collections::btree_map; + pub use std::collections::btree_set; } diff --git a/core/sr-std/without_std.rs b/core/sr-std/without_std.rs old mode 100644 new mode 100755 index b9287c00d5743d41cacaa7c93c1b1c89a9f91e58..9214a0ed2f8fdb18d9a5f20218c7101ae81e4264 --- a/core/sr-std/without_std.rs +++ b/core/sr-std/without_std.rs @@ -26,6 +26,7 @@ extern "C" { /// Wasm allocator pub struct WasmAllocator; +#[cfg(not(feature = "no_global_allocator"))] #[global_allocator] static ALLOCATOR: WasmAllocator = WasmAllocator; @@ -63,10 +64,12 @@ pub use core::ptr; pub use core::slice; pub use core::default; pub use core::result; +pub use core::convert; // We are trying to avoid certain things here, such as `core::string` // (if you need `String` you most probably doing something wrong, since // runtime doesn't require anything human readable). pub mod collections { pub use alloc::collections::btree_map; + pub use alloc::collections::btree_set; } diff --git a/core/sr-version/Cargo.toml b/core/sr-version/Cargo.toml index 111e6f101f2c7c906439d617780309402206fcf8..b4810b8457d81271d44264f1cae48172b277d12c 100644 --- a/core/sr-version/Cargo.toml +++ b/core/sr-version/Cargo.toml @@ -1,13 +1,12 @@ [package] name = "sr-version" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] impl-serde = { version = "0.1", optional = true } -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } @@ -17,7 +16,6 @@ default = ["std"] std = [ "impl-serde", "serde", - "serde_derive", "parity-codec/std", "rstd/std", "runtime_primitives/std", diff --git a/core/sr-version/src/lib.rs b/core/sr-version/src/lib.rs index 13037fdd96d766eeef6a6805aea920d227db5c7d..179146cc8464d110cb0fab6d4cc53a0c63e0bc9d 100644 --- a/core/sr-version/src/lib.rs +++ b/core/sr-version/src/lib.rs @@ -19,7 +19,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use std::fmt; #[cfg(feature = "std")] diff --git a/core/state-db/Cargo.toml b/core/state-db/Cargo.toml index e283f72541bc0cbcf63dfe2f863979dd5be151a1..6f2ac70a303d3019a92935c1d688c7c4173ec284 100644 --- a/core/state-db/Cargo.toml +++ b/core/state-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-state-db" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index eed53d49c3e3fa4905b05f79ec9e5955f24d322c..405e62baccf9d136dea0ce7235ab3f1d85924846 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -1,15 +1,13 @@ [package] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" [dependencies] -hex-literal = "0.1.0" log = "0.4" parking_lot = "0.7.1" -heapsize = "0.4" hash-db = "0.12" trie-db = "0.12" trie-root = "0.12" @@ -17,3 +15,6 @@ trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } parity-codec = "3.3" + +[dev-dependencies] +hex-literal = "0.2.0" diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index 14e60b140a0e8a0ea8224f15c0371b70608c84f4..fd143a553eba1087ac02c93b3aa903154952f731 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -25,7 +25,6 @@ use hash_db::Hasher; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::TrieBackendStorage; use trie::{TrieDBMut, TrieMut, MemoryDB, trie_root, child_trie_root, default_child_trie_root}; -use heapsize::HeapSizeOf; /// A state backend is used to read state data and can have changes committed /// to it. @@ -71,6 +70,7 @@ pub trait Backend { /// Calculate the storage root, with given delta over what is already stored in /// the backend, and produce a "transaction" that can be used to commit. + /// Does not include child storage updates. fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)>, @@ -88,10 +88,60 @@ pub trait Backend { fn pairs(&self) -> Vec<(Vec, Vec)>; /// Get all keys with given prefix - fn keys(&self, prefix: &Vec) -> Vec>; + fn keys(&self, prefix: &[u8]) -> Vec> { + let mut all = Vec::new(); + self.for_keys_with_prefix(prefix, |k| all.push(k.to_vec())); + all + } + + /// Get all keys of child storage with given prefix + fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { + let mut all = Vec::new(); + self.for_keys_in_child_storage(child_storage_key, |k| { + if k.starts_with(prefix) { + all.push(k.to_vec()); + } + }); + all + } /// Try convert into trie backend. fn try_into_trie_backend(self) -> Option>; + + /// Calculate the storage root, with given delta over what is already stored + /// in the backend, and produce a "transaction" that can be used to commit. + /// Does include child storage updates. + fn full_storage_root( + &self, + delta: I1, + child_deltas: I2) + -> (H::Out, Self::Transaction) + where + I1: IntoIterator, Option>)>, + I2i: IntoIterator, Option>)>, + I2: IntoIterator, I2i)>, + ::Out: Ord, + { + let mut txs: Self::Transaction = Default::default(); + let mut child_roots: Vec<_> = Default::default(); + // child first + for (storage_key, child_delta) in child_deltas { + let (child_root, empty, child_txs) = + self.child_storage_root(&storage_key[..], child_delta); + txs.consolidate(child_txs); + if empty { + child_roots.push((storage_key, None)); + } else { + child_roots.push((storage_key, Some(child_root))); + } + } + let (root, parent_txs) = self.storage_root( + delta.into_iter().chain(child_roots.into_iter()) + ); + txs.consolidate(parent_txs); + (root, txs) + } + } /// Trait that allows consolidate two transactions together. @@ -165,7 +215,7 @@ impl PartialEq for InMemory { } } -impl InMemory where H::Out: HeapSizeOf { +impl InMemory { /// Copy the state, with applied updates pub fn update(&self, changes: >::Transaction) -> Self { let mut inner: HashMap<_, _> = self.inner.clone(); @@ -214,7 +264,14 @@ impl From>, Vec, Option>)>> for InMemory { impl super::Error for Void {} -impl Backend for InMemory where H::Out: HeapSizeOf { +impl InMemory { + /// child storage key iterator + pub fn child_storage_keys(&self) -> impl Iterator { + self.inner.iter().filter_map(|item| item.0.as_ref().map(|v|&v[..])) + } +} + +impl Backend for InMemory { type Error = Void; type Transaction = Vec<(Option>, Vec, Option>)>; type TrieBackendStorage = MemoryDB; @@ -244,7 +301,9 @@ impl Backend for InMemory where H::Out: HeapSizeOf { I: IntoIterator, Option>)>, ::Out: Ord, { - let existing_pairs = self.inner.get(&None).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + let existing_pairs = self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); let root = trie_root::(existing_pairs.chain(transaction.iter().cloned()) @@ -265,7 +324,9 @@ impl Backend for InMemory where H::Out: HeapSizeOf { { let storage_key = storage_key.to_vec(); - let existing_pairs = self.inner.get(&Some(storage_key.clone())).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + let existing_pairs = self.inner.get(&Some(storage_key.clone())) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); let root = child_trie_root::( @@ -284,23 +345,48 @@ impl Backend for InMemory where H::Out: HeapSizeOf { } fn pairs(&self) -> Vec<(Vec, Vec)> { - self.inner.get(&None).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))).collect() + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))) + .collect() + } + + fn keys(&self, prefix: &[u8]) -> Vec> { + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() } - fn keys(&self, prefix: &Vec) -> Vec> { - self.inner.get(&None).into_iter().flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()).collect() + fn child_keys(&self, storage_key: &[u8], prefix: &[u8]) -> Vec> { + self.inner.get(&Some(storage_key.to_vec())) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() } - fn try_into_trie_backend(self) -> Option> { + fn try_into_trie_backend( + self + )-> Option> { let mut mdb = MemoryDB::default(); let mut root = None; + let mut new_child_roots = Vec::new(); + let mut root_map = None; for (storage_key, map) in self.inner { - if storage_key != None { - let _ = insert_into_memory_db::(&mut mdb, map.into_iter())?; + if let Some(storage_key) = storage_key.as_ref() { + let ch = insert_into_memory_db::(&mut mdb, map.into_iter())?; + new_child_roots.push((storage_key.clone(), ch.as_ref().into())); } else { - root = Some(insert_into_memory_db::(&mut mdb, map.into_iter())?); + root_map = Some(map); } } + // root handling + if let Some(map) = root_map.take() { + root = Some(insert_into_memory_db::( + &mut mdb, + map.into_iter().chain(new_child_roots.into_iter()) + )?); + } let root = match root { Some(root) => root, None => insert_into_memory_db::(&mut mdb, ::std::iter::empty())?, @@ -313,7 +399,6 @@ impl Backend for InMemory where H::Out: HeapSizeOf { pub(crate) fn insert_into_memory_db(mdb: &mut MemoryDB, input: I) -> Option where H: Hasher, - H::Out: HeapSizeOf, I: IntoIterator, Vec)>, { let mut root = ::Out::default(); diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 5feab02835eac5ff90b7d4468e01d6431f855458..3021ddfd28dee459e682d5f06df1f3aaa10078dd 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -19,11 +19,10 @@ use std::collections::HashMap; use std::iter::FromIterator; use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::trie_root; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; -use super::{Externalities, OverlayedChanges}; +use super::{ChildStorageKey, Externalities, OverlayedChanges}; use log::warn; /// Simple HashMap-based Externalities impl. @@ -103,7 +102,7 @@ impl From< HashMap, Vec> > for BasicExternalities { } } -impl Externalities for BasicExternalities where H::Out: Ord + HeapSizeOf { +impl Externalities for BasicExternalities where H::Out: Ord { fn storage(&self, key: &[u8]) -> Option> { match key { CODE => self.code.clone(), @@ -115,7 +114,7 @@ impl Externalities for BasicExternalities where H::Out: Ord + Heap Externalities::::storage(self, key) } - fn child_storage(&self, _storage_key: &[u8], _key: &[u8]) -> Option> { + fn child_storage(&self, _storage_key: ChildStorageKey, _key: &[u8]) -> Option> { None } @@ -132,11 +131,10 @@ impl Externalities for BasicExternalities where H::Out: Ord + Heap } } - fn place_child_storage(&mut self, _storage_key: Vec, _key: Vec, _value: Option>) -> bool { - false + fn place_child_storage(&mut self, _storage_key: ChildStorageKey, _key: Vec, _value: Option>) { } - fn kill_child_storage(&mut self, _storage_key: &[u8]) { } + fn kill_child_storage(&mut self, _storage_key: ChildStorageKey) { } fn clear_prefix(&mut self, prefix: &[u8]) { self.changes.clear_prefix(prefix); @@ -149,8 +147,8 @@ impl Externalities for BasicExternalities where H::Out: Ord + Heap trie_root::(self.inner.clone()) } - fn child_storage_root(&mut self, _storage_key: &[u8]) -> Option> { - None + fn child_storage_root(&mut self, _storage_key: ChildStorageKey) -> Vec { + vec![42] } fn storage_changes_root(&mut self, _parent: H::Out, _parent_num: u64) -> Option { @@ -167,7 +165,7 @@ impl Externalities for BasicExternalities where H::Out: Ord + Heap mod tests { use super::*; use primitives::{Blake2Hasher, H256}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn commit_should_work() { diff --git a/core/state-machine/src/changes_trie/build.rs b/core/state-machine/src/changes_trie/build.rs index 9cb766874d8f847136093f334199c92046181d83..9af058515aca886b47680a5046435c7c2e888c91 100644 --- a/core/state-machine/src/changes_trie/build.rs +++ b/core/state-machine/src/changes_trie/build.rs @@ -19,7 +19,6 @@ use std::collections::{BTreeMap, BTreeSet}; use parity_codec::Decode; use hash_db::Hasher; -use heapsize::HeapSizeOf; use crate::backend::Backend; use crate::overlayed_changes::OverlayedChanges; use crate::trie_backend_essence::{TrieBackendStorage, TrieBackendEssence}; @@ -44,7 +43,6 @@ pub fn prepare_input<'a, B, S, H>( S: Storage, &'a S: TrieBackendStorage, H: Hasher, - H::Out: HeapSizeOf, { let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { (Some(storage), Some(config)) => (storage, config), @@ -110,7 +108,7 @@ fn prepare_digest_input<'a, S, H>( S: Storage, &'a S: TrieBackendStorage, H: Hasher, - H::Out: 'a + HeapSizeOf, + H::Out: 'a, { let mut digest_map = BTreeMap::, BTreeSet>::new(); for digest_build_block in digest_build_iterator(config, parent.number + 1) { diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index ad70117984989bb9d022855b29f7cea87927c368..c8d6216926a1997990f6f4db9fc6774fed209494 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -21,7 +21,6 @@ use std::cell::RefCell; use std::collections::VecDeque; use parity_codec::{Decode, Encode}; use hash_db::{HashDB, Hasher}; -use heapsize::HeapSizeOf; use trie::{Recorder, MemoryDB}; use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage}; use crate::changes_trie::input::{DigestIndex, ExtrinsicIndex, DigestIndexValue, ExtrinsicIndexValue}; @@ -39,7 +38,7 @@ pub fn key_changes<'a, S: Storage, H: Hasher>( end: &'a AnchorBlockId, max: u64, key: &'a [u8], -) -> Result, String> where H::Out: HeapSizeOf { +) -> Result, String> { // we can't query any roots before root let max = ::std::cmp::min(max, end.number); @@ -69,7 +68,7 @@ pub fn key_changes_proof, H: Hasher>( end: &AnchorBlockId, max: u64, key: &[u8], -) -> Result>, String> where H::Out: HeapSizeOf { +) -> Result>, String> { // we can't query any roots before root let max = ::std::cmp::min(max, end.number); @@ -109,7 +108,7 @@ pub fn key_changes_proof_check, H: Hasher>( end: &AnchorBlockId, max: u64, key: &[u8] -) -> Result, String> where H::Out: HeapSizeOf { +) -> Result, String> { // we can't query any roots before root let max = ::std::cmp::min(max, end.number); @@ -228,7 +227,7 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs .ok_or_else(|| format!("Changes trie root for block {} is not found", block))?; // only return extrinsics for blocks before self.max - // most of blocks will be filtered out beore pushing to `self.blocks` + // most of blocks will be filtered out before pushing to `self.blocks` // here we just throwing away changes at digest blocks we're processing debug_assert!(block >= self.begin, "We shall not touch digests earlier than a range' begin"); if block <= self.end.number { @@ -278,7 +277,6 @@ pub struct DrilldownIterator<'a, RS: 'a + RootsStorage, S: 'a + Storage, H impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for DrilldownIterator<'a, RS, S, H> - where H::Out: HeapSizeOf { type Item = Result<(u64, u32), String>; @@ -305,7 +303,7 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> ProvingDrilldownIte } } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for ProvingDrilldownIterator<'a, RS, S, H> where H::Out: HeapSizeOf { +impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for ProvingDrilldownIterator<'a, RS, S, H> { type Item = Result<(u64, u32), String>; fn next(&mut self) -> Option { diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index c29131cc0c5d8bd82724a02b0a2b072c59f2fd81..f82d8b33df3c5192864738b742df94cf1a07b21b 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -33,7 +33,7 @@ //! to the set of lower-level digest blocks. //! //! Changes trie only contains the top level storage changes. Sub-level changes -//! are propogated through its storage root on the top level storage. +//! are propagated through its storage root on the top level storage. mod build; mod build_iterator; @@ -47,7 +47,6 @@ pub use self::changes_iterator::{key_changes, key_changes_proof, key_changes_pro pub use self::prune::{prune, oldest_non_pruned_trie}; use hash_db::Hasher; -use heapsize::HeapSizeOf; use crate::backend::Backend; use primitives; use crate::changes_trie::build::prepare_input; @@ -93,7 +92,7 @@ pub fn compute_changes_trie_root<'a, B: Backend, S: Storage, H: Hasher>( ) -> Option<(H::Out, Vec<(Vec, Vec)>)> where &'a S: TrieBackendStorage, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { let input_pairs = prepare_input::(backend, storage, changes, parent) .expect("storage is not allowed to fail within runtime")?; diff --git a/core/state-machine/src/changes_trie/prune.rs b/core/state-machine/src/changes_trie/prune.rs index de872a325589e9854b135ab1c3acce981edac994..09e53315a5f3dea5c3441b32b57eeaa14adc7efb 100644 --- a/core/state-machine/src/changes_trie/prune.rs +++ b/core/state-machine/src/changes_trie/prune.rs @@ -17,7 +17,6 @@ //! Changes trie pruning-related functions. use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::Recorder; use log::warn; use crate::proving_backend::ProvingBackendEssence; @@ -41,9 +40,9 @@ pub fn oldest_non_pruned_trie( } } -/// Prune obslete changes tries. Puning happens at the same block, where highest +/// Prune obsolete changes tries. Pruning happens at the same block, where highest /// level digest is created. Pruning guarantees to save changes tries for last -/// `min_blocks_to_keep` blocks. We only prune changes tries at `max_digest_iterval` +/// `min_blocks_to_keep` blocks. We only prune changes tries at `max_digest_interval` /// ranges. /// Returns MemoryDB that contains all deleted changes tries nodes. pub fn prune, H: Hasher, F: FnMut(H::Out)>( @@ -52,10 +51,7 @@ pub fn prune, H: Hasher, F: FnMut(H::Out)>( min_blocks_to_keep: u64, current_block: &AnchorBlockId, mut remove_trie_node: F, -) - where - H::Out: HeapSizeOf, -{ +) { // select range for pruning let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number) { Some((first, last)) => (first, last), @@ -169,10 +165,7 @@ mod tests { storage: &S, min_blocks_to_keep: u64, current_block: u64, - ) -> HashSet - where - H::Out: HeapSizeOf, - { + ) -> HashSet { let mut pruned_trie_nodes = HashSet::new(); prune(config, storage, min_blocks_to_keep, &AnchorBlockId { hash: Default::default(), number: current_block }, |node| { pruned_trie_nodes.insert(node); }); diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index decc332c1a6187ea364eb4db2a2fb5e75a38a82c..8363ae422108a0fca727ba4ff7256cfa6ba0f559 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -19,7 +19,6 @@ use std::collections::HashMap; use hash_db::Hasher; use trie::DBValue; -use heapsize::HeapSizeOf; use trie::MemoryDB; use parking_lot::RwLock; use crate::changes_trie::{AnchorBlockId, RootsStorage, Storage}; @@ -33,7 +32,7 @@ use crate::backend::insert_into_memory_db; use crate::changes_trie::input::InputPair; /// In-memory implementation of changes trie storage. -pub struct InMemoryStorage where H::Out: HeapSizeOf { +pub struct InMemoryStorage { data: RwLock>, } @@ -43,12 +42,12 @@ pub struct TrieBackendAdapter<'a, H: Hasher, S: 'a + Storage> { _hasher: ::std::marker::PhantomData, } -struct InMemoryStorageData where H::Out: HeapSizeOf { +struct InMemoryStorageData { roots: HashMap, mdb: MemoryDB, } -impl InMemoryStorage where H::Out: HeapSizeOf { +impl InMemoryStorage { /// Create the storage from given in-memory database. pub fn with_db(mdb: MemoryDB) -> Self { Self { @@ -109,13 +108,13 @@ impl InMemoryStorage where H::Out: HeapSizeOf { } } -impl RootsStorage for InMemoryStorage where H::Out: HeapSizeOf { +impl RootsStorage for InMemoryStorage { fn root(&self, _anchor_block: &AnchorBlockId, block: u64) -> Result, String> { Ok(self.data.read().roots.get(&block).cloned()) } } -impl Storage for InMemoryStorage where H::Out: HeapSizeOf { +impl Storage for InMemoryStorage { fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { MemoryDB::::get(&self.data.read().mdb, key, prefix) } diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 63a5c39fefb105b5fe09ba0d026f5f1bc1ada211..b9c035a7783045cba7a2631b72e42ed0b8cc2645 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -18,13 +18,12 @@ use std::{error, fmt, cmp::Ord}; use log::warn; -use crate::backend::{Backend, Consolidate}; +use crate::backend::Backend; use crate::changes_trie::{AnchorBlockId, Storage as ChangesTrieStorage, compute_changes_trie_root}; -use crate::{Externalities, OverlayedChanges, OffchainExt}; +use crate::{Externalities, OverlayedChanges, OffchainExt, ChildStorageKey}; use hash_db::Hasher; use primitives::storage::well_known_keys::is_child_storage_key; -use trie::{MemoryDB, TrieDBMut, TrieMut, default_child_trie_root, is_child_trie_key_valid}; -use heapsize::HeapSizeOf; +use trie::{MemoryDB, TrieDBMut, TrieMut, default_child_trie_root}; const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; @@ -92,7 +91,7 @@ where B: 'a + Backend, T: 'a + ChangesTrieStorage, O: 'a + OffchainExt, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { /// Create a new `Ext` from overlayed changes and read-only backend pub fn new( @@ -135,30 +134,6 @@ where self.storage_transaction = None; } - /// Fetch child storage root together with its transaction. - fn child_storage_root_transaction(&mut self, storage_key: &[u8]) -> (Vec, B::Transaction) { - self.mark_dirty(); - - let (root, is_default, transaction) = { - let delta = self.overlay.committed.children.get(storage_key) - .into_iter() - .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) - .chain(self.overlay.prospective.children.get(storage_key) - .into_iter() - .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone())))); - - self.backend.child_storage_root(storage_key, delta) - }; - - let root_val = if is_default { - None - } else { - Some(root.clone()) - }; - self.overlay.sync_child_storage_root(storage_key, root_val); - - (root, transaction) - } } #[cfg(test)] @@ -190,7 +165,7 @@ where B: 'a + Backend, T: 'a + ChangesTrieStorage, O: 'a + OffchainExt, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { fn storage(&self, key: &[u8]) -> Option> { let _guard = panic_handler::AbortGuard::new(true); @@ -214,10 +189,10 @@ where self.backend.storage_hash(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } - fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Option> { + fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { let _guard = panic_handler::AbortGuard::new(true); - self.overlay.child_storage(storage_key, key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| - self.backend.child_storage(storage_key, key).expect(EXT_NOT_ALLOWED_TO_FAIL)) + self.overlay.child_storage(storage_key.as_ref(), key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| + self.backend.child_storage(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn exists_storage(&self, key: &[u8]) -> bool { @@ -228,11 +203,12 @@ where } } - fn exists_child_storage(&self, storage_key: &[u8], key: &[u8]) -> bool { + fn exists_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> bool { let _guard = panic_handler::AbortGuard::new(true); - match self.overlay.child_storage(storage_key, key) { + + match self.overlay.child_storage(storage_key.as_ref(), key) { Some(x) => x.is_some(), - _ => self.backend.exists_child_storage(storage_key, key).expect(EXT_NOT_ALLOWED_TO_FAIL), + _ => self.backend.exists_child_storage(storage_key.as_ref(), key).expect(EXT_NOT_ALLOWED_TO_FAIL), } } @@ -247,28 +223,20 @@ where self.overlay.set_storage(key, value); } - fn place_child_storage(&mut self, storage_key: Vec, key: Vec, value: Option>) -> bool { + fn place_child_storage(&mut self, storage_key: ChildStorageKey, key: Vec, value: Option>) { let _guard = panic_handler::AbortGuard::new(true); - if !is_child_storage_key(&storage_key) || !is_child_trie_key_valid::(&storage_key) { - return false; - } self.mark_dirty(); - self.overlay.set_child_storage(storage_key, key, value); - - true + self.overlay.set_child_storage(storage_key.into_owned(), key, value); } - fn kill_child_storage(&mut self, storage_key: &[u8]) { + fn kill_child_storage(&mut self, storage_key: ChildStorageKey) { let _guard = panic_handler::AbortGuard::new(true); - if !is_child_storage_key(storage_key) || !is_child_trie_key_valid::(storage_key) { - return; - } self.mark_dirty(); - self.overlay.clear_child_storage(storage_key); - self.backend.for_keys_in_child_storage(storage_key, |key| { - self.overlay.set_child_storage(storage_key.to_vec(), key.to_vec(), None); + self.overlay.clear_child_storage(storage_key.as_ref()); + self.backend.for_keys_in_child_storage(storage_key.as_ref(), |key| { + self.overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); }); } @@ -296,35 +264,53 @@ where return root.clone(); } - let mut transaction = B::Transaction::default(); - let child_storage_keys: Vec<_> = self.overlay.prospective.children.keys().cloned().collect(); + let child_storage_keys = + self.overlay.prospective.children.keys() + .chain(self.overlay.committed.children.keys()); + + let child_delta_iter = child_storage_keys.map(|storage_key| + (storage_key.clone(), self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone())))))); - for key in child_storage_keys { - let (_, t) = self.child_storage_root_transaction(&key); - transaction.consolidate(t); - } // compute and memoize let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); - let (root, t) = self.backend.storage_root(delta); - transaction.consolidate(t); + let (root, transaction) = self.backend.full_storage_root(delta, child_delta_iter); self.storage_transaction = Some((transaction, root)); root } - fn child_storage_root(&mut self, storage_key: &[u8]) -> Option> { + fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { let _guard = panic_handler::AbortGuard::new(true); - if !is_child_storage_key(storage_key) || !is_child_trie_key_valid::(storage_key) { - return None; - } - if self.storage_transaction.is_some() { - return Some(self.storage(storage_key).unwrap_or(default_child_trie_root::(storage_key))); - } + self + .storage(storage_key.as_ref()) + .unwrap_or( + default_child_trie_root::(storage_key.as_ref()) + ) + } else { + let storage_key = storage_key.as_ref(); + + let delta = self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.clone().into_iter())); - Some(self.child_storage_root_transaction(storage_key).0) + let root = self.backend.child_storage_root(storage_key, delta).0; + + self.overlay.set_storage(storage_key.to_vec(), Some(root.to_vec())); + + root + + } } fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { @@ -366,7 +352,7 @@ where #[cfg(test)] mod tests { - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use parity_codec::Encode; use primitives::{Blake2Hasher}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index edddc3712693c8803290a9219d8db1e71b64bf2e..daf8f915a1167fc30b9984158e6643fbc2bdba02 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -19,11 +19,13 @@ #![warn(missing_docs)] use std::{fmt, panic::UnwindSafe, result, marker::PhantomData}; +use std::borrow::Cow; use log::warn; use hash_db::Hasher; -use heapsize::HeapSizeOf; use parity_codec::{Decode, Encode}; -use primitives::{storage::well_known_keys, NativeOrEncoded, NeverNativeValue, OffchainExt}; +use primitives::{ + storage::well_known_keys, NativeOrEncoded, NeverNativeValue, OffchainExt +}; pub mod backend; mod changes_trie; @@ -51,10 +53,65 @@ pub use changes_trie::{ oldest_non_pruned_trie as oldest_non_pruned_changes_trie }; pub use overlayed_changes::OverlayedChanges; -pub use proving_backend::{create_proof_check_backend, create_proof_check_backend_storage}; +pub use proving_backend::{ + create_proof_check_backend, create_proof_check_backend_storage, + Recorder as ProofRecorder, ProvingBackend, +}; pub use trie_backend_essence::{TrieBackendStorage, Storage}; pub use trie_backend::TrieBackend; +/// A wrapper around a child storage key. +/// +/// This wrapper ensures that the child storage key is correct and properly used. It is +/// impossible to create an instance of this struct without providing a correct `storage_key`. +pub struct ChildStorageKey<'a, H: Hasher> { + storage_key: Cow<'a, [u8]>, + _hasher: PhantomData, +} + +impl<'a, H: Hasher> ChildStorageKey<'a, H> { + fn new(storage_key: Cow<'a, [u8]>) -> Option { + if !trie::is_child_trie_key_valid::(&storage_key) { + return None; + } + + Some(ChildStorageKey { + storage_key, + _hasher: PhantomData, + }) + } + + /// Create a new `ChildStorageKey` from a vector. + /// + /// `storage_key` has should start with `:child_storage:default:` + /// See `is_child_trie_key_valid` for more details. + pub fn from_vec(key: Vec) -> Option { + Self::new(Cow::Owned(key)) + } + + /// Create a new `ChildStorageKey` from a slice. + /// + /// `storage_key` has should start with `:child_storage:default:` + /// See `is_child_trie_key_valid` for more details. + pub fn from_slice(key: &'a [u8]) -> Option { + Self::new(Cow::Borrowed(key)) + } + + /// Get access to the byte representation of the storage key. + /// + /// This key is guaranteed to be correct. + pub fn as_ref(&self) -> &[u8] { + &*self.storage_key + } + + /// Destruct this instance into an owned vector that represents the storage key. + /// + /// This key is guaranteed to be correct. + pub fn into_owned(self) -> Vec { + self.storage_key.into_owned() + } +} + /// State Machine Error bound. /// /// This should reflect WASM error type bound for future compatibility. @@ -105,7 +162,7 @@ pub trait Externalities { } /// Read child runtime storage. - fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Option>; + fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option>; /// Set storage entry `key` of current contract being called (effective immediately). fn set_storage(&mut self, key: Vec, value: Vec) { @@ -113,7 +170,7 @@ pub trait Externalities { } /// Set child storage entry `key` of current contract being called (effective immediately). - fn set_child_storage(&mut self, storage_key: Vec, key: Vec, value: Vec) -> bool { + fn set_child_storage(&mut self, storage_key: ChildStorageKey, key: Vec, value: Vec) { self.place_child_storage(storage_key, key, Some(value)) } @@ -123,8 +180,8 @@ pub trait Externalities { } /// Clear a child storage entry (`key`) of current contract being called (effective immediately). - fn clear_child_storage(&mut self, storage_key: &[u8], key: &[u8]) -> bool { - self.place_child_storage(storage_key.to_vec(), key.to_vec(), None) + fn clear_child_storage(&mut self, storage_key: ChildStorageKey, key: &[u8]) { + self.place_child_storage(storage_key, key.to_vec(), None) } /// Whether a storage entry exists. @@ -133,12 +190,12 @@ pub trait Externalities { } /// Whether a child storage entry exists. - fn exists_child_storage(&self, storage_key: &[u8], key: &[u8]) -> bool { + fn exists_child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> bool { self.child_storage(storage_key, key).is_some() } /// Clear an entire child storage. - fn kill_child_storage(&mut self, storage_key: &[u8]); + fn kill_child_storage(&mut self, storage_key: ChildStorageKey); /// Clear storage entries which keys are start with the given prefix. fn clear_prefix(&mut self, prefix: &[u8]); @@ -147,7 +204,7 @@ pub trait Externalities { fn place_storage(&mut self, key: Vec, value: Option>); /// Set or clear a child storage entry. Return whether the operation succeeds. - fn place_child_storage(&mut self, storage_key: Vec, key: Vec, value: Option>) -> bool; + fn place_child_storage(&mut self, storage_key: ChildStorageKey, key: Vec, value: Option>); /// Get the identity of the chain. fn chain_id(&self) -> u64; @@ -155,10 +212,11 @@ pub trait Externalities { /// Get the trie root of the current storage map. This will also update all child storage keys in the top-level storage map. fn storage_root(&mut self) -> H::Out where H::Out: Ord; - /// Get the trie root of a child storage map. This will also update the value of the child storage keys in the top-level storage map. If the storage root equals default hash as defined by trie, the key in top-level storage map will be removed. - /// - /// Returns None if key provided is not a storage key. This can due to not being started with CHILD_STORAGE_KEY_PREFIX, or the trie implementation regards the key as invalid. - fn child_storage_root(&mut self, storage_key: &[u8]) -> Option>; + /// Get the trie root of a child storage map. This will also update the value of the child + /// storage keys in the top-level storage map. + /// If the storage root equals the default hash as defined by the trie, the key in the top-level + /// storage map will be removed. + fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec; /// Get the change trie root of the current storage overlay at a block with given parent. fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option where H::Out: Ord; @@ -319,7 +377,7 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where B: Backend, T: ChangesTrieStorage, O: OffchainExt, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { /// Execute a call using the given state backend, overlayed changes, and call executor. /// Produces a state-backend-specific "transaction" which can be used to apply the changes @@ -510,7 +568,7 @@ where B: Backend, H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { let trie_backend = backend.try_into_trie_backend() .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; @@ -537,7 +595,7 @@ where S: trie_backend_essence::TrieBackendStorage, H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { let proving_backend = proving_backend::ProvingBackend::new(trie_backend); let mut sm = StateMachine { @@ -571,9 +629,9 @@ pub fn execution_proof_check( where H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { - let trie_backend = proving_backend::create_proof_check_backend::(root.into(), proof)?; + let trie_backend = create_proof_check_backend::(root.into(), proof)?; execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) } @@ -588,7 +646,7 @@ pub fn execution_proof_check_on_trie_backend( where H: Hasher, Exec: CodeExecutor, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { let mut sm = StateMachine { backend: trie_backend, @@ -615,13 +673,32 @@ pub fn prove_read( where B: Backend, H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { let trie_backend = backend.try_into_trie_backend() - .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + .ok_or_else( + ||Box::new(ExecutionError::UnableToGenerateProof) as Box + )?; prove_read_on_trie_backend(&trie_backend, key) } +/// Generate child storage read proof. +pub fn prove_child_read( + backend: B, + storage_key: &[u8], + key: &[u8], +) -> Result<(Option>, Vec>), Box> +where + B: Backend, + H: Hasher, + H::Out: Ord +{ + let trie_backend = backend.try_into_trie_backend() + .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + prove_child_read_on_trie_backend(&trie_backend, storage_key, key) +} + + /// Generate storage read proof on pre-created trie backend. pub fn prove_read_on_trie_backend( trie_backend: &TrieBackend, @@ -630,13 +707,30 @@ pub fn prove_read_on_trie_backend( where S: trie_backend_essence::TrieBackendStorage, H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { let proving_backend = proving_backend::ProvingBackend::<_, H>::new(trie_backend); let result = proving_backend.storage(key).map_err(|e| Box::new(e) as Box)?; Ok((result, proving_backend.extract_proof())) } +/// Generate storage read proof on pre-created trie backend. +pub fn prove_child_read_on_trie_backend( + trie_backend: &TrieBackend, + storage_key: &[u8], + key: &[u8] +) -> Result<(Option>, Vec>), Box> +where + S: trie_backend_essence::TrieBackendStorage, + H: Hasher, + H::Out: Ord +{ + let proving_backend = proving_backend::ProvingBackend::<_, H>::new(trie_backend); + let result = proving_backend.child_storage(storage_key, key) + .map_err(|e| Box::new(e) as Box)?; + Ok((result, proving_backend.extract_proof())) +} + /// Check storage read proof, generated by `prove_read` call. pub fn read_proof_check( root: H::Out, @@ -645,12 +739,28 @@ pub fn read_proof_check( ) -> Result>, Box> where H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { - let proving_backend = proving_backend::create_proof_check_backend::(root, proof)?; + let proving_backend = create_proof_check_backend::(root, proof)?; read_proof_check_on_proving_backend(&proving_backend, key) } +/// Check child storage read proof, generated by `prove_child_read` call. +pub fn read_child_proof_check( + root: H::Out, + proof: Vec>, + storage_key: &[u8], + key: &[u8], +) -> Result>, Box> +where + H: Hasher, + H::Out: Ord +{ + let proving_backend = create_proof_check_backend::(root, proof)?; + read_child_proof_check_on_proving_backend(&proving_backend, storage_key, key) +} + + /// Check storage read proof on pre-created proving backend. pub fn read_proof_check_on_proving_backend( proving_backend: &TrieBackend, H>, @@ -658,11 +768,24 @@ pub fn read_proof_check_on_proving_backend( ) -> Result>, Box> where H: Hasher, - H::Out: Ord + HeapSizeOf + H::Out: Ord { proving_backend.storage(key).map_err(|e| Box::new(e) as Box) } +/// Check child storage read proof on pre-created proving backend. +pub fn read_child_proof_check_on_proving_backend( + proving_backend: &TrieBackend, H>, + storage_key: &[u8], + key: &[u8], +) -> Result>, Box> +where + H: Hasher, + H::Out: Ord +{ + proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box) +} + /// Sets overlayed changes' changes trie configuration. Returns error if configuration /// differs from previous OR config decode has failed. pub(crate) fn set_changes_trie_config(overlay: &mut OverlayedChanges, config: Option>, final_check: bool) -> Result<(), Box> { @@ -905,12 +1028,35 @@ mod tests { let backend = InMemory::::default().try_into_trie_backend().unwrap(); let changes_trie_storage = InMemoryChangesTrieStorage::new(); let mut overlay = OverlayedChanges::default(); - let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage), NeverOffchainExt::new()); + let mut ext = Ext::new( + &mut overlay, + &backend, + Some(&changes_trie_storage), + NeverOffchainExt::new() + ); - assert!(ext.set_child_storage(b":child_storage:testchild".to_vec(), b"abc".to_vec(), b"def".to_vec())); - assert_eq!(ext.child_storage(b":child_storage:testchild", b"abc"), Some(b"def".to_vec())); - ext.kill_child_storage(b":child_storage:testchild"); - assert_eq!(ext.child_storage(b":child_storage:testchild", b"abc"), None); + ext.set_child_storage( + ChildStorageKey::from_slice(b":child_storage:default:testchild").unwrap(), + b"abc".to_vec(), + b"def".to_vec() + ); + assert_eq!( + ext.child_storage( + ChildStorageKey::from_slice(b":child_storage:default:testchild").unwrap(), + b"abc" + ), + Some(b"def".to_vec()) + ); + ext.kill_child_storage( + ChildStorageKey::from_slice(b":child_storage:default:testchild").unwrap() + ); + assert_eq!( + ext.child_storage( + ChildStorageKey::from_slice(b":child_storage:default:testchild").unwrap(), + b"abc" + ), + None + ); } #[test] @@ -920,11 +1066,40 @@ mod tests { let remote_root = remote_backend.storage_root(::std::iter::empty()).0; let remote_proof = prove_read(remote_backend, b"value2").unwrap().1; // check proof locally - let local_result1 = read_proof_check::(remote_root, remote_proof.clone(), b"value2").unwrap(); - let local_result2 = read_proof_check::(remote_root, remote_proof.clone(), &[0xff]).is_ok(); + let local_result1 = read_proof_check::( + remote_root, + remote_proof.clone(), + b"value2" + ).unwrap(); + let local_result2 = read_proof_check::( + remote_root, + remote_proof.clone(), + &[0xff] + ).is_ok(); // check that results are correct assert_eq!(local_result1, Some(vec![24])); assert_eq!(local_result2, false); + // on child trie + let remote_backend = trie_backend::tests::test_trie(); + let remote_root = remote_backend.storage_root(::std::iter::empty()).0; + let remote_proof = prove_child_read( + remote_backend, + b":child_storage:default:sub1", + b"value3" + ).unwrap().1; + let local_result1 = read_child_proof_check::( + remote_root, + remote_proof.clone(), + b":child_storage:default:sub1",b"value3" + ).unwrap(); + let local_result2 = read_child_proof_check::( + remote_root, + remote_proof.clone(), + b":child_storage:default:sub1", + b"value2" + ).unwrap(); + assert_eq!(local_result1, Some(vec![142])); + assert_eq!(local_result2, None); } #[test] diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index 56e69323e878ccb98b180907b8f41618dc480b57..e595cff0e4e4abc3af11b00e4d313e5401038a86 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -159,19 +159,6 @@ impl OverlayedChanges { } } - /// Sync the child storage root. - pub(crate) fn sync_child_storage_root(&mut self, storage_key: &[u8], root: Option>) { - let entry = self.prospective.top.entry(storage_key.to_vec()).or_default(); - entry.value = root; - - if let Some((Some(extrinsics), _)) = self.prospective.children.get(storage_key) { - for extrinsic in extrinsics { - entry.extrinsics.get_or_insert_with(Default::default) - .insert(*extrinsic); - } - } - } - /// Clear child storage of given storage key. /// /// NOTE that this doesn't take place immediately but written into the prospective @@ -309,7 +296,7 @@ impl From>> for OverlayedValue { #[cfg(test)] mod tests { - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; use primitives::{Blake2Hasher, H256}; use primitives::storage::well_known_keys::EXTRINSIC_INDEX; use crate::backend::InMemory; diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index 4d85791faf681afbaaa94cef9090aad7ce98bd3f..c23838bc21504beb26c57e569ecf53227aae9517 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -16,12 +16,15 @@ //! Proving state machine backend. -use std::cell::RefCell; +use std::{cell::RefCell, rc::Rc}; use log::debug; use hash_db::Hasher; -use heapsize::HeapSizeOf; use hash_db::HashDB; -use trie::{Recorder, MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys}; +use trie::{ + MemoryDB, PrefixedMemoryDB, TrieError, default_child_trie_root, + read_trie_value_with, read_child_trie_value_with, record_all_keys +}; +pub use trie::Recorder; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage}; use crate::{Error, ExecutionError, Backend}; @@ -37,7 +40,6 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> where S: TrieBackendStorage, H: Hasher, - H::Out: HeapSizeOf, { pub fn storage(&mut self, key: &[u8]) -> Result>, String> { let mut read_overlay = S::Overlay::default(); @@ -87,7 +89,7 @@ impl<'a, S, H> ProvingBackendEssence<'a, S, H> /// These can be sent to remote node and used as a proof of execution. pub struct ProvingBackend<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> { backend: &'a TrieBackend, - proof_recorder: RefCell>, + proof_recorder: Rc>>, } impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> ProvingBackend<'a, S, H> { @@ -95,14 +97,27 @@ impl<'a, S: 'a + TrieBackendStorage, H: 'a + Hasher> ProvingBackend<'a, S, H> pub fn new(backend: &'a TrieBackend) -> Self { ProvingBackend { backend, - proof_recorder: RefCell::new(Recorder::new()), + proof_recorder: Rc::new(RefCell::new(Recorder::new())), + } + } + + /// Create new proving backend with the given recorder. + pub fn new_with_recorder( + backend: &'a TrieBackend, + proof_recorder: Rc>>, + ) -> Self { + ProvingBackend { + backend, + proof_recorder, } } /// Consume the backend, extracting the gathered proof in lexicographical order /// by value. pub fn extract_proof(self) -> Vec> { - self.proof_recorder.into_inner().drain() + self.proof_recorder + .borrow_mut() + .drain() .into_iter() .map(|n| n.data.to_vec()) .collect() @@ -113,7 +128,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> where S: 'a + TrieBackendStorage, H: 'a + Hasher, - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { type Error = String; type Transaction = S::Overlay; @@ -147,10 +162,14 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.pairs() } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { self.backend.keys(prefix) } + fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { + self.backend.child_keys(child_storage_key, prefix) + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> { @@ -177,7 +196,6 @@ pub fn create_proof_check_backend( ) -> Result, H>, Box> where H: Hasher, - H::Out: HeapSizeOf, { let db = create_proof_check_backend_storage(proof); @@ -194,7 +212,6 @@ pub fn create_proof_check_backend_storage( ) -> MemoryDB where H: Hasher, - H::Out: HeapSizeOf, { let mut db = MemoryDB::default(); for item in proof { @@ -209,6 +226,7 @@ mod tests { use crate::trie_backend::tests::test_trie; use super::*; use primitives::{Blake2Hasher}; + use crate::ChildStorageKey; fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { ProvingBackend::new(trie_backend) @@ -268,4 +286,75 @@ mod tests { let proof_check = create_proof_check_backend::(in_memory_root.into(), proof).unwrap(); assert_eq!(proof_check.storage(&[42]).unwrap().unwrap(), vec![42]); } + + #[test] + fn proof_recorded_and_checked_with_child() { + let subtrie1 = ChildStorageKey::::from_slice( + b":child_storage:default:sub1" + ).unwrap(); + let subtrie2 = ChildStorageKey::::from_slice( + b":child_storage:default:sub2" + ).unwrap(); + let own1 = subtrie1.into_owned(); + let own2 = subtrie2.into_owned(); + let contents = (0..64).map(|i| (None, vec![i], Some(vec![i]))) + .chain((28..65).map(|i| (Some(own1.clone()), vec![i], Some(vec![i])))) + .chain((10..15).map(|i| (Some(own2.clone()), vec![i], Some(vec![i])))) + .collect::>(); + let in_memory = InMemory::::default(); + let in_memory = in_memory.update(contents); + let in_memory_root = in_memory.full_storage_root::<_, Vec<_>, _>( + ::std::iter::empty(), + in_memory.child_storage_keys().map(|k|(k.to_vec(), Vec::new())) + ).0; + (0..64).for_each(|i| assert_eq!( + in_memory.storage(&[i]).unwrap().unwrap(), + vec![i] + )); + (28..65).for_each(|i| assert_eq!( + in_memory.child_storage(&own1[..], &[i]).unwrap().unwrap(), + vec![i] + )); + (10..15).for_each(|i| assert_eq!( + in_memory.child_storage(&own2[..], &[i]).unwrap().unwrap(), + vec![i] + )); + + let trie = in_memory.try_into_trie_backend().unwrap(); + let trie_root = trie.storage_root(::std::iter::empty()).0; + assert_eq!(in_memory_root, trie_root); + (0..64).for_each(|i| assert_eq!( + trie.storage(&[i]).unwrap().unwrap(), + vec![i] + )); + + let proving = ProvingBackend::new(&trie); + assert_eq!(proving.storage(&[42]).unwrap().unwrap(), vec![42]); + + let proof = proving.extract_proof(); + + let proof_check = create_proof_check_backend::( + in_memory_root.into(), + proof + ).unwrap(); + assert!(proof_check.storage(&[0]).is_err()); + assert_eq!(proof_check.storage(&[42]).unwrap().unwrap(), vec![42]); + // note that it is include in root because proof close + assert_eq!(proof_check.storage(&[41]).unwrap().unwrap(), vec![41]); + assert_eq!(proof_check.storage(&[64]).unwrap(), None); + + let proving = ProvingBackend::new(&trie); + assert_eq!(proving.child_storage(&own1[..], &[64]), Ok(Some(vec![64]))); + + let proof = proving.extract_proof(); + let proof_check = create_proof_check_backend::( + in_memory_root.into(), + proof + ).unwrap(); + assert_eq!( + proof_check.child_storage(&own1[..], &[64]).unwrap().unwrap(), + vec![64] + ); + } + } diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index 6bbfc276676528e6dfcb69ae4432308c93d6623c..03909f384c03023b5faf4c190a0d3a4d70f57723 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -16,26 +16,30 @@ //! Test implementation for Externalities. -use std::collections::HashMap; +use std::collections::{HashMap, BTreeMap}; use std::iter::FromIterator; +use std::marker::PhantomData; use hash_db::Hasher; -use heapsize::HeapSizeOf; -use trie::trie_root; -use crate::backend::InMemory; -use crate::changes_trie::{compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, AnchorBlockId}; +use crate::backend::{InMemory, Backend}; +use primitives::storage::well_known_keys::is_child_storage_key; +use crate::changes_trie::{ + compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, AnchorBlockId +}; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; -use super::{Externalities, OverlayedChanges}; +use super::{ChildStorageKey, Externalities, OverlayedChanges}; + +const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; /// Simple HashMap-based Externalities impl. -pub struct TestExternalities where H::Out: HeapSizeOf { - inner: HashMap, Vec>, +pub struct TestExternalities { + overlay: OverlayedChanges, + backend: InMemory, changes_trie_storage: ChangesTrieInMemoryStorage, - changes: OverlayedChanges, - code: Option>, + _hasher: PhantomData, } -impl TestExternalities where H::Out: HeapSizeOf { +impl TestExternalities { /// Create a new instance of `TestExternalities` pub fn new(inner: HashMap, Vec>) -> Self { Self::new_with_code(&[], inner) @@ -44,6 +48,7 @@ impl TestExternalities where H::Out: HeapSizeOf { /// Create a new instance of `TestExternalities` pub fn new_with_code(code: &[u8], mut inner: HashMap, Vec>) -> Self { let mut overlay = OverlayedChanges::default(); + super::set_changes_trie_config( &mut overlay, inner.get(&CHANGES_TRIE_CONFIG.to_vec()).cloned(), @@ -51,124 +56,164 @@ impl TestExternalities where H::Out: HeapSizeOf { ).expect("changes trie configuration is correct in test env; qed"); inner.insert(HEAP_PAGES.to_vec(), 8u64.encode()); + inner.insert(CODE.to_vec(), code.to_vec()); TestExternalities { - inner, + overlay, changes_trie_storage: ChangesTrieInMemoryStorage::new(), - changes: overlay, - code: Some(code.to_vec()), + backend: inner.into(), + _hasher: Default::default(), } } - /// Insert key/value - pub fn insert(&mut self, k: Vec, v: Vec) -> Option> { - self.inner.insert(k, v) + /// Insert key/value into backend + pub fn insert(&mut self, k: Vec, v: Vec) { + self.backend = self.backend.update(vec![(None, k, Some(v))]); + } + + /// Iter to all pairs in key order + pub fn iter_pairs_in_order(&self) -> impl Iterator, Vec)> { + self.backend.pairs().iter() + .map(|&(ref k, ref v)| (k.to_vec(), Some(v.to_vec()))) + .chain(self.overlay.committed.top.clone().into_iter().map(|(k, v)| (k, v.value))) + .chain(self.overlay.prospective.top.clone().into_iter().map(|(k, v)| (k, v.value))) + .collect::>() + .into_iter() + .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) } } -impl ::std::fmt::Debug for TestExternalities where H::Out: HeapSizeOf { +impl ::std::fmt::Debug for TestExternalities { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "{:?}", self.inner) + write!(f, "overlay: {:?}\nbackend: {:?}", self.overlay, self.backend.pairs()) } } -impl PartialEq for TestExternalities where H::Out: HeapSizeOf { +impl PartialEq for TestExternalities { + /// This doesn't test if they are in the same state, only if they contains the + /// same data at this state fn eq(&self, other: &TestExternalities) -> bool { - self.inner.eq(&other.inner) + self.iter_pairs_in_order().eq(other.iter_pairs_in_order()) } } -impl FromIterator<(Vec, Vec)> for TestExternalities where H::Out: HeapSizeOf { +impl FromIterator<(Vec, Vec)> for TestExternalities { fn from_iter, Vec)>>(iter: I) -> Self { let mut t = Self::new(Default::default()); - t.inner.extend(iter); + t.backend = t.backend.update(iter.into_iter().map(|(k, v)| (None, k, Some(v))).collect()); t } } -impl Default for TestExternalities where H::Out: HeapSizeOf { +impl Default for TestExternalities { fn default() -> Self { Self::new(Default::default()) } } -impl From> for HashMap, Vec> where H::Out: HeapSizeOf { +impl From> for HashMap, Vec> { fn from(tex: TestExternalities) -> Self { - tex.inner.into() + tex.iter_pairs_in_order().collect() } } -impl From< HashMap, Vec> > for TestExternalities where H::Out: HeapSizeOf { +impl From< HashMap, Vec> > for TestExternalities { fn from(hashmap: HashMap, Vec>) -> Self { - TestExternalities { - inner: hashmap, - changes_trie_storage: ChangesTrieInMemoryStorage::new(), - changes: Default::default(), - code: None, - } + Self::from_iter(hashmap) } } -// TODO child test primitives are currently limited to `changes` (for non child the way -// things are defined seems utterly odd to (put changes in changes but never make them -// available for read through inner) -impl Externalities for TestExternalities where H::Out: Ord + HeapSizeOf { +impl Externalities for TestExternalities where H::Out: Ord { fn storage(&self, key: &[u8]) -> Option> { - match key { - CODE => self.code.clone(), - _ => self.inner.get(key).cloned(), - } + self.overlay.storage(key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| + self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn original_storage(&self, key: &[u8]) -> Option> { - self.storage(key) + self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } - fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Option> { - self.changes.child_storage(storage_key, key)?.map(Vec::from) + fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { + self.overlay + .child_storage(storage_key.as_ref(), key) + .map(|x| x.map(|x| x.to_vec())) + .unwrap_or_else(|| self.backend + .child_storage(storage_key.as_ref(), key) + .expect(EXT_NOT_ALLOWED_TO_FAIL) + ) } fn place_storage(&mut self, key: Vec, maybe_value: Option>) { - self.changes.set_storage(key.clone(), maybe_value.clone()); - match key.as_ref() { - CODE => self.code = maybe_value, - _ => { - match maybe_value { - Some(value) => { self.inner.insert(key, value); } - None => { self.inner.remove(&key); } - } - } + if is_child_storage_key(&key) { + panic!("Refuse to directly set child storage key"); } + + self.overlay.set_storage(key, maybe_value); } - fn place_child_storage(&mut self, storage_key: Vec, key: Vec, value: Option>) -> bool { - self.changes.set_child_storage(storage_key, key, value); - // TODO place_child_storage and set_child_storage should always be valid (create child on set)? - true + fn place_child_storage( + &mut self, + storage_key: ChildStorageKey, + key: Vec, + value: Option> + ) { + self.overlay.set_child_storage(storage_key.into_owned(), key, value); } - fn kill_child_storage(&mut self, storage_key: &[u8]) { - self.changes.clear_child_storage(storage_key); + fn kill_child_storage(&mut self, storage_key: ChildStorageKey) { + let backend = &self.backend; + let overlay = &mut self.overlay; + + overlay.clear_child_storage(storage_key.as_ref()); + backend.for_keys_in_child_storage(storage_key.as_ref(), |key| { + overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); + }); } fn clear_prefix(&mut self, prefix: &[u8]) { - self.changes.clear_prefix(prefix); - self.inner.retain(|key, _| !key.starts_with(prefix)); + if is_child_storage_key(prefix) { + panic!("Refuse to directly clear prefix that is part of child storage key"); + } + + self.overlay.clear_prefix(prefix); + + let backend = &self.backend; + let overlay = &mut self.overlay; + backend.for_keys_with_prefix(prefix, |key| { + overlay.set_storage(key.to_vec(), None); + }); } fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { - trie_root::(self.inner.clone()) + // compute and memoize + let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) + .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); + + self.backend.storage_root(delta).0 } - fn child_storage_root(&mut self, _storage_key: &[u8]) -> Option> { - None + fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { + let storage_key = storage_key.as_ref(); + + let (root, _, _) = { + let delta = self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.clone().into_iter())); + + self.backend.child_storage_root(storage_key, delta) + }; + self.overlay.set_storage(storage_key.into(), Some(root.clone())); + root } fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { - compute_changes_trie_root::<_, _, H>( - &InMemory::default(), + compute_changes_trie_root::<_, ChangesTrieInMemoryStorage, H>( + &self.backend, Some(&self.changes_trie_storage), - &self.changes, + &self.overlay, &AnchorBlockId { hash: parent, number: parent_num }, ).map(|(root, _)| root.clone()) } @@ -182,7 +227,7 @@ impl Externalities for TestExternalities where H::Out: Ord + He mod tests { use super::*; use primitives::{Blake2Hasher, H256}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn commit_should_work() { @@ -190,7 +235,7 @@ mod tests { ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("0b33ed94e74e0f8e92a55923bece1ed02d16cf424e124613ddebc53ac3eeeabe"); + const ROOT: [u8; 32] = hex!("cc65c26c37ebd4abcdeb3f1ecd727527051620779a2f6c809bac0f8a87dbb816"); assert_eq!(ext.storage_root(), H256::from(ROOT)); } diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index b152d7fea18578aedf032efb2ab482627d087f58..00c0aca006277f88f000b571f8a1895ac9deae3c 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -18,7 +18,6 @@ use log::{warn, debug}; use hash_db::Hasher; -use heapsize::HeapSizeOf; use trie::{TrieDB, TrieError, Trie, delta_trie_root, default_child_trie_root, child_delta_trie_root}; use crate::trie_backend_essence::{TrieBackendEssence, TrieBackendStorage, Ephemeral}; use crate::Backend; @@ -28,7 +27,7 @@ pub struct TrieBackend, H: Hasher> { essence: TrieBackendEssence, } -impl, H: Hasher> TrieBackend where H::Out: HeapSizeOf { +impl, H: Hasher> TrieBackend { /// Create new trie-based backend. pub fn new(storage: S, root: H::Out) -> Self { TrieBackend { @@ -60,7 +59,7 @@ impl, H: Hasher> TrieBackend where H::Out: HeapSi impl super::Error for String {} impl, H: Hasher> Backend for TrieBackend where - H::Out: Ord + HeapSizeOf, + H::Out: Ord, { type Error = String; type Transaction = S::Overlay; @@ -106,7 +105,7 @@ impl, H: Hasher> Backend for TrieBackend where } } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); @@ -189,6 +188,7 @@ impl, H: Hasher> Backend for TrieBackend where pub mod tests { use std::collections::HashSet; use primitives::{Blake2Hasher, H256}; + use parity_codec::Encode; use trie::{TrieMut, TrieDBMut, PrefixedMemoryDB}; use super::*; @@ -197,6 +197,15 @@ pub mod tests { let mut mdb = PrefixedMemoryDB::::default(); { let mut trie = TrieDBMut::new(&mut mdb, &mut root); + trie.insert(b"value3", &[142]).expect("insert failed"); + trie.insert(b"value4", &[124]).expect("insert failed"); + }; + + { + let mut sub_root = Vec::new(); + root.encode_to(&mut sub_root); + let mut trie = TrieDBMut::new(&mut mdb, &mut root); + trie.insert(b":child_storage:default:sub1", &sub_root).expect("insert failed"); trie.insert(b"key", b"value").expect("insert failed"); trie.insert(b"value1", &[42]).expect("insert failed"); trie.insert(b"value2", &[24]).expect("insert failed"); diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index 8101126c39d78c7b386ae94a33a74195a8122d94..dfb6cae08cecfac408d0adc7f2a1c36b7e77fb8c 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -21,7 +21,6 @@ use std::ops::Deref; use std::sync::Arc; use log::{debug, warn}; use hash_db::{self, Hasher}; -use heapsize::HeapSizeOf; use trie::{TrieDB, Trie, MemoryDB, PrefixedMemoryDB, DBValue, TrieError, default_child_trie_root, read_trie_value, read_child_trie_value, for_keys_in_child_trie}; use crate::changes_trie::Storage as ChangesTrieStorage; use crate::backend::Consolidate; @@ -38,7 +37,7 @@ pub struct TrieBackendEssence, H: Hasher> { root: H::Out, } -impl, H: Hasher> TrieBackendEssence where H::Out: HeapSizeOf { +impl, H: Hasher> TrieBackendEssence { /// Create new trie-based backend. pub fn new(storage: S, root: H::Out) -> Self { TrieBackendEssence { @@ -154,7 +153,6 @@ impl<'a, H: 'a + Hasher > hash_db::AsPlainDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn as_plain_db<'b>(&'b self) -> &'b (hash_db::PlainDB + 'b) { self } fn as_plain_db_mut<'b>(&'b mut self) -> &'b mut (hash_db::PlainDB + 'b) { self } @@ -165,7 +163,6 @@ impl<'a, H: 'a + Hasher > hash_db::AsHashDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn as_hash_db<'b>(&'b self) -> &'b (hash_db::HashDB + 'b) { self } fn as_hash_db_mut<'b>(&'b mut self) -> &'b mut (hash_db::HashDB + 'b) { self } @@ -185,7 +182,6 @@ impl<'a, H: Hasher > hash_db::PlainDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out) -> Option { if let Some(val) = hash_db::HashDB::get(self.overlay, key, &[]) { @@ -219,7 +215,6 @@ impl<'a, H: Hasher > hash_db::PlainDBRef for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out) -> Option { hash_db::PlainDB::get(self, key) } fn contains(&self, key: &H::Out) -> bool { hash_db::PlainDB::contains(self, key) } @@ -230,7 +225,6 @@ impl<'a, H: Hasher > hash_db::HashDB for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { if let Some(val) = hash_db::HashDB::get(self.overlay, key, prefix) { @@ -268,7 +262,6 @@ impl<'a, H: Hasher > hash_db::HashDBRef for Ephemeral<'a, S, H> - where H::Out: HeapSizeOf { fn get(&self, key: &H::Out, prefix: &[u8]) -> Option { hash_db::HashDB::get(self, key, prefix) } fn contains(&self, key: &H::Out, prefix: &[u8]) -> bool { hash_db::HashDB::contains(self, key, prefix) } diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index 231206fffd8cd20f7526e8171ea33d674278d13d..d1fa12abe2843edd3b5feec26fc850d9db55a1ee 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" @@ -10,10 +10,10 @@ parking_lot = "0.7.1" lazy_static = "1.0" log = "0.4" rand = "0.6" -serde = "1.0.81" -serde_derive = "1.0" -slog = "^2" -slog-json = "^2" -slog-async = "^2" +serde = { version = "1.0.81", features = ["derive"] } +serde_json = "1.0" +slog = { version = "^2", features = ["nested-values"] } +slog-json = { version = "^2", features = ["nested-values"] } +slog-async = { version = "^2", features = ["nested-values"] } slog-scope = "^4" ws = { version = "^0.7", features = ["ssl"] } diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index fba75c196aa369401e2de149ef69add7dc677b87..16bc69ec00beb1ddf61cbfffe099af226d413cf2 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -24,14 +24,12 @@ use std::{io, time, thread}; use std::sync::Arc; use parking_lot::Mutex; -use slog::{Drain, o}; +use slog::{Drain, o, OwnedKVList, Record}; use log::trace; use rand::{thread_rng, Rng}; pub use slog_scope::with_logger; pub use slog; -use serde_derive::{Serialize, Deserialize}; -use slog::OwnedKVList; -use slog::Record; +use serde::{Serialize, Deserialize}; use core::result; /// Configuration for telemetry. @@ -56,15 +54,15 @@ pub const SUBSTRATE_INFO: &str = "0"; pub const CONSENSUS_TRACE: &str = "9"; pub const CONSENSUS_DEBUG: &str = "5"; pub const CONSENSUS_WARN: &str = "4"; -pub const CONSENSUS_INFO: &str = "3"; +pub const CONSENSUS_INFO: &str = "0"; /// Multiply logging to all drains. This is similar to `slog::Duplicate`, which is /// limited to two drains though and doesn't support dynamic nesting at runtime. #[derive(Debug, Clone)] -pub struct Multiply (pub Vec>); +pub struct Multiply (pub Vec); impl Multiply { - pub fn new(v: Vec>) -> Self { + pub fn new(v: Vec) -> Self { Multiply(v) } } @@ -166,7 +164,7 @@ pub fn init_telemetry(config: TelemetryConfig) -> slog_scope::GlobalLoggerGuard macro_rules! telemetry { ( $a:expr; $b:expr; $( $t:tt )* ) => { $crate::with_logger(|l| { - $crate::slog::slog_info!(l, #$a, $b; "verbosity" => stringify!($a), $($t)* ) + $crate::slog::slog_info!(l, #$a, $b; $($t)* ) }) } } diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 50031809a1c7418285c28e4c6e572b7e61ed9feb..7628125df445b67fbb9307941292b88c077bd9a5 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-client" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -14,5 +14,18 @@ consensus = { package = "substrate-consensus-common", path = "../consensus/commo keyring = { package = "substrate-keyring", path = "../../core/keyring" } primitives = { package = "substrate-primitives", path = "../primitives" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } -runtime = { package = "substrate-test-runtime", path = "../test-runtime" } +runtime = { package = "substrate-test-runtime", path = "../test-runtime", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } + +[features] +default = [ + "include-wasm-blob", + "std", +] +std = [ + "runtime/std", +] +# If enabled, the WASM blob is added to the `GenesisConfig`. +include-wasm-blob = [ + "runtime/include-wasm-blob", +] \ No newline at end of file diff --git a/core/test-client/src/block_builder_ext.rs b/core/test-client/src/block_builder_ext.rs index e427b5789291e705605b553332e0e7f21abffcd7..15861ce3d0eaa3c997d43ee10ee6c5d46c47abf2 100644 --- a/core/test-client/src/block_builder_ext.rs +++ b/core/test-client/src/block_builder_ext.rs @@ -17,7 +17,6 @@ //! Block Builder extensions for tests. use client; -use super::AccountKeyring; use runtime; use runtime_primitives::traits::ProvideRuntimeApi; use client::block_builder::api::BlockBuilder; @@ -33,13 +32,6 @@ impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime: A::Api: BlockBuilder { fn push_transfer(&mut self, transfer: runtime::Transfer) -> Result<(), client::error::Error> { - self.push(sign_tx(transfer)) + self.push(transfer.into_signed_tx()) } } - -fn sign_tx(transfer: runtime::Transfer) -> runtime::Extrinsic { - let signature = AccountKeyring::from_public(&transfer.from) - .unwrap() - .sign(&parity_codec::Encode::encode(&transfer)); - runtime::Extrinsic::Transfer(transfer, signature) -} diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index 70e7feb0788828bd398fc9b007e7c8c705c9b63d..d285bb726b75258210ed59d043313dc88a74d3c9 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -17,7 +17,10 @@ //! Client extension for tests. use client::{self, Client}; -use consensus::{ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, ForkChoiceStrategy}; +use consensus::{ + ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, + ForkChoiceStrategy, +}; use runtime_primitives::Justification; use runtime_primitives::generic::BlockId; use primitives::Blake2Hasher; @@ -31,11 +34,19 @@ pub trait TestClient: Sized { -> Result<(), ConsensusError>; /// Import block with justification, finalizes block. - fn import_justified(&self, origin: BlockOrigin, block: runtime::Block, justification: Justification) - -> Result<(), ConsensusError>; + fn import_justified( + &self, + origin: BlockOrigin, + block: runtime::Block, + justification: Justification + ) -> Result<(), ConsensusError>; /// Finalize a block. - fn finalize_block(&self, id: BlockId, justification: Option) -> client::error::Result<()>; + fn finalize_block( + &self, + id: BlockId, + justification: Option, + ) -> client::error::Result<()>; /// Returns hash of the genesis block. fn genesis_hash(&self) -> runtime::Hash; @@ -64,9 +75,12 @@ impl TestClient for Client self.import_block(import, HashMap::new()).map(|_| ()) } - fn import_justified(&self, origin: BlockOrigin, block: runtime::Block, justification: Justification) - -> Result<(), ConsensusError> - { + fn import_justified( + &self, + origin: BlockOrigin, + block: runtime::Block, + justification: Justification, + ) -> Result<(), ConsensusError> { let import = ImportBlock { origin, header: block.header, @@ -81,7 +95,11 @@ impl TestClient for Client self.import_block(import, HashMap::new()).map(|_| ()) } - fn finalize_block(&self, id: BlockId, justification: Option) -> client::error::Result<()> { + fn finalize_block( + &self, + id: BlockId, + justification: Option, + ) -> client::error::Result<()> { self.finalize_block(id, justification, true) } diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 4a99df65a5467c07d7ce4a29c0a0253d232b39df..5154fb0c1db99a7a68da665b653b02c0b06a1244 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -19,29 +19,31 @@ #![warn(missing_docs)] pub mod client_ext; +#[cfg(feature = "include-wasm-blob")] pub mod trait_tests; mod block_builder_ext; pub use client_ext::TestClient; pub use block_builder_ext::BlockBuilderExt; -pub use client; -pub use client::ExecutionStrategies; -pub use client::blockchain; -pub use client::backend; -pub use executor::NativeExecutor; +pub use client::{ExecutionStrategies, blockchain, backend, self}; +pub use executor::{NativeExecutor, self}; pub use runtime; pub use consensus; -pub use keyring::{AuthorityKeyring, AccountKeyring}; +pub use keyring::{sr25519::Keyring as AuthorityKeyring, AccountKeyring}; -use std::sync::Arc; +use std::{sync::Arc, collections::HashMap}; use futures::future::FutureResult; use primitives::Blake2Hasher; -use runtime_primitives::StorageOverlay; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor}; +use primitives::storage::well_known_keys; +use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor +}; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; use state_machine::ExecutionStrategy; use client::LocalCallExecutor; +#[cfg(feature = "include-wasm-blob")] mod local_executor { #![allow(missing_docs)] use runtime; @@ -56,12 +58,14 @@ mod local_executor { } /// Native executor used for tests. +#[cfg(feature = "include-wasm-blob")] pub use local_executor::LocalExecutor; /// Test client database backend. pub type Backend = client_db::Backend; /// Test client executor. +#[cfg(feature = "include-wasm-blob")] pub type Executor = client::LocalCallExecutor< Backend, executor::NativeExecutor, @@ -78,6 +82,7 @@ pub type LightBackend = client::light::backend::Backend< pub struct LightFetcher; /// Test client light executor. +#[cfg(feature = "include-wasm-blob")] pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor< runtime::Block, LightBackend, @@ -98,12 +103,112 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor > >; +/// A builder for creating a test client instance. +pub struct TestClientBuilder { + execution_strategies: ExecutionStrategies, + genesis_extension: HashMap, Vec>, + support_changes_trie: bool, +} + +impl TestClientBuilder { + /// Create a new instance of the test client builder. + pub fn new() -> Self { + TestClientBuilder { + execution_strategies: ExecutionStrategies::default(), + genesis_extension: HashMap::default(), + support_changes_trie: false, + } + } + + /// Set the execution strategy that should be used by all contexts. + pub fn set_execution_strategy( + mut self, + execution_strategy: ExecutionStrategy + ) -> Self { + self.execution_strategies = ExecutionStrategies { + syncing: execution_strategy, + importing: execution_strategy, + block_construction: execution_strategy, + offchain_worker: execution_strategy, + other: execution_strategy, + }; + self + } + + /// Set an extension of the genesis storage. + pub fn set_genesis_extension( + mut self, + extension: HashMap, Vec> + ) -> Self { + self.genesis_extension = extension; + self + } + + /// Enable/Disable changes trie support. + pub fn set_support_changes_trie(mut self, enable: bool) -> Self { + self.support_changes_trie = enable; + self + } + + /// Build the test client. + #[cfg(feature = "include-wasm-blob")] + pub fn build(self) -> client::Client< + Backend, Executor, runtime::Block, runtime::RuntimeApi + > { + let backend = Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)); + self.build_with_backend(backend) + } + + /// Build the test client with the given backend. + #[cfg(feature = "include-wasm-blob")] + pub fn build_with_backend(self, backend: Arc) -> client::Client< + B, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi + > where B: backend::LocalBackend { + let executor = NativeExecutor::new(None); + let executor = LocalCallExecutor::new(backend.clone(), executor); + + client::Client::new( + backend, + executor, + genesis_storage(self.support_changes_trie, self.genesis_extension), + self.execution_strategies + ).expect("Creates new client") + } + + /// Build the test client with the given native executor. + pub fn build_with_native_executor( + self, + executor: executor::NativeExecutor + ) -> client::Client< + Backend, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi + > where E: executor::NativeExecutionDispatch + { + let backend = Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)); + let executor = LocalCallExecutor::new(backend.clone(), executor); + + client::Client::new( + backend, + executor, + genesis_storage(self.support_changes_trie, self.genesis_extension), + self.execution_strategies + ).expect("Creates new client") + } +} + /// Creates new client instance used for tests. +#[cfg(feature = "include-wasm-blob")] pub fn new() -> client::Client { new_with_backend(Arc::new(Backend::new_test(::std::u32::MAX, ::std::u64::MAX)), false) } /// Creates new light client instance used for tests. +#[cfg(feature = "include-wasm-blob")] pub fn new_light() -> client::Client { let storage = client_db::light::LightStorage::new_test(); let blockchain = Arc::new(client::light::blockchain::Blockchain::new(storage)); @@ -113,42 +218,28 @@ pub fn new_light() -> client::Client client::Client { - let backend = Arc::new(Backend::new_test(::std::u32::MAX, ::std::u64::MAX)); - let executor = NativeExecutor::new(None); - let executor = LocalCallExecutor::new(backend.clone(), executor); - - let execution_strategies = ExecutionStrategies { - syncing: execution_strategy, - importing: execution_strategy, - block_construction: execution_strategy, - offchain_worker: execution_strategy, - other: execution_strategy, - }; - - client::Client::new( - backend, - executor, - genesis_storage(false), - execution_strategies - ).expect("Creates new client") + TestClientBuilder::new().set_execution_strategy(execution_strategy).build() } /// Creates new test client instance that suports changes trie creation. +#[cfg(feature = "include-wasm-blob")] pub fn new_with_changes_trie() -> client::Client { - new_with_backend(Arc::new(Backend::new_test(::std::u32::MAX, ::std::u64::MAX)), true) + TestClientBuilder::new().set_support_changes_trie(true).build() } /// Creates new client instance used for tests with an explicitly provided backend. /// This is useful for testing backend implementations. +#[cfg(feature = "include-wasm-blob")] pub fn new_with_backend( backend: Arc, support_changes_trie: bool @@ -159,8 +250,9 @@ pub fn new_with_backend( runtime::RuntimeApi > where B: backend::LocalBackend { - let executor = NativeExecutor::new(None); - client::new_with_backend(backend, executor, genesis_storage(support_changes_trie)).unwrap() + TestClientBuilder::new() + .set_support_changes_trie(support_changes_trie) + .build_with_backend(backend) } fn genesis_config(support_changes_trie: bool) -> GenesisConfig { @@ -177,12 +269,26 @@ fn genesis_config(support_changes_trie: bool) -> GenesisConfig { ) } -fn genesis_storage(support_changes_trie: bool) -> StorageOverlay { +fn genesis_storage( + support_changes_trie: bool, + extension: HashMap, Vec> +) -> (StorageOverlay, ChildrenStorageOverlay) { let mut storage = genesis_config(support_changes_trie).genesis_map(); - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root(storage.clone().into_iter()); + storage.extend(extension.into_iter()); + + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + storage.clone().into_iter() + ); let block: runtime::Block = client::genesis::construct_genesis_block(state_root); storage.extend(additional_storage_with_genesis(&block)); - storage + + let mut child_storage = ChildrenStorageOverlay::default(); + child_storage.insert( + well_known_keys::CHILD_STORAGE_KEY_PREFIX.iter().chain(b"test").cloned().collect(), + vec![(b"key".to_vec(), vec![42_u8])].into_iter().collect() + ); + + (storage, child_storage) } impl client::light::fetcher::Fetcher for LightFetcher { @@ -190,6 +296,7 @@ impl client::light::fetcher::Fetcher for LightFetcher { type RemoteReadResult = FutureResult>, client::error::Error>; type RemoteCallResult = FutureResult, client::error::Error>; type RemoteChangesResult = FutureResult, u32)>, client::error::Error>; + type RemoteBodyResult = FutureResult, client::error::Error>; fn remote_header( &self, @@ -205,6 +312,13 @@ impl client::light::fetcher::Fetcher for LightFetcher { unimplemented!("not (yet) used in tests") } + fn remote_read_child( + &self, + _request: client::light::fetcher::RemoteReadChildRequest, + ) -> Self::RemoteReadResult { + unimplemented!("not (yet) used in tests") + } + fn remote_call( &self, _request: client::light::fetcher::RemoteCallRequest, @@ -218,4 +332,11 @@ impl client::light::fetcher::Fetcher for LightFetcher { ) -> Self::RemoteChangesResult { unimplemented!("not (yet) used in tests") } + + fn remote_body( + &self, + _request: client::light::fetcher::RemoteBodyRequest, + ) -> Self::RemoteBodyResult { + unimplemented!("not (yet) used in tests") + } } diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index f7b606b742ddac7abdbb52e4bce8eb94b44e2f2c..4244dcc58b8c39aea5a1b5bd3fece8fa495eec47 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -1,20 +1,19 @@ [package] name = "substrate-test-runtime" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] log = { version = "0.4", optional = true } -hex-literal = { version = "0.1.0", optional = true } -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } keyring = { package = "substrate-keyring", path = "../keyring", optional = true } substrate-client = { path = "../client", default-features = false } primitives = { package = "substrate-primitives", path = "../primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../inherents", default-features = false } consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../consensus/aura/primitives", default-features = false } +consensus_babe = { package = "substrate-consensus-babe-primitives", path = "../consensus/babe/primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } @@ -33,12 +32,13 @@ substrate-executor = { path = "../executor" } substrate-test-client = { path = "../test-client" } [features] -default = ["std"] +default = [ + "std", + "include-wasm-blob" +] std = [ "log", - "hex-literal", "serde", - "serde_derive", "substrate-client/std", "keyring", "parity-codec/std", @@ -50,10 +50,14 @@ std = [ "runtime_primitives/std", "runtime_version/std", "consensus_aura/std", + "consensus_babe/std", "primitives/std", "substrate-trie/std", "trie-db/std", "memory-db/std", "offchain-primitives/std", "executive/std", + "consensus_authorities/std", ] +# If enabled, the WASM blob is added to the `GenesisConfig`. +include-wasm-blob = [] diff --git a/core/test-runtime/src/genesismap.rs b/core/test-runtime/src/genesismap.rs index 13e9e5ec9a55dee734fa17f662061a4851d16293..cf7682102fb83ae9400c7217fcb26bd42f6af81f 100644 --- a/core/test-runtime/src/genesismap.rs +++ b/core/test-runtime/src/genesismap.rs @@ -17,12 +17,12 @@ //! Tool for creating the genesis block. use std::collections::HashMap; -use runtime_io::twox_128; +use runtime_io::{blake2_256, twox_128}; use super::AccountId; use parity_codec::{Encode, KeyedVec, Joiner}; use primitives::{ChangesTrieConfiguration, map, storage::well_known_keys}; use runtime_primitives::traits::Block; -use primitives::ed25519::Public as AuthorityId; +use primitives::sr25519::Public as AuthorityId; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { @@ -32,7 +32,12 @@ pub struct GenesisConfig { } impl GenesisConfig { - pub fn new(support_changes_trie: bool, authorities: Vec, endowed_accounts: Vec, balance: u64) -> Self { + pub fn new( + support_changes_trie: bool, + authorities: Vec, + endowed_accounts: Vec, + balance: u64 + ) -> Self { GenesisConfig { changes_trie_config: match support_changes_trie { true => Some(super::changes_trie_config()), @@ -44,11 +49,13 @@ impl GenesisConfig { } pub fn genesis_map(&self) -> HashMap, Vec> { + #[cfg(feature = "include-wasm-blob")] let wasm_runtime = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm").to_vec(); let mut map: HashMap, Vec> = self.balances.iter() .map(|&(ref account, balance)| (account.to_keyed_vec(b"balance:"), vec![].and(&balance))) - .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) + .map(|(k, v)| (blake2_256(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ + #[cfg(feature = "include-wasm-blob")] (well_known_keys::CODE.into(), wasm_runtime), (well_known_keys::HEAP_PAGES.into(), vec![].and(&(16 as u64))), (well_known_keys::AUTHORITY_COUNT.into(), vec![].and(&(self.authorities.len() as u32))), diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index cd072b78bafdff2cea867ac2c267bdda486d6d7d..e7c634849528a8d5edd27fecc9a2a49793f0544b 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -38,12 +38,12 @@ use runtime_primitives::{ create_runtime_str, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, - GetNodeBlockType, GetRuntimeBlockType, AuthorityIdFor, + GetNodeBlockType, GetRuntimeBlockType, AuthorityIdFor, Verify, }, }; use runtime_version::RuntimeVersion; pub use primitives::hash::H256; -use primitives::{ed25519, sr25519, OpaqueMetadata}; +use primitives::{sr25519, OpaqueMetadata}; #[cfg(any(feature = "std", test))] use runtime_version::NativeVersion; use inherents::{CheckInherentsResult, InherentData}; @@ -102,8 +102,7 @@ pub enum Extrinsic { } #[cfg(feature = "std")] -impl serde::Serialize for Extrinsic -{ +impl serde::Serialize for Extrinsic { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| seq.serialize_bytes(bytes)) } @@ -142,14 +141,14 @@ impl Extrinsic { } } -// The identity type used by authorities. -pub type AuthorityId = ed25519::Public; -// The signature type used by authorities. -pub type AuthoritySignature = ed25519::Signature; -/// An identifier for an account on this system. -pub type AccountId = sr25519::Public; -// The signature type used by accounts/transactions. +/// The signature type used by authorities. +pub type AuthoritySignature = sr25519::Signature; +/// The identity type used by authorities. +pub type AuthorityId = ::Signer; +/// The signature type used by accounts/transactions. pub type AccountSignature = sr25519::Signature; +/// An identifier for an account on this system. +pub type AccountId = ::Signer; /// A simple hash type for all our hashing. pub type Hash = H256; /// The block number type used in this runtime. @@ -240,6 +239,13 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + /// Returns the initialized block number. + fn get_block_number() -> u64; + /// Takes and returns the initialized block number. + fn take_block_number() -> Option; + /// Returns if no block was initialized. + #[skip_initialize_block] + fn without_initialize_block() -> bool; } } } else { @@ -264,6 +270,13 @@ cfg_if! { fn use_trie() -> u64; fn benchmark_indirect_call() -> u64; fn benchmark_direct_call() -> u64; + /// Returns the initialized block number. + fn get_block_number() -> u64; + /// Takes and returns the initialized block number. + fn take_block_number() -> Option; + /// Returns if no block was initialized. + #[skip_initialize_block] + fn without_initialize_block() -> bool; } } } @@ -319,7 +332,6 @@ fn code_using_trie() -> u64 { iter_pairs.len() as u64 } - cfg_if! { if #[cfg(feature = "std")] { impl_runtime_apis! { @@ -418,12 +430,34 @@ cfg_if! { fn benchmark_direct_call() -> u64 { (0..1000).fold(0, |p, i| p + benchmark_add_one(i)) } + + fn get_block_number() -> u64 { + system::get_block_number().expect("Block number is initialized") + } + + fn without_initialize_block() -> bool { + system::get_block_number().is_none() + } + + fn take_block_number() -> Option { + system::take_block_number() + } } impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } } + impl consensus_babe::BabeApi for Runtime { + fn startup_data() -> consensus_babe::BabeConfiguration { + consensus_babe::BabeConfiguration { + slot_duration: 1, + expected_block_time: 1, + threshold: std::u64::MAX, + } + } + } + impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); @@ -433,7 +467,7 @@ cfg_if! { impl consensus_authorities::AuthoritiesApi for Runtime { fn authorities() -> Vec> { - crate::system::authorities() + system::authorities() } } } @@ -538,14 +572,34 @@ cfg_if! { fn benchmark_direct_call() -> u64 { (0..10000).fold(0, |p, i| p + benchmark_add_one(i)) } - } + fn get_block_number() -> u64 { + system::get_block_number().expect("Block number is initialized") + } + + fn without_initialize_block() -> bool { + system::get_block_number().is_none() + } + fn take_block_number() -> Option { + system::take_block_number() + } + } impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } } + impl consensus_babe::BabeApi for Runtime { + fn startup_data() -> consensus_babe::BabeConfiguration { + consensus_babe::BabeConfiguration { + slot_duration: 1, + expected_block_time: 1, + threshold: core::u64::MAX, + } + } + } + impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); @@ -555,7 +609,7 @@ cfg_if! { impl consensus_authorities::AuthoritiesApi for Runtime { fn authorities() -> Vec> { - crate::system::authorities() + system::authorities() } } } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 266b7130d416729e03ffb15b282f9ed844f3f685..5345dc0cdb01bac03d568b94b9499878ddde3120 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -18,7 +18,7 @@ //! and depositing logs. use rstd::prelude::*; -use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128}; +use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128, blake2_256}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT}; @@ -27,7 +27,7 @@ use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_vali use parity_codec::{KeyedVec, Encode}; use super::{AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest}; use primitives::{Blake2Hasher, storage::well_known_keys}; -use primitives::ed25519::Public as AuthorityId; +use primitives::sr25519::Public as AuthorityId; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -35,7 +35,7 @@ const BALANCE_OF: &[u8] = b"balance:"; storage_items! { ExtrinsicData: b"sys:xtd" => required map [ u32 => Vec ]; // The current block number being processed. Set by `execute_block`. - Number: b"sys:num" => required BlockNumber; + Number: b"sys:num" => BlockNumber; ParentHash: b"sys:pha" => required Hash; NewAuthorities: b"sys:new_auth" => Vec; } @@ -45,11 +45,11 @@ pub fn balance_of_key(who: AccountId) -> Vec { } pub fn balance_of(who: AccountId) -> u64 { - storage::get_or(&balance_of_key(who), 0) + storage::hashed::get_or(&blake2_256, &balance_of_key(who), 0) } pub fn nonce_of(who: AccountId) -> u64 { - storage::get_or(&who.to_keyed_vec(NONCE_OF), 0) + storage::hashed::get_or(&blake2_256, &who.to_keyed_vec(NONCE_OF), 0) } /// Get authorities at given block. @@ -70,6 +70,14 @@ pub fn initialize_block(header: &Header) { storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); } +pub fn get_block_number() -> Option { + Number::get() +} + +pub fn take_block_number() -> Option { + Number::take() +} + /// Actually execute all transitioning for `block`. pub fn polish_block(block: &mut Block) { let header = &mut block.header; @@ -152,7 +160,7 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { let tx = utx.transfer(); let nonce_key = tx.from.to_keyed_vec(NONCE_OF); - let expected_nonce: u64 = storage::get_or(&nonce_key, 0); + let expected_nonce: u64 = storage::hashed::get_or(&blake2_256, &nonce_key, 0); if tx.nonce < expected_nonce { return TransactionValidity::Invalid(ApplyError::Stale as i8); } @@ -167,7 +175,9 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { let mut deps = Vec::new(); deps.push(hash(&tx.from, tx.nonce - 1)); deps - } else { Vec::new() }; + } else { + Vec::new() + }; let provides = { let mut p = Vec::new(); @@ -200,7 +210,7 @@ pub fn finalize_block() -> Header { let txs = txs.iter().map(Vec::as_slice).collect::>(); let extrinsics_root = enumerated_trie_root::(&txs).into(); - let number = ::take(); + let number = ::take().expect("Number is set by `initialize_block`"); let parent_hash = ::take(); let storage_root = BlakeTwo256::storage_root(); let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash, number - 1); @@ -241,26 +251,26 @@ fn execute_transaction_backend(utx: &Extrinsic) -> ApplyResult { fn execute_transfer_backend(tx: &Transfer) -> ApplyResult { // check nonce let nonce_key = tx.from.to_keyed_vec(NONCE_OF); - let expected_nonce: u64 = storage::get_or(&nonce_key, 0); + let expected_nonce: u64 = storage::hashed::get_or(&blake2_256, &nonce_key, 0); if !(tx.nonce == expected_nonce) { return Err(ApplyError::Stale) } // increment nonce in storage - storage::put(&nonce_key, &(expected_nonce + 1)); + storage::hashed::put(&blake2_256, &nonce_key, &(expected_nonce + 1)); // check sender balance let from_balance_key = tx.from.to_keyed_vec(BALANCE_OF); - let from_balance: u64 = storage::get_or(&from_balance_key, 0); + let from_balance: u64 = storage::hashed::get_or(&blake2_256, &from_balance_key, 0); // enact transfer if !(tx.amount <= from_balance) { return Err(ApplyError::CantPay) } let to_balance_key = tx.to.to_keyed_vec(BALANCE_OF); - let to_balance: u64 = storage::get_or(&to_balance_key, 0); - storage::put(&from_balance_key, &(from_balance - tx.amount)); - storage::put(&to_balance_key, &(to_balance + tx.amount)); + let to_balance: u64 = storage::hashed::get_or(&blake2_256, &to_balance_key, 0); + storage::hashed::put(&blake2_256, &from_balance_key, &(from_balance - tx.amount)); + storage::hashed::put(&blake2_256, &to_balance_key, &(to_balance + tx.amount)); Ok(ApplyOutcome::Success) } @@ -295,7 +305,7 @@ fn info_expect_equal_hash(given: &Hash, expected: &Hash) { mod tests { use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; + use runtime_io::{with_externalities, twox_128, blake2_256, TestExternalities}; use parity_codec::{Joiner, KeyedVec}; use substrate_test_client::{AuthorityKeyring, AccountKeyring}; use crate::{Header, Transfer}; @@ -313,7 +323,7 @@ mod tests { twox_128(&0u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Alice.to_raw_public().to_vec(), twox_128(&1u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Bob.to_raw_public().to_vec(), twox_128(&2u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Charlie.to_raw_public().to_vec(), - twox_128(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + blake2_256(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ]) } diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index 7df0a2652463d7ae88c49f14d4842e6a27bdaf2b..eaa9acbd457f16bc2aec977db248bce2337b9ed5 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -78,8 +78,18 @@ name = "asn1_der_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atty" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -109,11 +119,6 @@ dependencies = [ "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base-x" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "base58" version = "0.1.0" @@ -199,6 +204,11 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bumpalo" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byte-tools" version = "0.2.0" @@ -228,6 +238,11 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "c_linked_list" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cc" version = "1.0.30" @@ -435,6 +450,17 @@ name = "data-encoding" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "derive_more" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "digest" version = "0.6.2" @@ -451,11 +477,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -490,17 +511,29 @@ dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "env_logger" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "environmental" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "error-chain" -version = "0.12.0" +name = "erased-serde" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -518,8 +551,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -592,6 +625,11 @@ dependencies = [ "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "generic-array" version = "0.8.3" @@ -609,6 +647,26 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "get_if_addrs" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "get_if_addrs-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hash-db" version = "0.12.2" @@ -708,6 +766,14 @@ name = "httparse" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "humantime" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "idna" version = "0.1.5" @@ -723,7 +789,7 @@ name = "impl-codec" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -754,6 +820,14 @@ name = "itoa" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "js-sys" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "keccak" version = "0.1.0" @@ -794,41 +868,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -839,9 +914,10 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -849,43 +925,41 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -893,7 +967,7 @@ dependencies = [ "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -904,28 +978,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -935,11 +1009,9 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -947,41 +1019,41 @@ dependencies = [ "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -991,14 +1063,16 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1009,41 +1083,42 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1051,7 +1126,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1060,29 +1135,34 @@ dependencies = [ "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1090,26 +1170,39 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1267,6 +1360,15 @@ name = "nohash-hasher" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "nom" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-integer" version = "0.1.39" @@ -1288,6 +1390,11 @@ dependencies = [ "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "numtoa" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "once_cell" version = "0.1.8" @@ -1349,7 +1456,7 @@ source = "git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7 [[package]] name = "parity-codec" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1364,18 +1471,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1481,8 +1589,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1538,8 +1646,8 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1572,7 +1680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quote" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1741,6 +1849,14 @@ name = "redox_syscall" version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "redox_termios" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "regex" version = "1.1.2" @@ -1854,16 +1970,6 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "secp256k1" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "semver" version = "0.9.0" @@ -1877,10 +1983,18 @@ name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "send_wrapper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "serde_derive" @@ -1888,8 +2002,8 @@ version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1951,6 +2065,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "slog" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "slog-async" @@ -1968,6 +2085,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2005,6 +2123,11 @@ dependencies = [ "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sourcefile" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "spin" version = "0.5.0" @@ -2012,153 +2135,146 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "substrate-inherents 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2176,50 +2292,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2240,8 +2312,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2257,127 +2329,151 @@ dependencies = [ [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-trie 1.0.0", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" +dependencies = [ + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", +] + +[[package]] +name = "substrate-consensus-babe-primitives" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-slots 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-consensus-slots" +version = "2.0.0" +dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2385,37 +2481,34 @@ dependencies = [ [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "sr-std 2.0.0", "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2423,31 +2516,29 @@ dependencies = [ [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2457,47 +2548,47 @@ dependencies = [ [[package]] name = "substrate-test-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-executive 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-executive 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-consensus-babe-primitives 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-test-runtime-wasm" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "substrate-test-runtime 1.0.0", + "substrate-test-runtime 2.0.0", ] [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2514,11 +2605,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.29" +version = "0.15.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2528,8 +2619,8 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2538,6 +2629,25 @@ name = "take_mut" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "termcolor" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "termion" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "thread_local" version = "0.3.6" @@ -2558,7 +2668,7 @@ dependencies = [ [[package]] name = "tiny-bip39" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2809,7 +2919,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2896,11 +3006,101 @@ name = "vcpkg" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wasm-bindgen" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "wasm-bindgen-webidl" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmi" version = "0.4.3" @@ -2911,6 +3111,27 @@ dependencies = [ "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "web-sys" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "weedle" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi" version = "0.2.8" @@ -2935,11 +3156,28 @@ name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wincolor" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws" version = "0.7.9" @@ -2979,7 +3217,7 @@ dependencies = [ [[package]] name = "yamux" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3008,10 +3246,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" +"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" "checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" @@ -3023,11 +3261,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" +"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +"checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" @@ -3052,15 +3292,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" "checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" +"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" "checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" +"checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" +"checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" @@ -3073,8 +3314,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" +"checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" +"checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" "checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" @@ -3088,35 +3332,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" +"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" +"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5b9cd37b1ca54fa2fd0bbf0486adf2f55f8994f2be9410b65265050b24709b2" -"checksum libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf9c56e6f04cb649fdeb806e963d2da223e3ed17748d9e924fdb836c09f76307" -"checksum libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "debea88a3d5de9fdaf7082bd6d238f2c4c6a0420f14bdf9e1c1083b3e7c69286" -"checksum libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350d0018af3668d954f61ce7311e7d64ab7c40f19a8eb895e4750efe24c3455f" -"checksum libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfbcf36cc58ad5d0252d8ebe9c1a87190693fe2cdbe40fb01d8046779f9a75ad" -"checksum libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82e98435973e958d7dea3f5074d7fca53d0dfce2e1ac6924119a21c2991fe443" -"checksum libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92bb0153418eaf0ea549008d1e22748a956c9c36af9374fbe7189d44607c14be" -"checksum libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc915d0cde68a05d26a0dcb125eddce7dd2a425e97c5172ac300c1ee8716f55a" -"checksum libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "355bb370dd12809792dc020638b280e7aaf8625318018abd311c51affd0a612d" -"checksum libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e86291401f4a83f9fa81c03f8a7ccf0b03ce6aaa40cba058a7ec1026a65a6fe4" -"checksum libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3277f1f7eaadf5cdde6a76fb4afbf24e0eda6e2b04f288f526c6fa2e4293a6e" -"checksum libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4842a7ab54c12459b58b9e59cbeb03e3e1fd393fef48079472856f934352772" -"checksum libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32ba52ee76aaa94af533526ce5a22fbfcc69a560174fccee82f4cdb557411d33" -"checksum libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00f416e1e3d0214bd7df2be2b6be8ef61771d44292b973c9e02bfbbd7f62fe46" -"checksum libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af47af9997d69fc70aa13e6e7cd0d766614ebe74005e69e763221a64d9a0a5ef" -"checksum libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa72d81501aad6998d3b1b964f68f438ef99c3aaf54d921e144e0477fa87568" -"checksum libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbb8d08cb536a964727e77b868a026c6d92993f08e387d49163565575a478d9" +"checksum libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141ab3f96adc87c8cb847b1cf790e0fbce0b03e3dabfdd3b72fe23d36fc005de" +"checksum libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1514593f2aced40b257565cf2edc63b4cc2f06241a2f3e5a4fe275e0c4d55e85" +"checksum libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f6f5543deedf4d89931a74d3897b63be19a62d5cb675efaa4c669a4aa0ab12" +"checksum libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9db88ba58601f4528ef5e5e5414e142b19d5813bdaa685e683ef5a44ed23606b" +"checksum libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "260689f26ab2161a1fde9617c53699f78e4ab25fd77c4b07a25b97fca74c5c6d" +"checksum libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1281e58168ed62cf2e9bfe127908a0ec277cf48cbb3dec5b1a68b58ea6332171" +"checksum libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd8ab542edc493fa7a9f9b7f93dc4ee0b384e1f9e2a3397ce0056ffe30a0ea21" +"checksum libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f009594f78d952c57f452be237650025acd4ef17c5cc8eda4c6466ba196e5688" +"checksum libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ccfb9869daccfb9d3938eda8821146e85105a8c874f14393cdb57543afeceb38" +"checksum libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d3dce2ec4fcb3a2cc748c02d61f7e76486df9c7b09e8ccb4d9f81befce207de" +"checksum libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3b3bb3328d206ad3061e863f179a211fc978d7bce05f90440ed6b8a6a9d17ced" +"checksum libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b23a8ece138f448572c5ff781d62323a954f1f681c303e6553368026764b0ae" +"checksum libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "55918f058f118d72d83f9a976f12e02e54c8616ddfc795c779c4801a5042a44f" +"checksum libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9bff57806e0f71832cc02b5dea1010e5f1a9d16393fd104a4b64e4aaae40d885" +"checksum libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3629f9a667d9f5acb5876df59cf3b547250e340131c47587f9ace7c517f21327" +"checksum libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d65c15f89c0607d4a334664d759e54e847e1856a73ea78e7bb6a75e6f4039010" +"checksum libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dff6c81d0f46261a6327219349753aefd3a92021a1e6102185fa112cfcddca97" +"checksum libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5369165359bea84e7ebe73f37b6240f31f8d924ce6710be3d8e1fa678985c9b8" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" @@ -3134,9 +3381,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" "checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" @@ -3144,9 +3393,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2edd80cdaf3b9c7b7f524299586bb4eae43cc5eb20c7b41aa0cd741200000e38" +"checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61ae6944d4435d41f4d0f12108c5cbb9207cbb14bc8f2b4984c6e930dc9c8e41" +"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" "checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" @@ -3169,7 +3418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" @@ -3187,6 +3436,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" "checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" @@ -3199,9 +3449,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" "checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" "checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" "checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" @@ -3216,26 +3466,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" "checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1825685f977249735d510a242a6727b46efe914bb67e38d30c071b1b72b1d5c2" +"checksum syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)" = "ec52cd796e5f01d0067225a5392e70084acc4c0013fa71d55166d38a8b307836" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" +"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1415431cb2398d84da64173f8473c792808314427d4a6f2f3ea85ae67239fe3" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" "checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" @@ -3256,7 +3505,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" +"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" @@ -3269,15 +3518,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" +"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" +"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" +"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" +"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" +"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" +"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" +"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" "checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" +"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" +"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "302defd1bed8a9a6d43b82f0e5a50510dfdfbbd02c270c93ff9d6f3f5e2dea89" +"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" diff --git a/core/test-runtime/wasm/Cargo.toml b/core/test-runtime/wasm/Cargo.toml index e78de31f3a99e4570b8fd8b9ff3ef294ea794a80..a056eab3840740e0ee3f2f07f99214446b23a0f5 100644 --- a/core/test-runtime/wasm/Cargo.toml +++ b/core/test-runtime/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-wasm" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/test-runtime/wasm/build.sh b/core/test-runtime/wasm/build.sh index abca9a60e9c4a7a5e68723cfd80c350a5c74d09a..635532babf3e8329e31ab4dbae91047809bb29e6 100755 --- a/core/test-runtime/wasm/build.sh +++ b/core/test-runtime/wasm/build.sh @@ -9,5 +9,5 @@ fi CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release for i in substrate_test_runtime do - wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm + wasm-gc "target/wasm32-unknown-unknown/release/$i.wasm" "target/wasm32-unknown-unknown/release/$i.compact.wasm" done diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index 55622093375b808f63a00002451bd7d9d5dd4126..5b2c2350af94323071cbc981ca9a49d003f5e934 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "substrate-transaction-pool" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" log = "0.4" parity-codec = "3.3" diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 1b6e32829069ba4fdd0818be87449830f6905a67..0ebc74b7da4557842f79905ae906639859afd9af 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -1,21 +1,20 @@ [package] name = "substrate-transaction-graph" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" log = "0.4" parking_lot = "0.7.1" -serde = "1.0" -serde_derive = "1.0" +serde = { version = "1.0", features = ["derive"] } substrate-primitives = { path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } [dev-dependencies] -assert_matches = "1.1" -env_logger = "0.6" -parity-codec = "3.3" +assert_matches = "1.3.0" +env_logger = "0.6.1" +parity-codec = "3.5.1" test_runtime = { package = "substrate-test-runtime", path = "../../test-runtime" } diff --git a/core/transaction-pool/graph/src/base_pool.rs b/core/transaction-pool/graph/src/base_pool.rs index ad434e57d45a21cdc2cec8a10984f1c782eb8a27..74e499674a228e98426e2904d461cafaab971144 100644 --- a/core/transaction-pool/graph/src/base_pool.rs +++ b/core/transaction-pool/graph/src/base_pool.rs @@ -25,7 +25,6 @@ use std::{ sync::Arc, }; -use error_chain::bail; use log::{trace, debug, warn}; use serde::Serialize; use substrate_primitives::hexdisplay::HexDisplay; @@ -43,9 +42,9 @@ use crate::ready::ReadyTransactions; /// Successful import result. #[derive(Debug, PartialEq, Eq)] pub enum Imported { - /// Transaction was successfuly imported to Ready queue. + /// Transaction was successfully imported to Ready queue. Ready { - /// Hash of transaction that was successfuly imported. + /// Hash of transaction that was successfully imported. hash: Hash, /// Transactions that got promoted from the Future queue. promoted: Vec, @@ -54,9 +53,9 @@ pub enum Imported { /// Transactions removed from the Ready pool (replaced). removed: Vec>>, }, - /// Transaction was successfuly imported to Future queue. + /// Transaction was successfully imported to Future queue. Future { - /// Hash of transaction that was successfuly imported. + /// Hash of transaction that was successfully imported. hash: Hash, } } @@ -184,7 +183,7 @@ impl BasePool, ) -> error::Result> { if self.future.contains(&tx.hash) || self.ready.contains(&tx.hash) { - bail!(error::ErrorKind::AlreadyImported(Box::new(tx.hash.clone()))) + return Err(error::Error::AlreadyImported(Box::new(tx.hash.clone()))) } let tx = WaitingTransaction::new( @@ -259,7 +258,7 @@ impl BasePool) { - description("Transaction is already in the pool"), - display("[{:?}] Already imported", hash), - } - /// The transaction cannot be imported cause it's a replacement and has too low priority. - TooLowPriority(old: Priority, new: Priority) { - description("The priority is too low to replace transactions already in the pool."), - display("Too low priority ({} > {})", old, new) - } - /// Deps cycle detected and we couldn't import transaction. - CycleDetected { - description("Transaction was not imported because of detected cycle."), - display("Cycle Detected"), - } - /// Transaction was dropped immediately after it got inserted. - ImmediatelyDropped { - description("Transaction couldn't enter the pool because of the limit."), - display("Immediately Dropped"), - } - } +/// Transaction pool result. +pub type Result = std::result::Result; + +/// Transaction pool error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Transaction is not verifiable yet, but might be in the future. + #[display(fmt="Unkown Transaction Validity. Error code: {}", _0)] + UnknownTransactionValidity(i8), + /// Transaction is invalid. + #[display(fmt="Invalid Transaction. Error Code: {}", _0)] + InvalidTransaction(i8), + /// The transaction is temporarily banned. + #[display(fmt="Temporarily Banned")] + TemporarilyBanned, + /// The transaction is already in the pool. + #[display(fmt="[{:?}] Already imported", _0)] + AlreadyImported(Box), + /// The transaction cannot be imported cause it's a replacement and has too low priority. + #[display(fmt="Too low priority ({} > {})", old, new)] + TooLowPriority { + /// Transaction already in the pool. + old: Priority, + /// Transaction entering the pool. + new: Priority + }, + /// Deps cycle etected and we couldn't import transaction. + #[display(fmt="Cycle Detected")] + CycleDetected, + /// Transaction was dropped immediately after it got inserted. + #[display(fmt="Transaction couldn't enter the pool because of the limit.")] + ImmediatelyDropped, + /// Invalid block id. + InvalidBlockId(String), } +impl std::error::Error for Error {} + /// Transaction pool error conversion. pub trait IntoPoolError: ::std::error::Error + Send + Sized { /// Try to extract original `Error` diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 91ded26630cf183eb3d1fcb98fe3681dcadf5372..a5b7a3d2aab2d0a0a2a9e03a4215c067b7256a45 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -27,14 +27,13 @@ use crate::listener::Listener; use crate::rotator::PoolRotator; use crate::watcher::Watcher; use serde::Serialize; -use error_chain::bail; use log::debug; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; use sr_primitives::{ generic::BlockId, - traits::{self, As}, + traits::{self, SaturatedConversion}, transaction_validity::{TransactionValidity, TransactionTag as Tag}, }; @@ -119,14 +118,14 @@ impl Pool { T: IntoIterator> { let block_number = self.api.block_id_to_number(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())?; + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())?; let results = xts .into_iter() .map(|xt| -> Result<_, B::Error> { let (hash, bytes) = self.api.hash_and_length(&xt); if self.rotator.is_banned(&hash) { - bail!(error::Error::from(error::ErrorKind::TemporarilyBanned)) + return Err(error::Error::TemporarilyBanned.into()) } match self.api.validate_transaction(at, xt.clone())? { @@ -138,15 +137,17 @@ impl Pool { priority, requires, provides, - valid_till: block_number.as_().saturating_add(longevity), + valid_till: block_number + .saturated_into::() + .saturating_add(longevity), }) }, TransactionValidity::Invalid(e) => { - bail!(error::Error::from(error::ErrorKind::InvalidTransaction(e))) + Err(error::Error::InvalidTransaction(e).into()) }, TransactionValidity::Unknown(e) => { self.listener.write().invalid(&hash); - bail!(error::Error::from(error::ErrorKind::UnknownTransactionValidity(e))) + Err(error::Error::UnknownTransactionValidity(e).into()) }, } }) @@ -166,7 +167,7 @@ impl Pool { let removed = self.enforce_limits(); Ok(results.into_iter().map(|res| match res { - Ok(ref hash) if removed.contains(hash) => Err(error::Error::from(error::ErrorKind::ImmediatelyDropped).into()), + Ok(ref hash) if removed.contains(hash) => Err(error::Error::ImmediatelyDropped.into()), other => other, }).collect()) } @@ -304,12 +305,9 @@ impl Pool { let hashes = status.pruned.iter().map(|tx| tx.hash.clone()).collect::>(); let results = self.submit_at(at, status.pruned.into_iter().map(|tx| tx.data.clone()))?; - // Collect the hashes of transactions that now became invalid (meaning that they are succesfuly pruned). + // Collect the hashes of transactions that now became invalid (meaning that they are succesfully pruned). let hashes = results.into_iter().enumerate().filter_map(|(idx, r)| match r.map_err(error::IntoPoolError::into_pool_error) { - Err(Ok(err)) => match err.kind() { - error::ErrorKind::InvalidTransaction(_) => Some(hashes[idx].clone()), - _ => None, - }, + Err(Ok(error::Error::InvalidTransaction(_))) => Some(hashes[idx].clone()), _ => None, }); // Fire `pruned` notifications for collected hashes and make sure to include @@ -317,7 +315,7 @@ impl Pool { let hashes = hashes.chain(known_imported_hashes.into_iter()); { let header_hash = self.api.block_id_to_hash(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())?; + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())?; let mut listener = self.listener.write(); for h in hashes { listener.pruned(header_hash, &h); @@ -333,11 +331,11 @@ impl Pool { /// /// Stale transactions are transaction beyond their longevity period. /// Note this function does not remove transactions that are already included in the chain. - /// See `prune_tags` ifyou want this. + /// See `prune_tags` if you want this. pub fn clear_stale(&self, at: &BlockId) -> Result<(), B::Error> { let block_number = self.api.block_id_to_number(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())? - .as_(); + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())? + .saturated_into::(); let now = time::Instant::now(); let to_remove = { self.ready() @@ -567,7 +565,7 @@ mod tests { assert_eq!(pool.status().future, 0); // then - assert_matches!(res.unwrap_err().kind(), error::ErrorKind::TemporarilyBanned); + assert_matches!(res.unwrap_err(), error::Error::TemporarilyBanned); } #[test] diff --git a/core/transaction-pool/graph/src/ready.rs b/core/transaction-pool/graph/src/ready.rs index befb1b60ccc2deb18e18eee7a4a08b977f87045d..ca3d7322cc01c522ba2b1a677586dd98bcbf7ff9 100644 --- a/core/transaction-pool/graph/src/ready.rs +++ b/core/transaction-pool/graph/src/ready.rs @@ -23,7 +23,6 @@ use std::{ use serde::Serialize; use log::debug; -use error_chain::bail; use parking_lot::RwLock; use sr_primitives::traits::Member; use sr_primitives::transaction_validity::{ @@ -376,7 +375,7 @@ impl ReadyTransactions { // bail - the transaction has too low priority to replace the old ones if old_priority >= tx.priority { - bail!(error::ErrorKind::TooLowPriority(old_priority, tx.priority)) + return Err(error::Error::TooLowPriority { old: old_priority, new: tx.priority }) } replace_hashes.into_iter().cloned().collect::>() diff --git a/core/transaction-pool/graph/src/watcher.rs b/core/transaction-pool/graph/src/watcher.rs index 5516d8c43c7497c8dc698f072634c61f99c9c4aa..44ab8431e8f612b7d5225aa452f5b13af7b41582 100644 --- a/core/transaction-pool/graph/src/watcher.rs +++ b/core/transaction-pool/graph/src/watcher.rs @@ -20,7 +20,7 @@ use futures::{ Stream, sync::mpsc, }; -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; /// Possible extrinsic status events #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] diff --git a/core/transaction-pool/src/error.rs b/core/transaction-pool/src/error.rs index e1223c537de3731446840f1176489f2ebfec0d2e..f3641aa8ecee3bfc31d86977686d709ce4a355e4 100644 --- a/core/transaction-pool/src/error.rs +++ b/core/transaction-pool/src/error.rs @@ -18,21 +18,32 @@ use client; use txpool; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed, impl_extract_backtrace, impl_error_chain_kind -}; - -error_chain! { - links { - Client(client::error::Error, client::error::ErrorKind) #[doc = "Client error"]; - Pool(txpool::error::Error, txpool::error::ErrorKind) #[doc = "Pool error"]; + +/// Transaction pool result. +pub type Result = std::result::Result; + +/// Transaction pool error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Pool error. + Pool(txpool::error::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::Pool(ref err) => Some(err), + } } } impl txpool::IntoPoolError for Error { - fn into_pool_error(self) -> ::std::result::Result { + fn into_pool_error(self) -> std::result::Result { match self { - Error(ErrorKind::Pool(e), c) => Ok(txpool::error::Error(e, c)), + Error::Pool(e) => Ok(e), e => Err(e), } } diff --git a/core/trie/Cargo.toml b/core/trie/Cargo.toml index d535c29701b33ebabcfc8c5d710c39b3eabfe474..dc245a442bd06962a6da73adb7eb3cadd5d337f1 100644 --- a/core/trie/Cargo.toml +++ b/core/trie/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Patricia trie stuff using a parity-codec node format" repository = "https://github.com/paritytech/parity-common" @@ -18,22 +18,23 @@ hash-db = { version = "0.12.2", default-features = false } trie-db = { version = "0.12.2", default-features = false } trie-root = { version = "0.12.2", default-features = false } memory-db = { version = "0.12.2", default-features = false } +substrate-primitives = { path = "../primitives", default-features = false } [dev-dependencies] -substrate-primitives = { path = "../primitives" } trie-bench = { version = "0.12" } trie-standardmap = { version = "0.12" } keccak-hasher = { version = "0.12" } criterion = "0.2" -hex-literal = "0.1.0" +hex-literal = "0.2.0" [features] default = ["std"] std = [ "rstd/std", - "codec/std", + "codec/std", "hash-db/std", "memory-db/std", "trie-db/std", - "trie-root/std" + "trie-root/std", + "substrate-primitives/std", ] diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index f40ae814914f25e25f17a46628632486563b97c5..1322038d7847cbec83d36349014ba5e0717282e3 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -17,7 +17,6 @@ //! Utility functions to interact with Substrate's Base-16 Modified Merkle Patricia tree ("trie"). #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] mod error; mod node_header; @@ -137,18 +136,28 @@ where ) } -/// Determine whether a child trie key is valid. `child_trie_root` and `child_delta_trie_root` can panic if invalid value is provided to them. -pub fn is_child_trie_key_valid(_storage_key: &[u8]) -> bool { - true +/// Determine whether a child trie key is valid. +/// +/// For now, the only valid child trie key is `:child_storage:default:`. +/// +/// `child_trie_root` and `child_delta_trie_root` can panic if invalid value is provided to them. +pub fn is_child_trie_key_valid(storage_key: &[u8]) -> bool { + use substrate_primitives::storage::well_known_keys; + let has_right_prefix = storage_key.starts_with(b":child_storage:default:"); + if has_right_prefix { + // This is an attempt to catch a change of `is_child_storage_key`, which + // just checks if the key has prefix `:child_storage:` at the moment of writing. + debug_assert!( + well_known_keys::is_child_storage_key(&storage_key), + "`is_child_trie_key_valid` is a subset of `is_child_storage_key`", + ); + } + has_right_prefix } /// Determine the default child trie root. pub fn default_child_trie_root(_storage_key: &[u8]) -> Vec { - let mut db = MemoryDB::default(); - let mut root = H::Out::default(); - let mut empty = TrieDBMut::::new(&mut db, &mut root); - empty.commit(); - empty.root().as_ref().to_vec() + trie_root::, Vec>(core::iter::empty()).as_ref().iter().cloned().collect() } /// Determine a child trie root given its ordered contents, closed form. H is the default hasher, but a generic @@ -325,7 +334,7 @@ mod tests { use hash_db::{HashDB, Hasher}; use trie_db::{DBValue, TrieMut, Trie}; use trie_standardmap::{Alphabet, ValueMode, StandardMap}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; fn check_equivalent(input: &Vec<(&[u8], &[u8])>) { { @@ -363,6 +372,18 @@ mod tests { } } + #[test] + fn default_trie_root() { + let mut db = MemoryDB::default(); + let mut root = ::Out::default(); + let mut empty = TrieDBMut::::new(&mut db, &mut root); + empty.commit(); + let root1 = empty.root().as_ref().to_vec(); + let root2: Vec = trie_root::, Vec>(std::iter::empty()).as_ref().iter().cloned().collect(); + + assert_eq!(root1, root2); + } + #[test] fn empty_is_equivalent() { let input: Vec<(&[u8], &[u8])> = vec![]; diff --git a/core/trie/src/node_codec.rs b/core/trie/src/node_codec.rs index 775ee9a4026c8901e497cbe0f7685bd65781c7fe..1b0d2be6524eaf0f88f7db5409c8c16b4e7497c5 100644 --- a/core/trie/src/node_codec.rs +++ b/core/trie/src/node_codec.rs @@ -61,12 +61,18 @@ impl trie_db::NodeCodec for NodeCodec { Ok(Node::Branch(children, value)) } NodeHeader::Extension(nibble_count) => { + if nibble_count % 2 == 1 && input[0] & 0xf0 != 0x00 { + return Err(BadFormat); + } let nibble_data = take(input, (nibble_count + 1) / 2).ok_or(BadFormat)?; let nibble_slice = NibbleSlice::new_offset(nibble_data, nibble_count % 2); let count = >::decode(input).ok_or(BadFormat)?.0 as usize; Ok(Node::Extension(nibble_slice, take(input, count).ok_or(BadFormat)?)) } NodeHeader::Leaf(nibble_count) => { + if nibble_count % 2 == 1 && input[0] & 0xf0 != 0x00 { + return Err(BadFormat); + } let nibble_data = take(input, (nibble_count + 1) / 2).ok_or(BadFormat)?; let nibble_slice = NibbleSlice::new_offset(nibble_data, nibble_count % 2); let count = >::decode(input).ok_or(BadFormat)?.0 as usize; diff --git a/core/util/fork-tree/Cargo.toml b/core/util/fork-tree/Cargo.toml index 12f03b4b2d6c808e2bdfc9d3385c76b531a117e4..d65f65d51afbe3bad6a20f8a309a9067fd5e0c55 100644 --- a/core/util/fork-tree/Cargo.toml +++ b/core/util/fork-tree/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fork-tree" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/core/util/fork-tree/src/lib.rs b/core/util/fork-tree/src/lib.rs index f194ac8915159b104be7e469bf5e27dcf9dbbdea..cba5a1535b6f2046c37539816c4c0571cd656f82 100644 --- a/core/util/fork-tree/src/lib.rs +++ b/core/util/fork-tree/src/lib.rs @@ -22,7 +22,7 @@ use std::fmt; use parity_codec::{Decode, Encode}; -/// Error occured when interating with the tree. +/// Error occured when iterating with the tree. #[derive(Clone, Debug, PartialEq)] pub enum Error { /// Adding duplicate node to tree. diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index 0868eebdd12079d5bcb45975748f9ecce89846ca..69f9c884cd0e4bd916eae92bc7fe5410f1338bd5 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -1,23 +1,22 @@ [package] name = "node-template" -version = "1.0.0" +version = "2.0.0" authors = ["Anonymous"] build = "build.rs" edition = "2018" [[bin]] -name = "template-node" +name = "node-template" path = "src/main.rs" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" ctrlc = { version = "3.0", features = ["termination"] } log = "0.4" tokio = "0.1" exit-future = "0.1" parking_lot = "0.7.1" -hex-literal = "0.1" parity-codec = "3.3" trie-root = "0.12.2" sr-io = { path = "../core/sr-io" } diff --git a/node-template/README.md b/node-template/README.md index 26c6924294be48bfd4d3013014013b19ff353f2c..6924fa55762b2b4b0d284d7afd2de771d77c7cc0 100644 --- a/node-template/README.md +++ b/node-template/README.md @@ -1,3 +1,68 @@ # Template Node A new SRML-based Substrate node, ready for hacking. + +# Building + +Install Rust: + +```bash +curl https://sh.rustup.rs -sSf | sh +``` + +Install required tools: + +```bash +./scripts/init.sh +``` + +Build the WebAssembly binary: + +```bash +./scripts/build.sh +``` + +Build all native code: + +```bash +cargo build +``` + +# Run + +You can start a development chain with: + +```bash +cargo run -- --dev +``` + +Detailed logs may be shown by running the node with the following environment variables set: `RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`. + +If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with testnet units. Give each node a name and expose them so they are listed on the Polkadot [telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open. + +We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR`, which is generated from the `--node-key` value that we specify below: + +```bash +cargo run -- \ + --base-path /tmp/alice \ + --chain=local \ + --alice \ + --node-key 0000000000000000000000000000000000000000000000000000000000000001 \ + --telemetry-url ws://telemetry.polkadot.io:1024 \ + --validator +``` + +In the second terminal, we'll start Bob's substrate node on a different TCP port of 30334, and with his chain database stored locally at `/tmp/bob`. We'll specify a value for the `--bootnodes` option that will connect his node to Alice's bootnode ID on TCP port 30333: + +```bash +cargo run -- \ + --base-path /tmp/bob \ + --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \ + --chain=local \ + --bob \ + --port 30334 \ + --telemetry-url ws://telemetry.polkadot.io:1024 \ + --validator +``` + +Additional CLI usage options are available and may be shown by running `cargo run -- --help`. diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index 6147250df137296266d9aec5ef89e93f32c9a50d..bc784071baa9a2e0eb8fc3c11cdaf06567eadfc0 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -1,12 +1,11 @@ [package] name = "node-template-runtime" -version = "1.0.0" +version = "2.0.0" authors = ["Anonymous"] edition = "2018" [dependencies] -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default_features = false } @@ -32,7 +31,6 @@ consensus_authorities = { package = "substrate-consensus-authorities", path = ". default = ["std"] std = [ "parity-codec/std", - "primitives/std", "client/std", "rstd/std", "runtime-io/std", @@ -42,13 +40,14 @@ std = [ "aura/std", "indices/std", "primitives/std", + "runtime-primitives/std", "system/std", "timestamp/std", "sudo/std", "version/std", - "serde_derive", "serde", "safe-mix/std", "consensus-aura/std", "offchain-primitives/std", + "consensus_authorities/std", ] diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index a6aa01bc873eb9e1b79057704d9b2d3fcbec2210..875b537a9fe492dbc6db628bd0d1f3126157731a 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -1,12 +1,11 @@ //! The Substrate Node Template runtime. This can be compiled with `#[no_std]`, ready for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit="256"] #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use parity_codec::{Encode, Decode}; use rstd::prelude::*; #[cfg(feature = "std")] @@ -92,11 +91,11 @@ pub mod opaque { /// This runtime version. pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("template-node"), - impl_name: create_runtime_str!("template-node"), + spec_name: create_runtime_str!("node-template"), + impl_name: create_runtime_str!("node-template"), authoring_version: 3, - spec_version: 3, - impl_version: 0, + spec_version: 4, + impl_version: 4, apis: RUNTIME_API_VERSIONS, }; @@ -225,7 +224,7 @@ pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive; +pub type Executive = executive::Executive; // Implement our runtime API endpoints. This is just a bunch of proxying. impl_runtime_apis! { diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index fd122433daea3460d170b1d5c1cc068d024be7e1..636ee1ac09506e2c887ebad48d91bb468a129ad2 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -19,16 +19,17 @@ pub trait Trait: system::Trait { type Event: From> + Into<::Event>; } -/// This module's storage items. +// This module's storage items. decl_storage! { trait Store for Module as TemplateModule { - // Just a dummy storage item. + // Just a dummy storage item. // Here we are declaring a StorageValue, `Something` as a Option // `get(something)` is the default getter which returns either the stored `u32` or `None` if nothing stored Something get(something): Option; } } +// The module's dispatchable functions. decl_module! { /// The module declaration. pub struct Module for enum Call where origin: T::Origin { diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index 9d6c917b15fb8ef51beb682c5170fd926ffaba69..5f46b360e4936adce0981206bb671ffef4585cac 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -78,8 +78,18 @@ name = "asn1_der_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atty" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -109,11 +119,6 @@ dependencies = [ "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base-x" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "base58" version = "0.1.0" @@ -199,6 +204,11 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bumpalo" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byte-tools" version = "0.2.0" @@ -228,6 +238,11 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "c_linked_list" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cc" version = "1.0.31" @@ -435,6 +450,17 @@ name = "data-encoding" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "derive_more" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "digest" version = "0.6.2" @@ -451,11 +477,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -490,17 +511,29 @@ dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "env_logger" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "environmental" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "error-chain" -version = "0.12.0" +name = "erased-serde" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -518,8 +551,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -592,6 +625,11 @@ dependencies = [ "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "generic-array" version = "0.8.3" @@ -609,6 +647,26 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "get_if_addrs" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "get_if_addrs-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hash-db" version = "0.12.2" @@ -708,6 +766,14 @@ name = "httparse" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "humantime" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "idna" version = "0.1.5" @@ -723,7 +789,7 @@ name = "impl-codec" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -754,6 +820,14 @@ name = "itoa" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "js-sys" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "keccak" version = "0.1.0" @@ -794,41 +868,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -839,9 +914,10 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -849,43 +925,41 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -893,7 +967,7 @@ dependencies = [ "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -904,28 +978,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -935,11 +1009,9 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -947,41 +1019,41 @@ dependencies = [ "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -991,14 +1063,16 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1009,41 +1083,42 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1051,7 +1126,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1060,29 +1135,34 @@ dependencies = [ "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1090,26 +1170,39 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1259,37 +1352,36 @@ dependencies = [ [[package]] name = "node-template-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-executive 1.0.0", - "srml-indices 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-executive 2.0.0", + "srml-indices 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-template-runtime-wasm" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "node-template-runtime 1.0.0", + "node-template-runtime 2.0.0", ] [[package]] @@ -1302,6 +1394,15 @@ name = "nohash-hasher" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "nom" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-integer" version = "0.1.39" @@ -1323,6 +1424,11 @@ dependencies = [ "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "numtoa" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "once_cell" version = "0.1.8" @@ -1384,7 +1490,7 @@ source = "git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7 [[package]] name = "parity-codec" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1399,18 +1505,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1516,8 +1623,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1573,8 +1680,8 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1607,7 +1714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quote" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1776,6 +1883,14 @@ name = "redox_syscall" version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "redox_termios" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "regex" version = "1.1.2" @@ -1889,16 +2004,6 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "secp256k1" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "semver" version = "0.9.0" @@ -1912,10 +2017,18 @@ name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "send_wrapper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "serde_derive" @@ -1923,8 +2036,8 @@ version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1986,6 +2099,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "slog" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "slog-async" @@ -2003,6 +2119,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2040,6 +2157,11 @@ dependencies = [ "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sourcefile" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "spin" version = "0.5.0" @@ -2047,280 +2169,265 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-inherents 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-session" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", ] [[package]] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-support-procedural 1.0.0", - "srml-system 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "substrate-inherents 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] @@ -2338,50 +2445,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2402,8 +2465,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2419,127 +2482,125 @@ dependencies = [ [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-trie 1.0.0", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2547,37 +2608,34 @@ dependencies = [ [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "sr-std 2.0.0", "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2585,31 +2643,29 @@ dependencies = [ [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2619,12 +2675,13 @@ dependencies = [ [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2641,11 +2698,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.29" +version = "0.15.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2655,8 +2712,8 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2665,6 +2722,25 @@ name = "take_mut" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "termcolor" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "termion" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "thread_local" version = "0.3.6" @@ -2685,7 +2761,7 @@ dependencies = [ [[package]] name = "tiny-bip39" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2936,7 +3012,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3023,11 +3099,101 @@ name = "vcpkg" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wasm-bindgen" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "wasm-bindgen-webidl" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmi" version = "0.4.3" @@ -3038,6 +3204,27 @@ dependencies = [ "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "web-sys" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "weedle" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi" version = "0.2.8" @@ -3062,11 +3249,28 @@ name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wincolor" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws" version = "0.7.9" @@ -3106,7 +3310,7 @@ dependencies = [ [[package]] name = "yamux" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3135,10 +3339,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" +"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" "checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" @@ -3150,11 +3354,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" +"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +"checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ce8bb087aacff865633f0bd5aeaed910fe2fe55b55f4739527f2e023a2e53d" "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" @@ -3179,15 +3385,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" "checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" +"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" "checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" +"checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" +"checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" @@ -3200,8 +3407,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" +"checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" +"checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" "checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" @@ -3215,35 +3425,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" +"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" +"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5b9cd37b1ca54fa2fd0bbf0486adf2f55f8994f2be9410b65265050b24709b2" -"checksum libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf9c56e6f04cb649fdeb806e963d2da223e3ed17748d9e924fdb836c09f76307" -"checksum libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "debea88a3d5de9fdaf7082bd6d238f2c4c6a0420f14bdf9e1c1083b3e7c69286" -"checksum libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350d0018af3668d954f61ce7311e7d64ab7c40f19a8eb895e4750efe24c3455f" -"checksum libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfbcf36cc58ad5d0252d8ebe9c1a87190693fe2cdbe40fb01d8046779f9a75ad" -"checksum libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82e98435973e958d7dea3f5074d7fca53d0dfce2e1ac6924119a21c2991fe443" -"checksum libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92bb0153418eaf0ea549008d1e22748a956c9c36af9374fbe7189d44607c14be" -"checksum libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc915d0cde68a05d26a0dcb125eddce7dd2a425e97c5172ac300c1ee8716f55a" -"checksum libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "355bb370dd12809792dc020638b280e7aaf8625318018abd311c51affd0a612d" -"checksum libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e86291401f4a83f9fa81c03f8a7ccf0b03ce6aaa40cba058a7ec1026a65a6fe4" -"checksum libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3277f1f7eaadf5cdde6a76fb4afbf24e0eda6e2b04f288f526c6fa2e4293a6e" -"checksum libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4842a7ab54c12459b58b9e59cbeb03e3e1fd393fef48079472856f934352772" -"checksum libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32ba52ee76aaa94af533526ce5a22fbfcc69a560174fccee82f4cdb557411d33" -"checksum libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00f416e1e3d0214bd7df2be2b6be8ef61771d44292b973c9e02bfbbd7f62fe46" -"checksum libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af47af9997d69fc70aa13e6e7cd0d766614ebe74005e69e763221a64d9a0a5ef" -"checksum libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa72d81501aad6998d3b1b964f68f438ef99c3aaf54d921e144e0477fa87568" -"checksum libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbb8d08cb536a964727e77b868a026c6d92993f08e387d49163565575a478d9" +"checksum libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141ab3f96adc87c8cb847b1cf790e0fbce0b03e3dabfdd3b72fe23d36fc005de" +"checksum libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1514593f2aced40b257565cf2edc63b4cc2f06241a2f3e5a4fe275e0c4d55e85" +"checksum libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f6f5543deedf4d89931a74d3897b63be19a62d5cb675efaa4c669a4aa0ab12" +"checksum libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9db88ba58601f4528ef5e5e5414e142b19d5813bdaa685e683ef5a44ed23606b" +"checksum libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "260689f26ab2161a1fde9617c53699f78e4ab25fd77c4b07a25b97fca74c5c6d" +"checksum libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1281e58168ed62cf2e9bfe127908a0ec277cf48cbb3dec5b1a68b58ea6332171" +"checksum libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd8ab542edc493fa7a9f9b7f93dc4ee0b384e1f9e2a3397ce0056ffe30a0ea21" +"checksum libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f009594f78d952c57f452be237650025acd4ef17c5cc8eda4c6466ba196e5688" +"checksum libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ccfb9869daccfb9d3938eda8821146e85105a8c874f14393cdb57543afeceb38" +"checksum libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d3dce2ec4fcb3a2cc748c02d61f7e76486df9c7b09e8ccb4d9f81befce207de" +"checksum libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3b3bb3328d206ad3061e863f179a211fc978d7bce05f90440ed6b8a6a9d17ced" +"checksum libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b23a8ece138f448572c5ff781d62323a954f1f681c303e6553368026764b0ae" +"checksum libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "55918f058f118d72d83f9a976f12e02e54c8616ddfc795c779c4801a5042a44f" +"checksum libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9bff57806e0f71832cc02b5dea1010e5f1a9d16393fd104a4b64e4aaae40d885" +"checksum libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3629f9a667d9f5acb5876df59cf3b547250e340131c47587f9ace7c517f21327" +"checksum libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d65c15f89c0607d4a334664d759e54e847e1856a73ea78e7bb6a75e6f4039010" +"checksum libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dff6c81d0f46261a6327219349753aefd3a92021a1e6102185fa112cfcddca97" +"checksum libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5369165359bea84e7ebe73f37b6240f31f8d924ce6710be3d8e1fa678985c9b8" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" @@ -3261,9 +3474,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" "checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" @@ -3271,9 +3486,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2edd80cdaf3b9c7b7f524299586bb4eae43cc5eb20c7b41aa0cd741200000e38" +"checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61ae6944d4435d41f4d0f12108c5cbb9207cbb14bc8f2b4984c6e930dc9c8e41" +"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" "checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" @@ -3296,7 +3511,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" @@ -3314,6 +3529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" "checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" @@ -3326,9 +3542,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" "checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" "checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" "checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" @@ -3343,26 +3559,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" "checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1825685f977249735d510a242a6727b46efe914bb67e38d30c071b1b72b1d5c2" +"checksum syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)" = "ec52cd796e5f01d0067225a5392e70084acc4c0013fa71d55166d38a8b307836" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" +"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1415431cb2398d84da64173f8473c792808314427d4a6f2f3ea85ae67239fe3" +"checksum tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" "checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" @@ -3383,7 +3598,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" +"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" @@ -3396,15 +3611,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" +"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" +"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" +"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" +"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" +"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" +"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" +"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" "checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" +"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" +"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "302defd1bed8a9a6d43b82f0e5a50510dfdfbbd02c270c93ff9d6f3f5e2dea89" +"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" diff --git a/node-template/runtime/wasm/Cargo.toml b/node-template/runtime/wasm/Cargo.toml index 8b3dcf52ea087151492cb9f23a0a360ae45a16ca..2b89c6e4db807296e0bb58655f0587ccfbb5f34c 100644 --- a/node-template/runtime/wasm/Cargo.toml +++ b/node-template/runtime/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-runtime-wasm" -version = "1.0.0" +version = "2.0.0" authors = ["Anonymous"] edition = "2018" diff --git a/node-template/runtime/wasm/build.sh b/node-template/runtime/wasm/build.sh index 0be6e7a11c75464ce42a8ad0ddb8a7ccd8d630fc..f5761cbb1e77024e899ffb2c3a0dc3247ea1f38a 100755 --- a/node-template/runtime/wasm/build.sh +++ b/node-template/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -$CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release for i in node_template_runtime_wasm do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/node-template/build.sh b/node-template/scripts/build.sh similarity index 81% rename from node-template/build.sh rename to node-template/scripts/build.sh index edbcba835c13c8fed43400cab2e5a24be04a21b2..01d0fee3549461f5f2f36be54fc38dc5c64011f7 100755 --- a/node-template/build.sh +++ b/node-template/scripts/build.sh @@ -2,7 +2,7 @@ set -e -PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null && pwd )" export CARGO_INCREMENTAL=0 diff --git a/node-template/init.sh b/node-template/scripts/init.sh similarity index 100% rename from node-template/init.sh rename to node-template/scripts/init.sh diff --git a/node-template/src/cli.rs b/node-template/src/cli.rs index 258d2194a66c682d2c917bd8855a2ddf075826d4..cd148f3462dce8cac7ffa981d37439967954ba3c 100644 --- a/node-template/src/cli.rs +++ b/node-template/src/cli.rs @@ -17,7 +17,7 @@ pub fn run(args: I, exit: E, version: VersionInfo) -> error::Result<()> { parse_and_execute::( load_spec, &version, "substrate-node", args, exit, - |exit, _custom_args, config| { + |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by {}, 2017, 2018", version.author); @@ -61,8 +61,8 @@ fn run_until_exit( { let (exit_send, exit) = exit_future::signal(); - let executor = runtime.executor(); - informant::start(&service, exit.clone(), executor.clone()); + let informant = informant::build(&service); + runtime.executor().spawn(exit.until(informant).map(|_| ())); let _ = runtime.block_on(e.into_exit()); exit_send.fire(); diff --git a/node-template/src/error.rs b/node-template/src/error.rs deleted file mode 100644 index a8aa94bf3285f928b79468ed5317a28eeaa8b635..0000000000000000000000000000000000000000 --- a/node-template/src/error.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Initialization errors. - -use client; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - } - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } -} diff --git a/node-template/src/main.rs b/node-template/src/main.rs index 7d8c3076c626187ad85c27ef9a72baf6c60e1807..5418453a022cac246e767dbda5c031b9b201836c 100644 --- a/node-template/src/main.rs +++ b/node-template/src/main.rs @@ -9,17 +9,19 @@ mod cli; pub use substrate_cli::{VersionInfo, IntoExit, error}; -fn run() -> cli::error::Result<()> { +fn main() { let version = VersionInfo { name: "Substrate Node", commit: env!("VERGEN_SHA_SHORT"), version: env!("CARGO_PKG_VERSION"), - executable_name: "template-node", + executable_name: "node-template", author: "Anonymous", description: "Template Node", support_url: "support.anonymous.an", }; - cli::run(::std::env::args(), cli::Exit, version) -} -error_chain::quick_main!(run); + if let Err(e) = cli::run(::std::env::args(), cli::Exit, version) { + eprintln!("Error starting the node: {}\n\n{:?}", e, e); + std::process::exit(1) + } +} diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 239f02f33da3fde1741d17f284c9307a3897b477..3725833e3db9ae327f600d8e455f242d3cbf308b 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -10,10 +10,11 @@ use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, + error::{Error as ServiceError}, }; use basic_authorship::ProposerFactory; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; -use substrate_client as client; +use substrate_client::{self as client, LongestChain}; use primitives::{ed25519::Pair, Pair as PairT}; use inherents::InherentDataProviders; use network::construct_simple_protocol; @@ -45,10 +46,18 @@ construct_service_factory! { RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = Executor, - FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, - LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, + FullTransactionPoolApi = transaction_pool::ChainApi< + client::Client, FullExecutor, Block, RuntimeApi>, + Block + > { + |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, + LightTransactionPoolApi = transaction_pool::ChainApi< + client::Client, LightExecutor, Block, RuntimeApi>, + Block + > { + |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, Genesis = GenesisConfig, Configuration = NodeConfig, FullService = FullComponents @@ -65,10 +74,13 @@ construct_service_factory! { inherents_pool: service.inherents_pool(), }); let client = service.client(); + let select_chain = service.select_chain() + .ok_or_else(|| ServiceError::SelectChainRequired)?; executor.spawn(start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client.clone(), + select_chain, client, proposer, service.network(), @@ -86,11 +98,13 @@ construct_service_factory! { FullImportQueue = AuraImportQueue< Self::Block, > - { |config: &mut FactoryFullConfiguration , client: Arc>| { + { |config: &mut FactoryFullConfiguration , client: Arc>, _select_chain: Self::SelectChain| { import_queue::<_, _, _, Pair>( SlotDuration::get_or_compute(&*client)?, client.clone(), None, + None, + None, client, NothingExtra, config.custom.inherent_data_providers.clone(), @@ -105,11 +119,24 @@ construct_service_factory! { SlotDuration::get_or_compute(&*client)?, client.clone(), None, + None, + None, client, NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) } }, + SelectChain = LongestChain, Self::Block> + { |config: &FactoryFullConfiguration, client: Arc>| { + Ok(LongestChain::new( + client.backend().clone(), + client.import_lock() + )) + } + }, + FinalityProofProvider = { |_client: Arc>| { + Ok(None) + }}, } } diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index a26d8f3ae879889ade59c331be4a3080467d33be..38cf49c35f7ba074b21c7740cd3fc6acde887d81 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-cli" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." build = "build.rs" @@ -19,7 +19,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" inherents = { package = "substrate-inherents", path = "../../core/inherents" } node-runtime = { path = "../runtime" } node-primitives = { path = "../primitives" } -hex-literal = "0.1" +hex-literal = "0.2" substrate-basic-authorship = { path = "../../core/basic-authorship" } substrate-service = { path = "../../core/service" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } diff --git a/node/cli/res/emberic-elm.json b/node/cli/res/emberic-elm.json deleted file mode 100644 index 84b537744b2b48d258a08b1c362479736c6211f9..0000000000000000000000000000000000000000 --- a/node/cli/res/emberic-elm.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "name": "Emberic Elm", - "id": "emberic-elm", - "properties": { - "tokenDecimals": 15, - "tokenSymbol": "EAN" - }, - "bootNodes": [ - "/ip4/104.211.54.233/tcp/30333/p2p/QmWxNqJeKEBWjJXeX8s882ZdphuVPgUV43THfGAJn7UBWB", - "/ip4/104.211.48.51/tcp/30333/p2p/QmXd7MQAuXkQK1r3ejSbaXKgjXmT2FvbJ3yNfLZpsQ2t8S", - "/ip4/104.211.48.247/tcp/30333/p2p/QmV2zjgFRfxbgYZQC9qFr4aHsQt7tDBJRAdgqqxqTq1Kta", - "/ip4/40.114.120.164/tcp/30333/p2p/QmQbPCeurXuKhzCw6Ar6ovizNKATMTnkkqFJKgZzbF2MJs" - ], - "telemetryEndpoints": [ - ["wss://telemetry.polkadot.io/submit/", 0] - ], - "protocolId": null, - "consensusEngine": null, - "genesis": { - "raw": { - "0x5ed99fb359fb6799d57fe4ff8cae9d05": "0x00", - "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", - "0x927154b0e6cda82b9a0b44e489a8a9ae": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44", - "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", - "0x0e0cdac0d4de97c54f3ae216b003fa81": "0x5802000000000000", - "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", - "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", - "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", - "0x579ab55d37b1220812be3c3df29d4858": "0x0000000000000000", - "0x9a407c6bb9914a308de7006093089b76": "0x0f0000c16ff286230f0000c16ff2862300", - "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", - "0xb7b6ec0f25eb1ed8b91d05f697d7a874": "0x0c00000000000000", - "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", - "0x3a617574683a03000000": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077", - "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", - "0x90e2849b965314409e8bc00011f3004f": "0x04000000", - "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", - "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x102a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5ceacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19", - "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000", - "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", - "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", - "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", - "0x22bc8c154e4b317f5495a906caaf444e": "0x00", - "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", - "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", - "0x3a6772616e6470613a617574683a6c656e": "0x04000000", - "0xb6d5bfd5d8d92f0f212a8c22535c9214": "0x0000c16ff28623000000000000000000", - "0xeed97a85a4f02a96fae3fc6210ec53f6": "0x0c000001fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e", - "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", - "0xfc2dc4b8bb0b9ca8f01a73a726f7c7f5": "0x00e1000000000000", - "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", - "0xc81a21733684a8047e9d810d78a8b9db": "0x0f0000c16ff286230f0000c16ff2862300", - "0x74d5dca6735bab024bc25136daaab7c0": "0x06", - "0x637414312dac3b280120bf15b4f66cee": "0x00000000", - "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", - "0x37c05deaa240e0691daf4dea41c3b5c3": "0x0c0001fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e0172b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c", - "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", - "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", - "0x23df389ad0a7bab6ab6b2a35f0f02952": "0x0c00012254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e1700", - "0x78152ea7013ebe91392b425506c10074": "0x00", - "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", - "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", - "0xe532791382a63a9bd48f2bc7fba9907d": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed", - "0x93940e78496482b15b64783020bbdfa0": "0x6400000000000000", - "0x7e6064dc0e78ffebb59b3053826a9467": "0x10f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19eacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678", - "0xf29d830d1e349e75cb09cc309ff99cae": "0x00", - "0x59b17352bea17cb7dec6dde697de7db4": "0x6400000000000000", - "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", - "0x717a2ee9c64ad3424e10e4461ec08296": "0x000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000000010010000000", - "0xd7ec675c9803761fed320c891f024816": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x982a35fc0ccb86c71c5868d1ab9a8f24": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077", - "0xd94712e4e93059160b019777f1d514c8": "0xf06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c", - "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", - "0x6049593ee984e2e3142d968450c2499b": "0x0f0000c16ff286230f0000c16ff2862300", - "0x472b8f236d06a2ff7f1e9b2e848ef1d5": "0x0080e03779c311000000000000000000", - "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", - "0x6de9a38a396b5f99e5c455561e72b48e": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495", - "0xdeb7eb5c65480ddd073a5bfafed0754f": "0x60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a07430f0000c16ff286230f0000c16ff2862300", - "0xb12f6ccdb8b9fdf64c98783becc0b82e": "0x72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c0f0000c16ff286230f0000c16ff2862300", - "0x64873b9e6ab89b1f892a7a42d405d8ad": "0xf0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19", - "0x3a617574683a02000000": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44", - "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", - "0x677198f01757ddfcb0e33c9de27bdcce": "0x0c000160779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743012254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17", - "0x730e605a7019f66c4bc5df70178f2bb2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xb8f48a8c01f629d6dc877f64892bed49": "0x0000000000000000", - "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", - "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", - "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", - "0xa62601bb840b2ee9ae90cbc8aefa0d01": "0x60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743", - "0x3a617574683a00000000": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed", - "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", - "0x3a617574683a6c656e": "0x04000000", - "0xde7e6f7637ad906002e911eae3e49f75": "0x0f0000c16ff286230f0000c16ff2862300", - "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", - "0xd543ad6ee4446bf5bcf48867fe340f36": "0xfe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e0f0000c16ff286230f0000c16ff2862300", - "0x2ec6e5652282d579398fb8fdfa531ef6": "0x0000000000000000", - "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", - "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", - "0x7c1f36e9b2a83a7f2b42d97ec0f18d9c": "0x14c224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743", - "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", - "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", - "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", - "0xb5195c66899fef96507f9d63b7bb38d4": "0x0000a0dec5adc9353600000000000000", - "0x50a63a871aced22e88ee6466fe5aa5d9": "0xc224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f", - "0x3a6772616e6470613a617574683a02000000": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f440100000000000000", - "0xd9c94b41dc87728ebf0a966d2e9ad9c0": "0x3200000000000000", - "0xd2f07efec1d302ff1a26581135e0298f": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xeb0e8ce72fcdefef3a57c7f513a8472b": "0x2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e170f0000c16ff286230f0000c16ff2862300", - "0x0a48d3d36ccd781f6e9e46530a158883": "0x0000c16ff28623000000000000000000", - "0xa8faca54f39771f71efa0e9f698ae52e": "0x0000c16ff28623000000000000000000", - "0xea711aaf3497563884c33630127d71ff": "0x0000c16ff28623000000000000000000", - "0x4a8b1a5c7681353a6a320553abbbca49": "0x4038000000000000", - "0x3a6772616e6470613a617574683a03000000": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf0770100000000000000", - "0xbb6e9b5b6b8700aea3b8b4eba8b75803": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x99e2aba8a2b7c8ccba2d740fb86adb0c": "0x00", - "0x3a617574683a01000000": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495", - "0x2efe65fb3e5579a8af5f464dc3da63d8": "0xeacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267", - "0x3a636f6465": "0x0061736d0100000001ba022a60037f7f7f017f60037f7f7f0060047f7f7f7f0060027f7f0060017f0060067f7f7f7f7f7f0060027f7f017f60057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60047f7f7f7f017f60047f7f7e7f017f60077f7f7f7f7f7f7f017f60017e0060017f017f60000060057f7f7f7f7f0060037f7e7f0060087f7f7e7e7f7f7f7f0060087f7f7f7f7f7e7e7f0060087f7f7f7f7f7f7f7f0060057f7f7f7e7e0060047f7f7e7e0060097f7f7f7e7e7f7f7f7f0060047f7f7f7f017e60017f017e60027e7f0060037f7e7e0060057f7e7f7f7e0060037f7f7e0060047f7e7e7e0060027e7e0060027f7e0060067f7f7e7e7e7f0060037e7f7f0060077f7e7e7e7e7e7e0060057f7f7e7e7f0060037e7f7f017f60027f7f017e60057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f0002d3051b03656e760e6578745f626c616b65325f323536000103656e760c6578745f74776f785f313238000103656e76146578745f6765745f73746f726167655f696e746f000703656e760f6578745f7365745f73746f72616765000203656e76166578745f73616e64626f785f6d656d6f72795f6e6577000603656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000403656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000403656e76116578745f636c6561725f73746f72616765000303656e760e6578745f7072696e745f75746638000303656e76126578745f737232353531395f766572696679000a03656e76126578745f656432353531395f766572696679000a03656e76106578745f73746f726167655f726f6f74000403656e76186578745f73746f726167655f6368616e6765735f726f6f74000b03656e76166578745f6b696c6c5f6368696c645f73746f72616765000303656e76166578745f73616e64626f785f6d656d6f72795f676574000a03656e76166578745f73616e64626f785f6d656d6f72795f736574000a03656e760d6578745f7072696e745f686578000303656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e761a6578745f6765745f6368696c645f73746f726167655f696e746f000c03656e76176578745f636c6561725f6368696c645f73746f72616765000203656e76156578745f7365745f6368696c645f73746f72616765000503656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000203656e760d6578745f7072696e745f6e756d000d03656e760a6578745f6d616c6c6f63000e03656e76086578745f66726565000403bd03bb03010104000e030f1001110303060303030304010f120106040313011403030303040415160f041702030304030306030e010101030101100101010303010303030303030303030303000202020202020202020202020202020202020202180e03010f030103040104040404020319060104040d04011a0303031b1c03030d03030e101d031604030303030401031e0303041f20032003030304030303030403030404040303030303030e0303030f01030216030603210322030303030403040f040304231e04031b010404041b04030303160416162403161f01040605020f040304040303030303030303030302060625080601020103030201032626030301060626260f2603010303032626260303032626262626262603262603030303030303040404030404040404040125030303010e0304040403010503030301010404040404040303010604040403011d03030e0402000f030303060303030303040403040303030303030103031603040101040404040404040404040404040404040403030303030303030d01040404040403010306010601030301010401030304030e04000e000f0604000606190a06060600000000272728282904070170019001900105030100120619037f01418080c0000b7f0041f0c0c4000b7f0041f0c0c4000b07be0415066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00960212436f72655f657865637574655f626c6f636b00970215436f72655f696e697469616c697a655f626c6f636b009d0210436f72655f617574686f726974696573009e02114d657461646174615f6d6574616461746100a0021c426c6f636b4275696c6465725f6170706c795f65787472696e73696300a6021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00a70220426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300a8021c426c6f636b4275696c6465725f636865636b5f696e686572656e747300ac0218426c6f636b4275696c6465725f72616e646f6d5f7365656400ad022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00ae02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200af02214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e676500b002204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500b1021e4772616e6470614170695f6772616e6470615f617574686f72697469657300b20215417572614170695f736c6f745f6475726174696f6e00b4021a417574686f7269746965734170695f617574686f72697469657300b502098c02010041010b8f0127b1036465666768696a6b6c6d6e6f707172737475767778ce01f601af038a029b02e3028d0289029c02ca03cb03f402cc03c303ab03d402d802d302d50240f70130d90237ac03fe01e9019d038003ff01bf01be01dc0184028302820281028002c002d202e002830382038103ff02fe028903ea0285038a03d901db018c038d03c502c602c402840185018301e502e602e4028e03e601e801e0018f03db02dc02da029003fb02fd02fa029103bc01bd01bb019203fc01fd01fa019303be02bf02bd029403a903aa03a8039503b801c202c302c1029603de02df02dd029703980399039a039b03d002d102cf029c03a303a203a103a0039f039e03c403c503c603c703c8030ad5c532bb03c404020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421080240024002400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d0340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d022003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a2002101c2003200c2900003703102003200d29000037001720032d0020220e411a470d052006200a41106a220a470d000c040b0b200422012007470d010c020b200141106a22012007460d010b03400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a22012007470d000b0b02402008450d002004101d0b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a280200101d0b200141106a2101200a41106a2007470d000b0b2008450d002004101d200341c0006a24000f0b200341c0006a24000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a28020020042006101e2205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a28020020042006101e2205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd702200728020020042008101e2209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd802200528020020042008101e2206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a28020020042006101e2205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda02200728020020042008101e2209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb02200728020020042008101e2209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc02200728020020042008101e2209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a28020020042006101e2205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde02200728020020042008101e2209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a28020020042006101e2205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de002200528020020042009101e2206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a28020020042006101e2205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de202200728020020062005101e2208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a28020020042006101e2205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de402200728020020042008101e2209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de502200528020020042009101e2206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a28020020042006101e2205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a28020020042006101e2205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a28020020042006101e2205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b28020020042006101e2208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea02200728020020062005101e2208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a28020020042006101e2205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a28020020042006101e2205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a28020020042006101e2205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a28020020042006101e2205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a28020020042006101e2205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df002200728020020062005101e2208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df102200528020020042009101e2206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a28020020042006101e2205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df302200728020020062005101e2208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a28020020042006101e2205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a28020020042006101e2205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a28020020042006101e2205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a28020020042006101e2205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a28020020042006101e2205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a28020020042006101e2205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc02200728020020042008101e2209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a28020020042006101e2205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe02200728020020042008101e2209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a28020020042006101e2205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a28020020042006101e2205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a28020020042006101e2205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a28020020042006101e2205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a28020020042006101e2205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a28020020042006101e2205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a28020020042006101e2205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a28020020042006101e2205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a28020020042006101e2205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a28020020042006101e2205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a28020020042006101e2205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a28020020042006101e2205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a28020020042006101e2205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c03200728020020042008101e2209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d03200728020020042008101e2209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a28020020042006101e2205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a28020020042006101e2205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a28020020042006101e2205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d9103200728020020042008101e2209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d9203200728020020042008101e2209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a28020020042006101e2205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a28020020042006101e2205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a28020020042006101e2205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a28020020042006101e2205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a28020020042006101e2205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a28020020042006101e2205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a28020020042006101e2205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a28020020042006101e2205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b03200728020020042008101e2209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a28020020042006101e2205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a28020020042006101e2205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a28020020042006101e2205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a28020020042006101e2205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a28020020042006101e2205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a28020020042006101e2205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a28020020042006101e2205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da303200528020020042009101e2206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a28020020042006101e2205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a28020020042006101e2205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a28020020042006101e2205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a28020020042006101e2205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a28020020042006101e2205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a28020020042006101e2205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a28020020042006101e2205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab03200728020020062005101e2208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac03200728020020042008101e2209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a28020020042006101e2205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a28020020042006101e2205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a28020020042006101e2205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a28020020042006101e2205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a28020020042006101e2205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a28020020042006101e2205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a28020020042006101e2205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a28020020042006101e2205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a28020020042006101e2205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a28020020042006101e2205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a28020020042006101e2205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a28020020042006101e2205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a28020020042006101e2205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a28020020042006101e2205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a28020020042006101e2205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a28020020042006101e2205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a28020020042006101e2205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a28020020042006101e2205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a28020020042006101e2205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a28020020042006101e2205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a28020020042006101e2205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a28020020042006101e2205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a28020020042006101e2205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a28020020042006101e2205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a28020020042006101e2205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a28020020042006101e2205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a28020020042006101e2205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a28020020042006101e2205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a28020020042006101e2205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca03200728020020042008101e2209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a28020020042008101e2205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc03200528020020042009101e2206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a28020020042006101e2205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a28020020042006101e2205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a28020020042006101e2205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a28020020042006101e2205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a28020020042006101e2205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a28020020042006101e2205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a28020020042006101e2205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a28020020042006101e2205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a28020020042006101e2205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a28020020042006101e2205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a28020020042006101e2205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a28020020042006101e2205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a28020020042006101e2205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a28020020042006101e2205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a28020020042006101e2205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a28020020042006101e2205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a28020020042006101e2205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a28020020042006101e2205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a28020020042006101e2205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de003200728020020042008101e2209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de103200728020020042008101e2209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a28020020042006101e2205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a28020020042006101e2205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a28020020042006101e2205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de503200528020020042009101e2206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a28020020042006101e2205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a28020020042006101e2205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a28020020042006101e2205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de903200728020020042008101e2209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a28020020042006101e2205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a28020020042006101e2205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a28020020042006101e2205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a28020020042006101e2205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a28020020042006101e2205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a28020020042006101e2205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a28020020042006101e2205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a28020020042006101e2205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df203200728020020062005101e2208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a28020020042006101e2205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a28020020042006101e2205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df503200728020020042008101e2209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a28020020042006101e2205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a28020020042006101e2205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df803200728020020042008101e2209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df903200728020020042008101e2209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a28020020042006101e2205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb03200928020020052001101e2206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc03200728020020042008101e2209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a28020020042006101e2205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe03200728020020042008101e2209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff03200728020020062005101e2208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a28020020042006101e2205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d8104200728020020062005101e2208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a28020020042006101e2205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006101f22050db4050b200641011020000b2008101f22090dad050b200841011020000b2008101f22060da9050b200841011020000b2006101f22050da5050b200641011020000b2008101f22090da1050b200841011020000b2008101f22090d9a050b200841011020000b2008101f22090d96050b200841011020000b2006101f22050d92050b200641011020000b2008101f22090d8e050b200841011020000b2006101f22050d8a050b200641011020000b2009101f22060d86050b200941011020000b2006101f22050d82050b200641011020000b2005101f22080dfe040b200541011020000b2006101f22050dfa040b200641011020000b2008101f22090df6040b200841011020000b2009101f22060df2040b200941011020000b2006101f22050dee040b200641011020000b2006101f22050dea040b200641011020000b2006101f22050de6040b200641011020000b2006101f22080de2040b200641011020000b2005101f22080dde040b200541011020000b2006101f22050dda040b200641011020000b2006101f22050dd6040b200641011020000b2006101f22050dd2040b200641011020000b2006101f22050dce040b200641011020000b2006101f22050dca040b200641011020000b2005101f22080dc6040b200541011020000b2009101f22060dc2040b200941011020000b2006101f22050dbe040b200641011020000b2005101f22080dba040b200541011020000b2006101f22050db6040b200641011020000b2006101f22050db2040b200641011020000b2006101f22050dae040b200641011020000b2006101f22050daa040b200641011020000b2006101f22050da6040b200641011020000b2006101f22050da2040b200641011020000b2006101f22050dee040b200641011020000b2008101f22090d9c040b200841011020000b2006101f22050d98040b200641011020000b2008101f22090d94040b200841011020000b2006101f22050d90040b200641011020000b2006101f22050d8c040b200641011020000b2006101f22050d88040b200641011020000b2006101f22050d84040b200641011020000b2006101f22050d80040b200641011020000b2006101f22050dfc030b200641011020000b2006101f22050df8030b200641011020000b2006101f22050df4030b200641011020000b2006101f22050df0030b200641011020000b2006101f22050dec030b200641011020000b2006101f22050de8030b200641011020000b2006101f22050de4030b200641011020000b2006101f22050de0030b200641011020000b2008101f22090ddc030b200841011020000b2008101f22090dd8030b200841011020000b2006101f22050dd4030b200641011020000b2006101f22050dd0030b200641011020000b2006101f22050dcc030b200641011020000b2008101f22090dc8030b200841011020000b2008101f22090dc4030b200841011020000b2006101f22050dc0030b200641011020000b2006101f22050dbc030b200641011020000b2006101f22050db8030b200641011020000b2006101f22050db4030b200641011020000b2006101f22050db0030b200641011020000b2006101f22050dac030b200641011020000b2006101f22050da8030b200641011020000b2006101f22050da4030b200641011020000b2008101f22090da0030b200841011020000b2006101f22050d9c030b200641011020000b2006101f22050d98030b200641011020000b2006101f22050d94030b200641011020000b2006101f22050d90030b200641011020000b2006101f22050d8c030b200641011020000b2006101f22050d88030b200641011020000b2006101f22050d84030b200641011020000b2009101f22060d80030b200941011020000b2006101f22050dfc020b200641011020000b2006101f22050df8020b200641011020000b2006101f22050df4020b200641011020000b2006101f22050df0020b200641011020000b2006101f22050dec020b200641011020000b2006101f22050de8020b200641011020000b2006101f22050de4020b200641011020000b2005101f22080de0020b200541011020000b2008101f22090ddc020b200841011020000b2006101f22050dd8020b200641011020000b2006101f22050dd3020b200641011020000b2006101f22050dcf020b200641011020000b2006101f22050dcb020b200641011020000b2006101f22050dc7020b200641011020000b2006101f22050dc3020b200641011020000b2006101f22050dbf020b200641011020000b2006101f22050dbb020b200641011020000b2006101f22050db7020b200641011020000b2006101f22050db3020b200641011020000b2006101f22050daf020b200641011020000b2006101f22050dab020b200641011020000b2006101f22050da7020b200641011020000b2006101f22050da3020b200641011020000b2006101f22050d9f020b200641011020000b2006101f22050d9b020b200641011020000b2006101f22050d97020b200641011020000b2006101f22050d93020b200641011020000b2006101f22050d8f020b200641011020000b2006101f22050d8b020b200641011020000b2006101f22050d87020b200641011020000b2006101f22050d83020b200641011020000b2006101f22050dff010b200641011020000b2006101f22050dfb010b200641011020000b2006101f22050df7010b200641011020000b2006101f22050df3010b200641011020000b2006101f22050def010b200641011020000b2006101f22050deb010b200641011020000b2006101f22050de7010b200641011020000b2008101f22090de3010b200841011020000b2008101f22050ddf010b200841011020000b2009101f22060ddb010b200941011020000b2006101f22050dd7010b200641011020000b2006101f22050dd3010b200641011020000b2006101f22050dcf010b200641011020000b2006101f22050dcb010b200641011020000b2006101f22050dc7010b200641011020000b2006101f22050dc3010b200641011020000b2006101f22050dbf010b200641011020000b2006101f22050dbb010b200641011020000b2006101f22050db7010b200641011020000b2006101f22050db3010b200641011020000b2006101f22050daf010b200641011020000b2006101f22050dab010b200641011020000b2006101f22050da7010b200641011020000b2006101f22050da3010b200641011020000b2006101f22050d9f010b200641011020000b2006101f22050d9b010b200641011020000b2006101f22050d97010b200641011020000b2006101f22050d93010b200641011020000b2006101f22050d8f010b200641011020000b2008101f22090d8b010b200841011020000b2008101f22090d87010b200841011020000b2006101f22050d83010b200641011020000b2006101f22050d7f0b200641011020000b2006101f22050d7b0b200641011020000b2009101f22060d770b200941011020000b2006101f22050d730b200641011020000b2006101f22050d6f0b200641011020000b2006101f22050d6b0b200641011020000b2008101f22090d670b200841011020000b2006101f22050d630b200641011020000b2006101f22050d5f0b200641011020000b2006101f22050d5b0b200641011020000b2006101f22050d570b200641011020000b2006101f22050d530b200641011020000b2006101f22050d4f0b200641011020000b2006101f22050d4b0b200641011020000b2006101f22050d470b200641011020000b2005101f22080d430b200541011020000b2006101f22050d3f0b200641011020000b2006101f22050d3b0b200641011020000b2008101f22090d370b200841011020000b2006101f22050d330b200641011020000b2006101f22050d2f0b200641011020000b2008101f22090d2b0b200841011020000b2008101f22090d270b200841011020000b2006101f22050d230b200641011020000b2001101f22060d1f0b200141011020000b2008101f22090d1b0b200841011020000b2006101f22050d170b200641011020000b2008101f22090d130b200841011020000b2005101f22080d0f0b200541011020000b2006101f22050d0b0b200641011020000b2005101f22080d070b200541011020000b2006101f22050d030b200641011020000b1021000b1021000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011020000b200941011020000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210220240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008101e22050d020c060b200928020021050c020b2008101f2205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d101d0b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d101d200341106a24000f0b200841011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102320032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102420032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a280200101d200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011020000b200941011020000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011020000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007101e22080d020c050b200b28020021080c020b2007101f2208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b28020020042006101e2205450d020c040b200b28020021050c040b2006101f22050d020b200641011020000b200741011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009101e22060d020c070b200728020021060c020b2009101f2206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1021000b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009101e22050d020c070b200728020021050c020b2009101f2205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1021000b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200341106a24000b0700200010be030b0b0020002001200210bf030b0700200010bd030b0e0041ddafc200412210bc0300000b0a0041f8b0c400102c000bce0301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a101e22090d020c070b200728020021090c020b200a101f2209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a21060340200241046a210a2002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d0720084101742202200920092002491b22024100480d072008450d01200441046a28020020082002101e22090d020c080b200441046a28020021090c020b2002101f2209450d060b20062002360200200441046a2009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200a2102200a2003470d000b0b2000411a3a00000f0b1021000b200241011020000b200a41011020000be30301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b02402005417f470d0020030d010b2002410c6a2104200241086a2106200241046a21070340200521030240024002400240200628020020042802002205470d00200541016a22082005490d0620054101742209200820082009491b22094100480d062005450d01200728020020052009101e22080d020c070b200728020021080c020b2009101f2208450d050b2006200936020020072008360200200428020021050b2004200541016a360200200820056a200141807f723a0000200341c00071210802400240200341077522050d002008450d010b200321012005417f470d01200321012008450d010b0b200341ff007121040b024002400240200241086a2802002002410c6a2802002205470d00200541016a22032005490d0320054101742201200320032001491b22014100480d032005450d01200241046a28020020052001101e2203450d020c050b200241046a28020021030c050b2001101f22030d030b200141011020000b1021000b200941011020000b200241086a2001360200200241046a20033602002002410c6a28020021050b2002410c6a200541016a360200200320056a20043a00002000411a3a00000be60301047f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b02402001427f520d0020040d010b03400240024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d0620044101742206200520052006491b22064100480d062004450d01200241046a28020020042006101e22050d020c070b200241046a28020021050c020b2006101f2205450d050b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200341807f723a00002001a7220341c00071210402400240200142078722014200520d002004450d010b2001427f520d012004450d010b0b200341ff007121050b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a28020020042006101e2203450d020c050b200241046a28020021030c050b2006101f22030d030b200641011020000b1021000b200641011020000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bd403020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a2001102620022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b101e22090d010c050b200b101f2209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a280200101d0b200741106a2107200641706a22060d000b0b02402008450d002009101d0b200241306a24000f0b1021000b200b41081020000bc4bd0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10282002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a2001102941042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de8022004101f2209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241186a200241c8006a1028200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10284105210b0c9a020b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f2005102a000b20052003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b1021000b20052001102a000b20012003102b000b417f2009102a000b20092003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2009102a000b20092003102b000b417f2009102a000b20092003102b000b20052001102a000b20012003102b000b200441041020000b417f2001102a000b20012003102b000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b2003101d0b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a280200101d0b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205101e22090d01200541041020000b4100210d02402007450d002009101d0b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d062009101d200241e0006a24000f0b417f2004102a000b20042006102b000b41b8cfc200102c000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000b6b000240024020002d000022004101460d0020004102470d01200128021841f1aac200410b2001411c6a28020028020c1100000f0b200128021841e4aac200410d2001411c6a28020028020c1100000f0b200128021841d8aac200410c2001411c6a28020028020c1100000b800301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006101f22050d01200641011020000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41a0b1c400200241186a10c1030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10c203000b4190b1c40041004100104b000b102e000bbb07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b4102742008101e220c0d010c110b2008101f220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241013602142002420137022c20024190afc40036022820022002410f6a3602102002200241106a360238200241186a200241286a1028410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241013602142002420137022c20024190afc400360228200220023602102002200241106a360238200241186a200241286a102820022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f2009102a000b20092007102b000b417f2009102a000b20092005102b000b1021000b200841041020000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c101d200241c0006a24000f0b200241c0006a24000b7001017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c20024198b2c4003602082002200241046a360228200220023602202002200241206a360218200241086a41a8b2c40010cf01000b7001017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241f8b1c4003602082002200241046a360228200220023602202002200241206a360218200241086a4188b2c40010cf01000b6902017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141f8b3c200360210200142013702042001200141186a36020020012003370328200120023703202001200141206a10cf01000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a28020020042006101e2205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a28020020042006101e2205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd702200728020020042008101e2209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd802200528020020042008101e2206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a28020020042006101e2205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda02200728020020042008101e2209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb02200728020020042008101e2209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc02200728020020042008101e2209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a28020020042006101e2205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde02200728020020042008101e2209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a28020020042006101e2205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de002200528020020042009101e2206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a28020020042006101e2205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de202200728020020062005101e2208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a28020020042006101e2205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de402200728020020042008101e2209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de502200528020020042009101e2206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a28020020042006101e2205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a28020020042006101e2205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a28020020042006101e2205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b28020020042006101e2208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea02200728020020062005101e2208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a28020020042006101e2205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a28020020042006101e2205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a28020020042006101e2205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a28020020042006101e2205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a28020020042006101e2205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df002200728020020062005101e2208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df102200528020020042009101e2206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a28020020042006101e2205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df302200728020020062005101e2208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a28020020042006101e2205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a28020020042006101e2205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a28020020042006101e2205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a28020020042006101e2205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a28020020042006101e2205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a28020020042006101e2205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc02200728020020042008101e2209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a28020020042006101e2205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe02200728020020042008101e2209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a28020020042006101e2205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a28020020042006101e2205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a28020020042006101e2205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a28020020042006101e2205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a28020020042006101e2205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a28020020042006101e2205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a28020020042006101e2205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a28020020042006101e2205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a28020020042006101e2205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a28020020042006101e2205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a28020020042006101e2205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a28020020042006101e2205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a28020020042006101e2205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c03200728020020042008101e2209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d03200728020020042008101e2209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a28020020042006101e2205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a28020020042006101e2205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a28020020042006101e2205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d9103200728020020042008101e2209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d9203200728020020042008101e2209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a28020020042006101e2205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a28020020042006101e2205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a28020020042006101e2205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a28020020042006101e2205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a28020020042006101e2205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a28020020042006101e2205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a28020020042006101e2205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a28020020042006101e2205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b03200728020020042008101e2209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a28020020042006101e2205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a28020020042006101e2205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a28020020042006101e2205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a28020020042006101e2205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a28020020042006101e2205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a28020020042006101e2205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a28020020042006101e2205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da303200528020020042009101e2206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a28020020042006101e2205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a28020020042006101e2205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a28020020042006101e2205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a28020020042006101e2205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a28020020042006101e2205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a28020020042006101e2205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a28020020042006101e2205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab03200728020020062005101e2208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac03200728020020042008101e2209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a28020020042006101e2205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a28020020042006101e2205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a28020020042006101e2205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a28020020042006101e2205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a28020020042006101e2205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a28020020042006101e2205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a28020020042006101e2205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a28020020042006101e2205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a28020020042006101e2205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a28020020042006101e2205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a28020020042006101e2205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a28020020042006101e2205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a28020020042006101e2205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a28020020042006101e2205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a28020020042006101e2205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a28020020042006101e2205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a28020020042006101e2205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a28020020042006101e2205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a28020020042006101e2205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a28020020042006101e2205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a28020020042006101e2205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a28020020042006101e2205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a28020020042006101e2205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a28020020042006101e2205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a28020020042006101e2205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a28020020042006101e2205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a28020020042006101e2205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a28020020042006101e2205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a28020020042006101e2205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca03200728020020042008101e2209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a28020020042008101e2205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc03200528020020042009101e2206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a28020020042006101e2205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a28020020042006101e2205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a28020020042006101e2205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a28020020042006101e2205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a28020020042006101e2205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a28020020042006101e2205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a28020020042006101e2205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a28020020042006101e2205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a28020020042006101e2205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a28020020042006101e2205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a28020020042006101e2205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a28020020042006101e2205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a28020020042006101e2205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a28020020042006101e2205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a28020020042006101e2205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a28020020042006101e2205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a28020020042006101e2205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a28020020042006101e2205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a28020020042006101e2205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de003200728020020042008101e2209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de103200728020020042008101e2209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a28020020042006101e2205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a28020020042006101e2205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a28020020042006101e2205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de503200528020020042009101e2206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a28020020042006101e2205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a28020020042006101e2205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a28020020042006101e2205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de903200728020020042008101e2209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a28020020042006101e2205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a28020020042006101e2205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a28020020042006101e2205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a28020020042006101e2205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a28020020042006101e2205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a28020020042006101e2205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a28020020042006101e2205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a28020020042006101e2205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df203200728020020062005101e2208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a28020020042006101e2205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a28020020042006101e2205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df503200728020020042008101e2209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a28020020042006101e2205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a28020020042006101e2205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df803200728020020042008101e2209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df903200728020020042008101e2209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a28020020042006101e2205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb03200928020020052001101e2206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc03200728020020042008101e2209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a28020020042006101e2205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe03200728020020042008101e2209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff03200728020020062005101e2208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a28020020042006101e2205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d8104200728020020062005101e2208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a28020020042006101e2205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006101f22050db4050b200641011020000b2008101f22090dad050b200841011020000b2008101f22060da9050b200841011020000b2006101f22050da5050b200641011020000b2008101f22090da1050b200841011020000b2008101f22090d9a050b200841011020000b2008101f22090d96050b200841011020000b2006101f22050d92050b200641011020000b2008101f22090d8e050b200841011020000b2006101f22050d8a050b200641011020000b2009101f22060d86050b200941011020000b2006101f22050d82050b200641011020000b2005101f22080dfe040b200541011020000b2006101f22050dfa040b200641011020000b2008101f22090df6040b200841011020000b2009101f22060df2040b200941011020000b2006101f22050dee040b200641011020000b2006101f22050dea040b200641011020000b2006101f22050de6040b200641011020000b2006101f22080de2040b200641011020000b2005101f22080dde040b200541011020000b2006101f22050dda040b200641011020000b2006101f22050dd6040b200641011020000b2006101f22050dd2040b200641011020000b2006101f22050dce040b200641011020000b2006101f22050dca040b200641011020000b2005101f22080dc6040b200541011020000b2009101f22060dc2040b200941011020000b2006101f22050dbe040b200641011020000b2005101f22080dba040b200541011020000b2006101f22050db6040b200641011020000b2006101f22050db2040b200641011020000b2006101f22050dae040b200641011020000b2006101f22050daa040b200641011020000b2006101f22050da6040b200641011020000b2006101f22050da2040b200641011020000b2006101f22050dee040b200641011020000b2008101f22090d9c040b200841011020000b2006101f22050d98040b200641011020000b2008101f22090d94040b200841011020000b2006101f22050d90040b200641011020000b2006101f22050d8c040b200641011020000b2006101f22050d88040b200641011020000b2006101f22050d84040b200641011020000b2006101f22050d80040b200641011020000b2006101f22050dfc030b200641011020000b2006101f22050df8030b200641011020000b2006101f22050df4030b200641011020000b2006101f22050df0030b200641011020000b2006101f22050dec030b200641011020000b2006101f22050de8030b200641011020000b2006101f22050de4030b200641011020000b2006101f22050de0030b200641011020000b2008101f22090ddc030b200841011020000b2008101f22090dd8030b200841011020000b2006101f22050dd4030b200641011020000b2006101f22050dd0030b200641011020000b2006101f22050dcc030b200641011020000b2008101f22090dc8030b200841011020000b2008101f22090dc4030b200841011020000b2006101f22050dc0030b200641011020000b2006101f22050dbc030b200641011020000b2006101f22050db8030b200641011020000b2006101f22050db4030b200641011020000b2006101f22050db0030b200641011020000b2006101f22050dac030b200641011020000b2006101f22050da8030b200641011020000b2006101f22050da4030b200641011020000b2008101f22090da0030b200841011020000b2006101f22050d9c030b200641011020000b2006101f22050d98030b200641011020000b2006101f22050d94030b200641011020000b2006101f22050d90030b200641011020000b2006101f22050d8c030b200641011020000b2006101f22050d88030b200641011020000b2006101f22050d84030b200641011020000b2009101f22060d80030b200941011020000b2006101f22050dfc020b200641011020000b2006101f22050df8020b200641011020000b2006101f22050df4020b200641011020000b2006101f22050df0020b200641011020000b2006101f22050dec020b200641011020000b2006101f22050de8020b200641011020000b2006101f22050de4020b200641011020000b2005101f22080de0020b200541011020000b2008101f22090ddc020b200841011020000b2006101f22050dd8020b200641011020000b2006101f22050dd3020b200641011020000b2006101f22050dcf020b200641011020000b2006101f22050dcb020b200641011020000b2006101f22050dc7020b200641011020000b2006101f22050dc3020b200641011020000b2006101f22050dbf020b200641011020000b2006101f22050dbb020b200641011020000b2006101f22050db7020b200641011020000b2006101f22050db3020b200641011020000b2006101f22050daf020b200641011020000b2006101f22050dab020b200641011020000b2006101f22050da7020b200641011020000b2006101f22050da3020b200641011020000b2006101f22050d9f020b200641011020000b2006101f22050d9b020b200641011020000b2006101f22050d97020b200641011020000b2006101f22050d93020b200641011020000b2006101f22050d8f020b200641011020000b2006101f22050d8b020b200641011020000b2006101f22050d87020b200641011020000b2006101f22050d83020b200641011020000b2006101f22050dff010b200641011020000b2006101f22050dfb010b200641011020000b2006101f22050df7010b200641011020000b2006101f22050df3010b200641011020000b2006101f22050def010b200641011020000b2006101f22050deb010b200641011020000b2006101f22050de7010b200641011020000b2008101f22090de3010b200841011020000b2008101f22050ddf010b200841011020000b2009101f22060ddb010b200941011020000b2006101f22050dd7010b200641011020000b2006101f22050dd3010b200641011020000b2006101f22050dcf010b200641011020000b2006101f22050dcb010b200641011020000b2006101f22050dc7010b200641011020000b2006101f22050dc3010b200641011020000b2006101f22050dbf010b200641011020000b2006101f22050dbb010b200641011020000b2006101f22050db7010b200641011020000b2006101f22050db3010b200641011020000b2006101f22050daf010b200641011020000b2006101f22050dab010b200641011020000b2006101f22050da7010b200641011020000b2006101f22050da3010b200641011020000b2006101f22050d9f010b200641011020000b2006101f22050d9b010b200641011020000b2006101f22050d97010b200641011020000b2006101f22050d93010b200641011020000b2006101f22050d8f010b200641011020000b2008101f22090d8b010b200841011020000b2008101f22090d87010b200841011020000b2006101f22050d83010b200641011020000b2006101f22050d7f0b200641011020000b2006101f22050d7b0b200641011020000b2009101f22060d770b200941011020000b2006101f22050d730b200641011020000b2006101f22050d6f0b200641011020000b2006101f22050d6b0b200641011020000b2008101f22090d670b200841011020000b2006101f22050d630b200641011020000b2006101f22050d5f0b200641011020000b2006101f22050d5b0b200641011020000b2006101f22050d570b200641011020000b2006101f22050d530b200641011020000b2006101f22050d4f0b200641011020000b2006101f22050d4b0b200641011020000b2006101f22050d470b200641011020000b2005101f22080d430b200541011020000b2006101f22050d3f0b200641011020000b2006101f22050d3b0b200641011020000b2008101f22090d370b200841011020000b2006101f22050d330b200641011020000b2006101f22050d2f0b200641011020000b2008101f22090d2b0b200841011020000b2008101f22090d270b200841011020000b2006101f22050d230b200641011020000b2001101f22060d1f0b200141011020000b2008101f22090d1b0b200841011020000b2006101f22050d170b200641011020000b2008101f22090d130b200841011020000b2005101f22080d0f0b200541011020000b2006101f22050d0b0b200641011020000b2005101f22080d070b200541011020000b2006101f22050d030b200641011020000b1021000b1021000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011020000b200941011020000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210220240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008101e22050d020c060b200928020021050c020b2008101f2205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d101d0b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d101d200341106a24000f0b200841011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102320032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102420032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a280200101d200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011020000b200941011020000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011020000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007101e22080d020c050b200b28020021080c020b2007101f2208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b28020020042006101e2205450d020c040b200b28020021050c040b2006101f22050d020b200641011020000b200741011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009101e22060d020c070b200728020021060c020b2009101f2206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1021000b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009101e22050d020c070b200728020021050c020b2009101f2205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1021000b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200341106a24000b05001021000b912503027f027e087f230041d00b6b2208240002402001280224200128024022092802a001470d00200041013a0000200041086a4124360200200041046a419e81c000360200200841d00b6a24000f0b200442002004290308220a20094198016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a41c281c000360200200841d00b6a24000f0b200841d8026a41186a22094200370300200841d8026a41106a220c4200370300200841d8026a41086a220d4200370300200842003703d80220062007200841d8026a1000200841f8006a41186a2009290300370300200841f8006a41106a200c290300370300200841f8006a41086a200d290300370300200820082903d8023703780240024002400240024002404120101f2209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c000101e2209450d0120092008290378370020200941386a200841f8006a41186a290300370000200941306a200841f8006a41106a290300370000200941286a200841f8006a41086a290300370000200941c000418001101e2209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841d8026a41186a220c4200370300200841d8026a41106a220d4200370300200841d8026a41086a220f4200370300200842003703d802200941e000200841d8026a1000200841086a41186a200c290300370300200841086a41106a200d290300370300200841086a41086a200f290300370300200820082903d8023703082009101d200841d8026a2001410c6a2210200841086a1030024020082d00d8024101470d00200041013a0000200041086a4117360200200041046a41ec81c000360200200841d00b6a24000f0b2008413c6a4184d0c200360200200841286a41086a2209420037030020082010360238200841f0c0c10036022c2008410036022820084188026a41186a200541186a29000037030020084188026a41106a200541106a29000037030020084188026a41086a200541086a2900003703002008200529000037038802417f210c2008417f360228200841f8006a41186a200841086a41186a290300370300200841f8006a41106a200841086a41106a290300370300200841f8006a41086a200841086a41086a29030037030020082008290308370378418009101f220f450d03200841286a4104722111200f41003b0106200f4100360200200f41086a200841d8026a41f80810ce031a200941003602002008200f36022c200f2f010622124105742113410021090240024002400240034020132009460d01200841f8006a200f20096a41086a412010d003220d450d03200941206a2109200c41016a210c200d41004e0d000c020b0b2012210c0b200841a8026a41186a200841f8006a41186a290300370300200841a8026a41106a200841f8006a41106a290300370300200841a8026a41086a200841f8006a41086a290300370300200820082903783703a802200841346a21094100450d010c060b200c41016a210c200841346a210941010d050b200841f8006a411c6a200841a8026a41086a2903003702002008419c016a200841a8026a41106a290300370200200841a4016a200841a8026a41186a29030037020020082009360288012008200c3602840120082011360280012008200f36027c20084100360278200820082903a80237028c01200841d8026a411c6a4200370200200841d8026a41106a200841c8026a41086a290300370300200841fd026a200829004037000020084185036a200841c0006a41086a2900003700002008418d036a200841c0006a41106a29000037000020084195036a200841c0006a41186a2900003700002008419c036a200841df006a280000360000200842003703d802200841023a00fc02200841f0c0c1003602f002200820082903c8023703e002200841f8006a200841d8026a103121090c050b412041011020000b41c00041011020000b41800141011020000b41800941081020000b200841f0026a4200370300200841ec026a41f0c0c100360200200841003602f802200841003602e802200842003703e002200841f0c0c1003602dc02200841003602d802200f200c41c8006c6a41e8026a2109200841d8026a10320b200941013a0024200941256a2008290388023700002009412d6a20084188026a41086a290300370000200941356a20084188026a41106a2903003700002009413d6a20084188026a41186a2903003700002008200828022841016a360228200841a8026a41106a2209200841286a41106a290300370300200841a8026a41086a220c200841286a41086a290300370300200820082903283703a802200841f8006a41186a220d200841086a41186a290300370300200841f8006a41106a220f200841086a41106a290300370300200841f8006a41086a2213200841086a41086a29030037030020082008290308370378200841c0006a200841f8006a103320082802482111200829024c210b200841ac036a2013290300370200200841b4036a200f290300370200200841bc036a200d290300370200200841ec026a200c290300370200200841f4026a20092903003702002008200b3702dc02200820113602d802200820082903783702a403200820082903a8023702e402200141246a2802002109200141c0006a290200210b2001280248210c20084190036a420037030020084188036a428080808080013703002008200c3602a0032008200b3703980320084208370380032008200941016a3602fc02200820044101200e200841086a20022003200841d8026a103402400240024020082802002209450d0020082802042101200041013a0000200041086a2001360200200041046a200936020020082802d80222090d010c020b200841f8006a2005200141c8006a28020028020010350240024020082802784101470d00200041046a200829027c370200200041013a00000c010b200841a8026a41186a220920084194016a280200360200200841a8026a41106a220c2008418c016a290200370300200841a8026a41086a220d20084184016a2902003703002008200829027c3703a802200841c0006a41106a200d290300370300200841c0006a41186a200c290300370300200841e0006a2009280200360200200841063602442008419289c000360240200820082903a802370348200141c4006a280200210c200841d8016a41186a200141e4006a290000370300200841d8016a41106a200141dc006a290000370300200841d8016a41086a200141d4006a2900003703002008200129004c3703d801200841c8026a41086a22094200370300200842003703c802418390c100410d200841c8026a1001200841f8016a41086a220d2009290300370300200820082903c8023703f8014200210b02400240024002400240200841f8016a411041f8b3c200410041001002417f460d00200842003703a802200841f8016a4110200841a8026a41084100100241016a41084d0d0120082903a802210b0b20094200370300200842003703c80241fbb8c0004111200841c8026a1001200d2009290300370300200820082903c8023703f80102400240200841f8016a411041f8b3c200410041001002417f460d00200841c0026a4200370300200841a8026a41106a4200370300200841b0026a4200370300200842003703a802200841f8016a4110200841a8026a4120410010022209417f460d032009411f4d0d0320084188026a41186a200841a8026a41186a29030037030020084188026a41106a200841a8026a41106a29030037030020084188026a41086a200841a8026a41086a290300370300200820082903a802370388020c010b200841a0026a420037030020084198026a420037030020084190026a420037030020084200370388020b2008419c016a200841d8016a41086a290300370200200841a4016a200841d8016a41106a290300370200200841ac016a200841d8016a41186a290300370200200841bc016a20084188026a41086a290300370200200841c4016a20084188026a41106a290300370200200841cc016a20084188026a41186a29030037020020082002370378200820082903d801370294012008200b3703880120082008290388023702b40120082003370380012008200841d8026a36029001200841003602b002200842013703a802200841e8006a200c200841c0006a200841f8006a20062007200841a8026a2004103602400240200828026822094101460d0020094102470d01200041046a200829026c370200200041013a0000200841d8006a280200450d06200841d4006a280200101d20082802d80222090d070c080b200841e8006a41086a280200450d00200828026c101d0b200841f8006a41186a200141cc006a220941186a290000370300200841f8006a41106a200941106a290000370300200841f8006a41086a200941086a290000370300200841a8026a41086a200841086a41086a290300370300200841a8026a41106a200841086a41106a290300370300200841a8026a41186a200841086a41186a29030037030020082009290000370378200820082903083703a802024002400240024020084188036a280200220920084184036a280200470d00200941016a220c2009490d062009410174220d200c200c200d491b220dad42d8007e220b422088a70d06200ba722054100480d062009450d0120084180036a280200200941d8006c2005101e220c0d020c070b20084180036a280200210c0c020b2005101f220c450d050b20084184036a200d36020020084180036a200c36020020084188036a28020021090b200c200941d8006c6a22092008290378370001200941013a0000200920082903a8023700212009200829008802370041200941096a200841f8006a41086a220c290300370000200941116a200841f8006a41106a290300370000200941196a200841f8006a41186a290300370000200941296a200841a8026a41086a220d290300370000200941316a200841a8026a41106a290300370000200941396a200841a8026a41186a290300370000200941d0006a20084197026a290000370000200941c9006a20084188026a41086a29000037000020084188036a2209200928020041016a2205360200200c200841e4026a220941086a290200370300200d20084184016a280200360200200820092902003703782008200829027c3703a80220084194036a280200210d20084190036a280200210f2008418c036a280200210920084184036a280200210420084180036a280200210c0240200841c0006a41186a280200450d00200841d4006a280200101d0b024020082802d8022213450d0020082802dc02450d002013101d0b200841f8006a41086a2213200841a8026a41086a280200360200200820082903a802370378200841d8026a41086a2013280200360200200820082903783703d8022010200841d8026a10372008200c200541d8006c6a3602e4022008200c3602e002200820043602dc022008200c3602d802200141286a200841d8026a103820082009200d4107746a3602e402200820093602e0022008200f3602dc02200820093602d802200141346a200841d8026a1039200041003a0000200041196a200841206a290300370000200041116a200841186a290300370000200041096a200841086a41086a29030037000020002008290308370001200841d00b6a24000f0b41df88c0004133103a000b41df88c0004133103a000b1021000b200541081020000b20082802d8022209450d010b20082802dc02450d002009101d0b200841d8026a41186a280200210d200841e8026a280200210902400240200841d8026a41146a2802002200450d002000210c2009210103402001280280092101200c417f6a220c0d000b0340200920092f01064102746a4180096a28020021092000417f6a22000d000c020b0b200921010b20084194016a20092f0106360200200841f8006a41186a4100360200200841f8006a41146a20093602002008200d36029801200841003602880120084200370380012008200136027c20084100360278200841f8006a103b024020084188036a2802002201450d00200841d8026a41286a2802002109200141d8006c21010340024020092d00004105490d00200941286a280200450d00200941246a280200101d0b200941d8006a2109200141a87f6a22010d000b0b024020084184036a280200450d0020084180036a280200101d0b024020084194036a2802002209450d00200941077421012008418c036a28020041206a210903402009103c20094180016a2109200141807f6a22010d000b0b024020084190036a280200450d002008418c036a280200101d0b200841d00b6a24000bec0301097f230041c0006b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a280200210602400240024003402004280200220841086a210920082f0106220741057421044100210a0240024003402004450d0120022009412010d003220b450d02200441606a2104200a41016a210a200941206a2109200b417f4a0d000b200a417f6a21070b2006450d022006417f6a2106200820074102746a4180096a21040c010b0b2008200a41c8006c6a41e8026a2204450d0020042d002422094102470d010b200020012802102002200141146a280200280210110100200128020021050c010b4100210a024020094101470d00200341386a2004413d6a290000370300200341306a200441356a290000370300200341286a2004412d6a2900003703002003200441256a2900003703204101210a0b200341186a2204200341206a41186a290300370300200341106a2209200341206a41106a290300370300200341086a220b200341206a41086a290300370300200320032903203703002000200a3a000020002003290300370001200041096a200b290300370000200041116a2009290300370000200041196a20042903003700000b20012005417f6a360200200341c0006a24000f0b103f000bd31801187f230041d00c6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241186a41186a22062000412c6a290000370300200241186a41106a2207200041246a290000370300200241186a41086a22082000411c6a29000037030020022000290014370318200241e8016a200141c80010ce031a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b41057410cf031a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903183700002003200441c8006c6a220041b0036a200041e8026a2200200341066a22032f010020046b41c8006c10cf031a2000200241e8016a41c80010ce032100200320032f010041016a3b0100200241d00c6a240020000f0b024002400240418009101f220a450d00200a41003b0106200a4100360200200a41086a200241a8036a41f80810ce0321012002200341ca016a2d00003a00da02200220032f00c8013b01d802200220032900db013703c8022002200341e0016a2900003700cd02200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e200241a8036a20034198066a41c80010ce031a2001200341e8016a200341066a22062f010041796a220041057410ce032101200a41e8026a200341e0066a200041c8006c10ce032107200641063b0100200a20003b0106200220022d00da023a00c602200220022f01d8023b01c402200220022903c8023703b002200220022900cd023700b502200241e0026a200241a8036a41c80010ce031a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b41057410cf031a200141186a200241186a41186a290300370000200141106a200241186a41106a290300370000200141086a200241186a41086a29030037000020012002290318370000200341e8026a200441c8006c6a220f41c8006a200f20002f010020046b41c8006c10cf031a200f200241e8016a41c80010ce031a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b41057410cf031a200141186a200241186a41186a290300370000200141106a200241186a41106a290300370000200141086a200241186a41086a290300370000200120022903183700002007200441c8006c6a220041d07c6a200041887c6a220f200a41066a22002f010020066b41c8006c10cf031a200f200241e8016a41c80010ce031a0b200241d0016a41026a220420022d00c6023a0000200020002f010041016a3b0100200220022f01c4023b01d001200220022903b002370360200220022900b502370065200241f0006a200241e0026a41c80010ce031a200241146a41026a221020042d00003a0000200220022f01d0013b01142002200229036037030020022002290065370005200241186a200241f0006a41c80010ce031a02400240024020032802002207450d0020032f010421110340200241e4016a41026a221620102d00003a0000200220022f01143b01e401200220022903003703d001200220022900053700d501200241e8016a200241186a41c80010ce031a201141ffff0371210620072f01062203410a4d0d0241b009101f2201450d03200141003b010620014100360200200141086a200241a8036a41a80910ce0321002002200741ca016a2d00003a00da02200220072f00c8013b01d802200220072900db013703c8022002200741e0016a2900003700cd02200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a2800002113200241a8036a20074198066a41c80010ce031a2000200741e8016a200741066a22092f0100220441796a220341057410ce032117200141e8026a200741e0066a200341c8006c10ce03211820014180096a2007419c096a2004417a6a220841027410ce032119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241e0026a200241a8036a41c80010ce031a200220022d00da023a00c602200220022f01d8023b01c402200220022903c8023703b002200220022900cd023700b502200241dc026a41026a220820022d00c6023a0000200220022f01c4023b01dc02200220022903b002370360200220022900b502370065200241a8036a200241e0026a41c80010ce031a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b221941057410cf031a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f01e4013b0000200320022903d001370013200341186a20022900d501370000200741e8026a200641c8006c6a220341c8006a2003201941c8006c10cf031a2003200241e8016a41c80010ce031a2009201141016a22033b010020074180096a2211200641027422196a41086a201120044102746a2211200341ffff037120046b41027410cf031a2011200a360200200020092f010022044f0d01200720196a4184096a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b41057410cf031a200041186a20022900d5013700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f01e4013b0000200020022903d0013700132018200641c8006c6a220041d07c6a200041887c6a220020092f010020036b41c8006c10cf031a2000200241e8016a41c80010ce031a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b41027410cf031a2009200a360200200420064b0d00200120116a41e8086a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b200241cc016a41026a220320082d00003a0000200220022f01dc023b01cc01200220022903603703b801200220022900653700bd01200241f0006a200241a8036a41c80010ce031a201020032d00003a0000200220022f01cc013b0114200220022903b801370300200220022900bd01370005200241186a200241f0006a41c80010ce031a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b009101f2203450d03200341003b010620034100360200200341086a200241a8036a41a80910ce03210120032005280200220036028009200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f01143b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290300370013200041026a200241146a41026a2d00003a0000200041186a20022900053700002003200441c8006c6a41e8026a200241186a41c80010ce031a20034180096a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b220141057410cf031a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a200241e4016a41026a2d00003a0000200020022f01e4013b0000200020022903d001370013200041186a20022900d5013700002007200641c8006c6a220041b0036a200041e8026a2200200141c8006c10cf031a2000200241e8016a41c80010ce031a200741066a2200200341016a22033b010020074180096a220120064102746a41086a200120044102746a2201200341ffff037120046b41027410cf031a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a4188096a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b00941081020000b41800941081020000b41b00941081020000b200241d00c6a2400200f0bd80101067f230041206b22012400200141086a200010d702024020012802082202450d00200141186a2103200141146a2104034020032802002105200428020021060240200128020c450d002002101d0b02402006450d002005450d002006101d0b200141086a200010d702200128020822020d000b0b02402000280204220641f0c0c100460d00200628020021022006101d2002450d00200228020021052002101d2005450d00024020052802002206450d0003402005101d2006210520062802002202210620020d000b0b2005101d0b200141206a24000bd30402077f017e230041306b2202240002400240024002404116101f2203450d002003410e6a41002900aaf341370000200341086a41002900a4f3413700002003410029009cf341370000200341164136101e2203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241186a41086a220142003703002002420037031820034136200241186a1001200241086a41086a200129030037030020022002290318370308024002400240024002400240200241086a411041f8b3c200410041001002417f460d002002421037021c2002200241086a3602182002200241186a10d5012002280200450d0520022802042201417f4c0d082001450d01200110792204450d09200241206a2205200528020022052001410020022802182206200228021c2207200420012005100222052005417f461b2205200520014b1b22086a220536020020082001460d020c040b200041003602080c020b4101210420022802182206200228021c220741014100200241206a280200220510021a41002001470d020b20024200370328200241186a41086a410020062007200241286a41082005100222062006417f461b2206410820064108491b20056a360200200641074d0d012004450d0220022903282109200041106a20013602002000200136020c20002004360208200020093703000b2003101d200241306a24000f0b2001450d002004101d0b41df88c0004133103a000b411641011020000b413641011020000b102e000b200141011020000bbe0d030c7f067e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200221041086a211120102f0106220f410574210941002112024002400240024003402009450d0120042011412010d0032213450d02200941606a2109201241016a2112201141206a21112013417f4a0d000b2012417f6a210f0b200c450d01200c417f6a210c2010200f4102746a4180096a210e410021090c090b201041e8026a201241c8006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a280200280214110100200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22114101460d0020114102470d0220094180016a21094200211920172016844200520d030c0d0b200941f0006a21094200211920172016844200510d0c0c020b200d2802002210201d6a211120102f0106220d201e742109410021120240024003402009450d0120032011202210d0032213450d02200920236a21092012201a6a2112201120226a21112013201f4a0d000b2012201f6a210d0b201c450d03201c201f6a211c2010200d2020746a20216a210d410121090c060b201041e8026a201241c8006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941e0006a21094200211920172016844200510d0a0b200841186a2009290300200941086a2903002017201610d103200120192001290308221720082903187d221620162017562016507222091b37030802402009450d00418382c0002109412221110c090b200a28020022094100480d04200941ffffffff07460d044101211a2007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f41022120418009212141202122416021230c020b200841086a2007411c6a2802002003200741206a280200280214110100200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d2219201756201620067d2017200554ad7d221720165620172016511b4101470d00418dd6c0002109411d21110c070b024020184200520d00200741c0006a2802002209290350200556200941d8006a290300221620065620162006511b450d0041eed5c0002109411f21110c070b20082003410220192017103d024020082802002209450d00200828020421110c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041c1d5c0002109412d21110c070b4100210920032004460d0520032004412010d003450d05200a200320192017103e200a200420182016103e200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22112009490d0320094101742212201120112012491b2212ad42d8007e2216422088a70d032016a722224100480d032009450d01200741286a280200200941d8006c2022101e2211450d020c070b200741286a28020021110c070b2022101f22110d050b202241081020000b1021000b410121090c000b0b103f000b2007412c6a2012360200200741286a2011360200200741306a28020021090b2011200941d8006c6a2211200829036037000141002109201141003a00002011200829034037002120112008280039360041201141096a200841e0006a41086a290300370000201141116a200841e0006a41106a290300370000201141196a200841e0006a41186a290300370000201141296a200841c0006a41086a290300370000201141316a200841c0006a41106a290300370000201141396a200841c0006a41186a290300370000201141c4006a2008413c6a280000360000201141d0006a200637030020112005370348200741306a2211201128020041016a3602000b0b200020113602042000200936020020084180016a24000f0b4180dac300102c000be110010d7f23004180016b220324000240024002400240024002400240024002400240024002404114101f2204450d00200441106a41002800c2f341360000200441086a41002900baf341370000200441002900b2f341370000200441144134101e2204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f0006a41086a220542003703002003420037037020044134200341f0006a1001200341e0006a41086a2005290300370300200320032903703703600240024002400240200341e0006a411041f8b3c200410041001002417f460d002003421037023c2003200341e0006a360238200341286a200341386a10d5012003280228450d03200328022c2106200341206a200341386a10d5012003280220450d0320032802242107200341186a200341386a10d5012003280218450d03200328021c210841002109200341003a0070200341c0006a2205200528020022052003280238200328023c200341f0006a41012005100241016a41014b22056a3602002005450d03024020032d00702205450d004101210920054101470d040b200341106a200341386a10d5012003280210450d0320032802142205417f4c0d0b2005450d0120051079220a450d06200341c0006a220b200b280200220b200541002003280238200328023c200a2005200b1002220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b410221092004101d4102210441024102460d070c080b4101210a2003280238200328023c41014100200341c0006a28020010021a41002005460d050b2005450d00200a101d0b41df88c0004133103a000b411441011020000b413441011020000b200541011020000b200341dc006a41026a220b200341f0006a41026a2d00003a0000200320032f00703b015c200341386a41026a200b2d00003a0000200320032f015c3b01382004101d4102210420094102470d010b4101210b41fdd3c0002106411121070c010b200341f0006a20046a200341386a20046a2d00003a0000200320032f01383b01704100210b0b200341346a20046a200341f0006a20046a2d00003a0000200320032f01703b01340240200b450d002000200636020420004101360200200041086a200736020020034180016a24000f0b200341306a41026a220c200341346a41026a2d00003a0000200320032f01343b0130024002400240024002400240024002400240024002400240024002400240200228024020064d0d004115101f2204450d05410021062004410d6a4100290094f341370000200441086a410029008ff34137000020044100290087f341370000200441154135101e2204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f0006a41086a220742003703002003420037037020044135200341f0006a1001200341e0006a41086a200729030037030020032003290370370360200341e0006a411041f8b3c200410041001002417f460d012003421037023c2003200341e0006a360238200341086a200341386a10d5012003280208450d04200328020c220b417f4c0d0f200b450d02200b10792206450d07200341c0006a220720072802002207200b41002003280238200328023c2006200b2007100222072007417f461b22072007200b4b1b22076a3602002007200b470d030c080b200521042005210e200a21020c120b2004101d41000d070c080b410121062003280238200328023c41014100200341c0006a28020010021a4100200b460d050b200b450d002006101d0b41df88c0004133103a000b411541011020000b413541011020000b200b41011020000b2004101d2006450d010b2006410020061b210d200341386a2006200b20021042200341386a41086a2802002107200328023c210620032802384101470d042000200636020420004101360200200041086a2007360200200b450d01200d101d20050d020c030b2000418ed4c00036020420004101360200200041086a411a3602000b2005450d010b200a101d0b20034180016a24000f0b200341f0006a41026a220f200341d7006a2d00003a0000200320032f00553b0170200341d4006a2d00002109200341d0006a2802002104200341cc006a280200210e200341c8006a2802002102200341c4006a280200210802402005450d00200a101d0b200341306a41026a200f2d00003a0000200320032f01703b01302004417f4c0d004101210502402004450d002004101f2205450d040b20052002200410ce03210a200341386a41146a2004360200200341386a41106a2004360200200320083602402003200736023c200320063602382003200a3602442003200941ff01714101463a00504114101f2205450d01200541106a41002800c2f341360000200541086a41002900baf341370000200541002900b2f341370000200541144134101e2205450d02200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f0006a41086a220142003703002003420037037020054134200341f0006a1001200341e0006a41086a200129030037030020032003290370370360200341e0006a200341386a10612005101d02402004450d00200a101d0b200b450d04200d101d0c040b102e000b411441011020000b413441011020000b200441011020000b20002006360204200020032f01303b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200e360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200c2d00003a000020034180016a24000bc33f01087f230041a0016b22082400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010042209417f460d00410c101f220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a41014102723602004104101f220b450d03200b200a360200200a280208210c4103101f220d450d04200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004106101f220e450d05200e41046a41002f009c89403b0000200e410028009889403600004120101f2209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001005200a200a280204417f6a220d360204200d0d00200a101d0b4103101f220d450d07200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004103101f220e450d08200e41026a41002d00e4a3423a0000200e41002f00e2a3423b00002009412041c000101e2209450d092009410336023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d3602204103101f220d450d0a200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d0b200e41076a41002900b49d42370000200e41002900ad9d42370000200941c000418001101e2209450d0c2009410436025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d3602404103101f220d450d0d200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d0e200e41076a41002900c39d42370000200e41002900bc9d423700002009410536027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d3602604103101f220d450d0f200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004108101f220e450d10200e42e5f0d1fbb5ac98b6ec003700002009418001418002101e2209450d112009410636029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d360280014103101f220d450d12200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d13200e41086a41002f00db9d423b0000200e41002900d39d42370000200941073602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a0014103101f220d450d14200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d15200e41086a41002f00e59d423b0000200e41002900dd9d42370000200941083602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c0014103101f220d450d16200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d17200e41086a41002f00ef9d423b0000200e41002900e79d42370000200941093602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e0014103101f220d450d18200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410b101f220e450d19200e41076a41002800f89d42360000200e41002900f19d423700002009418002418004101e2209450d1a2009410a36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d360280024103101f220d450d1b200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410d101f220e450d1c200e41056a41002900819e42370000200e41002900fc9d423700002009410b3602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a0024103101f220d450d1d200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410c101f220e450d1e200e41086a41002800919e42360000200e41002900899e423700002009410c3602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c0024103101f220d450d1f200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410b101f220e450d20200e41076a410028009c9e42360000200e41002900959e423700002009410d3602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e0024103101f220e450d21200e41026a41002d00e1a3423a0000200e41002f00dfa3423b00004115101f220d450d22200d410d6a41002900ad9e42370000200d41086a41002900a89e42370000200d41002900a09e423700002009410e36029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e360280034103101f220d450d23200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d24200e41076a41002900bc9e42370000200e41002900b59e423700002009410f3602bc03200941003602b8032009428f808080f0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a0034103101f220d450d25200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004107101f220e450d26200e41036a41002800c79e42360000200e41002800c49e42360000200941103602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c0034103101f220e450d27200e41026a41002d00e1a3423a0000200e41002f00dfa3423b00004111101f220d450d28200d41106a41002d00db9e423a0000200d41086a41002900d39e42370000200d41002900cb9e42370000200941113602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e0034103101f220d450d29200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410e101f220e450d2a200e41066a41002900e29e42370000200e41002900dc9e423700002009418004418008101e220c450d2b200c411236029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d360280044103101f2209450d2c200941026a41002d00e1a3423a0000200941002f00dfa3423b0000410e101f220d450d2d200d41066a41002900f09e42370000200d41002900ea9e42370000200c41133602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a0044103101f2209450d2e200941026a41002d00e1a3423a0000200941002f00dfa3423b00004110101f220d450d2f200d41086a41002900809f42370000200d41002900f89e42370000200c41143602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c0044103101f2209450d30200941026a41002d00e1a3423a0000200941002f00dfa3423b00004110101f220d450d31200d41086a41002900909f42370000200d41002900889f42370000200c41153602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e0044103101f220d450d32200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004111101f2209450d33200941106a41002d00a89f423a0000200941086a41002900a09f42370000200941002900989f42370000200c411636029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d36028005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f200841003602602008420137035820084115360248200841c8006a200841d8006a10624100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a2802002209360248200841c8006a200841d8006a10620240024002400240200828025c2206200841d8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828025820062003101e22060d020c060b200828025821060c020b2003101f2206450d040b2008200336025c200820063602580b200e200a20096a3602002006200a6a2001200910ce031a200d410c6a28020021052008200d41146a2802002201360248200841c8006a200841d8006a10620240024002400240200828025c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280258200a2006101e22090d020c070b200828025821090c020b2006101f2209450d050b2008200636025c200820093602582006210a0b200e200320016a2206360200200920036a2005200110ce031a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001101e22090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001101e22090d060c140b200a21010c030b200a21010c050b2001101f2209450d100b2008200136025c200820093602580b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003101e22090d040c100b2001101f2209450d0e0b2008200136025c200820093602580b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003101e22090d040c0e0b2003101f2209450d0c0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a220441a005470d040c030b2003101f2209450d0a0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a220441a005470d010b0b200828025c21090240024041172007200f20082802582206200841e0006a280200200841086a1006220a417d460d00200a417f470d014100210d2009450d410c400b4102210d20090d3f0c400b4104101f220e450d3b200b280200220d28020041016a22014102490d07200d2001360200200e200d36020002402009450d002006101d0b200841d0006a4281808080103703002008200e36024c2008200a36024820022802002106200228020421012008410036026020084201370358200841003602980120084198016a200841d8006a106220082802602103200828025c21042008280258210d410a10792209450d3c41012105024002400240200a20062001200d20032009410a200841086a10072206417d460d0020060d402008410936029c012008200941016a36029801024020092d00002206450d00024020064101470d00200841d8006a20084198016a107a2008280258417e714104470d010b2009101d2004450d02200d101d0c020b410021050b2009101d02402004450d00200d101d0b410321092005450d010b410221090b200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a2009107b200a1008200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081005200e28020022092009280204417f6a360204200e28020022092802040d002009101d0b200e101d4101210d41002106200c41046a2802000d400c410b1021000b200341011020000b200641011020000b200141011020000b200141011020000b200341011020000b200341011020000b00000b107c000b410c41041020000b410441041020000b410341011020000b410641011020000b412041041020000b410341011020000b410341011020000b41c00041041020000b410341011020000b410f41011020000b41800141041020000b410341011020000b410f41011020000b410341011020000b410841011020000b41800241041020000b410341011020000b410a41011020000b410341011020000b410a41011020000b410341011020000b410a41011020000b410341011020000b410b41011020000b41800441041020000b410341011020000b410d41011020000b410341011020000b410c41011020000b410341011020000b410b41011020000b410341011020000b411541011020000b410341011020000b410f41011020000b410341011020000b410741011020000b410341011020000b411141011020000b410341011020000b410e41011020000b41800841041020000b410341011020000b410e41011020000b410341011020000b411041011020000b410341011020000b411041011020000b410341011020000b411141011020000b410441041020000b410a41011020000b41c4f5c200102c000b2006101d0b200d450d02200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a200d107b4100210d41012106200c41046a280200450d010b200c280200101d0b0240200c41106a280200450d00200c28020c101d0b0240200c41246a280200450d00200c41206a280200101d0b0240200c41306a280200450d00200c28022c101d0b0240200c41c4006a280200450d00200c41c0006a280200101d0b0240200c41d0006a280200450d00200c28024c101d0b0240200c41e4006a280200450d00200c41e0006a280200101d0b0240200c41f0006a280200450d00200c28026c101d0b0240200c4184016a280200450d00200c4180016a280200101d0b0240200c4190016a280200450d00200c28028c01101d0b0240200c41a4016a280200450d00200c41a0016a280200101d0b0240200c41b0016a280200450d00200c2802ac01101d0b0240200c41c4016a280200450d00200c41c0016a280200101d0b0240200c41d0016a280200450d00200c2802cc01101d0b0240200c41e4016a280200450d00200c41e0016a280200101d0b0240200c41f0016a280200450d00200c2802ec01101d0b0240200c4184026a280200450d00200c4180026a280200101d0b0240200c4190026a280200450d00200c28028c02101d0b0240200c41a4026a280200450d00200c41a0026a280200101d0b0240200c41b0026a280200450d00200c2802ac02101d0b0240200c41c4026a280200450d00200c41c0026a280200101d0b0240200c41d0026a280200450d00200c2802cc02101d0b0240200c41e4026a280200450d00200c41e0026a280200101d0b0240200c41f0026a280200450d00200c2802ec02101d0b0240200c4184036a280200450d00200c4180036a280200101d0b0240200c4190036a280200450d00200c28028c03101d0b0240200c41a4036a280200450d00200c41a0036a280200101d0b0240200c41b0036a280200450d00200c2802ac03101d0b0240200c41c4036a280200450d00200c41c0036a280200101d0b0240200c41d0036a280200450d00200c2802cc03101d0b0240200c41e4036a280200450d00200c41e0036a280200101d0b0240200c41f0036a280200450d00200c2802ec03101d0b0240200c4184046a280200450d00200c4180046a280200101d0b0240200c4190046a280200450d00200c28028c04101d0b0240200c41a4046a280200450d00200c41a0046a280200101d0b0240200c41b0046a280200450d00200c2802ac04101d0b0240200c41c4046a280200450d00200c41c0046a280200101d0b0240200c41d0046a280200450d00200c2802cc04101d0b0240200c41e4046a280200450d00200c41e0046a280200101d0b0240200c41f0046a280200450d00200c2802ec04101d0b0240200c4184056a280200450d00200c4180056a280200101d0b0240200c4190056a280200450d00200c28028c05101d0b200c101d200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d002009101d0b200b101d4100210902402006410047200d720d00200a100802400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081005200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a101d200941046a22094104470d000b0b200e101d0b200841a0016a24000f0b2000419e89c00036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d002009101d0b0240200841246a280200450d00200841206a280200101d0b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810052009280200220a200a280204417f6a360204200928020022092802040d002009101d0b0240200841386a2802002209450d002008413c6a280200450d002009101d0b0240200c41046a280200450d00200c280200101d0b0240200c41106a280200450d00200c28020c101d0b0240200c41246a280200450d00200c41206a280200101d0b0240200c41306a280200450d00200c28022c101d0b0240200c41c4006a280200450d00200c41c0006a280200101d0b0240200c41d0006a280200450d00200c28024c101d0b0240200c41e4006a280200450d00200c41e0006a280200101d0b0240200c41f0006a280200450d00200c28026c101d0b0240200c4184016a280200450d00200c4180016a280200101d0b0240200c4190016a280200450d00200c28028c01101d0b0240200c41a4016a280200450d00200c41a0016a280200101d0b0240200c41b0016a280200450d00200c2802ac01101d0b0240200c41c4016a280200450d00200c41c0016a280200101d0b0240200c41d0016a280200450d00200c2802cc01101d0b0240200c41e4016a280200450d00200c41e0016a280200101d0b0240200c41f0016a280200450d00200c2802ec01101d0b0240200c4184026a280200450d00200c4180026a280200101d0b0240200c4190026a280200450d00200c28028c02101d0b0240200c41a4026a280200450d00200c41a0026a280200101d0b0240200c41b0026a280200450d00200c2802ac02101d0b0240200c41c4026a280200450d00200c41c0026a280200101d0b0240200c41d0026a280200450d00200c2802cc02101d0b0240200c41e4026a280200450d00200c41e0026a280200101d0b0240200c41f0026a280200450d00200c2802ec02101d0b0240200c4184036a280200450d00200c4180036a280200101d0b0240200c4190036a280200450d00200c28028c03101d0b0240200c41a4036a280200450d00200c41a0036a280200101d0b0240200c41b0036a280200450d00200c2802ac03101d0b0240200c41c4036a280200450d00200c41c0036a280200101d0b0240200c41d0036a280200450d00200c2802cc03101d0b0240200c41e4036a280200450d00200c41e0036a280200101d0b0240200c41f0036a280200450d00200c2802ec03101d0b0240200c4184046a280200450d00200c4180046a280200101d0b0240200c4190046a280200450d00200c28028c04101d0b0240200c41a4046a280200450d00200c41a0046a280200101d0b0240200c41b0046a280200450d00200c2802ac04101d0b0240200c41c4046a280200450d00200c41c0046a280200101d0b0240200c41d0046a280200450d00200c2802cc04101d0b0240200c41e4046a280200450d00200c41e0046a280200101d0b0240200c41f0046a280200450d00200c2802ec04101d0b0240200c4184056a280200450d00200c4180056a280200101d0b0240200c4190056a280200450d00200c28028c05101d0b200c101d200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d002009101d0b200b101d200841a0016a24000bd70e05057f017e157f027e0a7f230041900b6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802800921012006417f6a22060d000b0340200420042f01064102746a4180096a28020021042005417f6a22050d000c020b0b200421010b200241086a411c6a20042f0106360200200241086a41186a4100360200200241086a41146a20043602002002200336022820024100360218200242003703102002200136020c2002410036020820024198026a200241086a10d602024020022903b80222074202510d002000410c6a2108200041046a2109200241c0016a41146a210a200241a0016a410c6a210b20024198026a41256a210c200241dd026a210d200241c8026a210e200241c0026a210f200241dc026a2110200241d0026a2111200241d4026a2112200241d8026a2113200241bc026a211420024198026a41206a211520024198026a411c6a21160340200241d8006a41086a220420024198026a41086a2217290300370300200241d8006a41106a220120024198026a41106a2218290300370300200241d8006a41186a220620024198026a41186a2219290300370300200241306a41086a2203200d41086a290000370300200241306a41106a221a200d41106a290000370300200241306a41186a221b200d41186a290000370300200241306a411f6a221c200d411f6a28000036000020022002290398023703582002200d290000370330200e290300211d200f290300211e20102d0000211f201128020021052012280200212020132802002121200241f8006a411f6a2222201c280000360000200241f8006a41186a2223201b290300370300200241f8006a41106a2224201a290300370300200241f8006a41086a2225200329030037030020022002290330370378200241c0016a41186a22262006290300370300200241c0016a41106a221c2001290300370300200241c0016a41086a221a2004290300370300200220022903583703c001024002400240024002400240024002402009280200220341f0c0c100460d00200041086a28020021270c010b418009101f2203450d0141002127200341003b010620034100360200200341086a20024198026a41f80810ce031a200041086a4100360200200920033602000b0240034020032f01062228410574211b410021044100210102400340201b2004460d01200241c0016a200320046a41086a412010d0032206450d03200441206a2104200141016a21012006417f4a0d000b2001417f6a21280b02402027450d002027417f6a2127200320284102746a4180096a28020021030c010b0b200241a0016a41186a22042026290300370300200241a0016a41106a2201201c290300370300200241a0016a41086a2206201a290300370300200220022903c0013703a001201c2008360200200241c0016a410c6a2028360200201a2009360200200a20022903a001370200200a41086a2006290300370200200a41106a2001290300370200200a41186a2004290300370200200220033602c401200241003602c0012018201d3703002017201e3703002014201f3a0000201520213602002016202036020020192005360200200c2002290378370000200c41086a2025290300370000200c41106a2024290300370000200c41186a2023290300370000200c411f6a20222800003600002002200737039802200241c0016a20024198026a10311a0c060b200341e8026a200141c8006c6a21060240024020074201510d00201f41ff01714102470d010c030b200642013703002006201e370308200641106a201d370300201f41ff01714102460d020b2006201f3a00242006413d6a2023290300370000200641356a20242903003700002006412d6a2025290300370000200641256a200229037837000020200d020c030b41800941081020000b2020450d010b2020210120052104034020042802900221042001417f6a22010d000b0340200520052f01064102746a4190026a28020021052020417f6a22200d000c020b0b200521040b20052f0106210120152021360200201620013602002019410036020020024198026a41146a200536020020184100360200201742003703002002200436029c022002410036029802200241c0016a20024198026a10d702024020022802c001450d00200641186a21010340200241a0016a41106a201c290300370300200241a0016a41086a2204201a290300370300200220022903c0013703a00120024188026a41086a2004280200360200200220022903a00137038802201a200b41086a2802003602002002200b2902003703c001200241f8016a200120024188026a200241c0016a10f801024020022802f801450d0020022802fc012204450d00200241f8016a41086a280200450d002004101d0b200241c0016a20024198026a10d70220022802c0010d000b0b20024198026a10320b20024198026a200241086a10d602201529030022074202520d000b0b200241086a103b2000200028020041016a360200200241900b6a24000f0b10f901000b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641d8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42d8007e2209422088a70d032009a722084100480d032002450d012000280200200241d8006c2008101e2202450d020c040b200028020021020c040b2008101f22020d020b200841081020000b1021000b20002002360200200041046a2003360200200041086a28020021030b2002200341d8006c6a2005200610ce031a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d002001280200101d0b0b8d0202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641077522074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4207862209422088a70d032009a722084100480d032002450d01200028020020024107742008101e2202450d020c040b200028020021020c040b2008101f22020d020b200841081020000b1021000b20002002360200200041046a2003360200200041086a28020021030b200220034107746a2005200610ce031a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d002001280200101d0b0b5f01017f230041306b220224002002200136020c20022000360208200241246a41013602002002411836022c20024201370214200241d8c0c4003602102002200241086a3602282002200241286a360220200241106a41e0c0c40010cf01000b8403010e7f23004190016b220124002001200010d602024020012903204202510d00200141c0006a21022001413c6a2103200141386a210420014184016a210520014180016a2106200141fc006a2107200141f8006a2108200141f0006a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e28029002210e200d417f6a220d0d000b0340200b200b2f01064102746a4190026a280200210b200c417f6a220c0d000c020b0b200b210e0b200141e8006a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36026c20014100360268200141e8006a10322001200010d602200141206a2903004202520d000b0b02402000280204220b41f0c0c100460d00200b280200210c200b101d200c450d00200c280200210e200c101d200e450d000240200e280200220b450d000340200e101d200b210e200b280200220c210b200c0d000b0b200e101d0b20014190016a24000ba30601027f024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e1201121212020304050612071208120b20002802044101470d11200041086a2200280200103c2000280200101d0f0b200041086a280200220141064b0d0b024020010e071100110d110e0f110b200041106a280200450d102000410c6a280200101d0f0b200041086a2d00002201410e4b0d0e20014106470d0f200041106a280200450d0f2000410c6a280200101d0f0b200041086a2d000022014105460d0520014101470d0e2000410c6a2200280200103c2000280200101d0f0b200041086a28020022014102460d0520014101470d0d200041106a280200450d0d2000410c6a280200101d0f0b200041086a2d00004101470d0c2000410c6a2200280200103c2000280200101d0f0b20002d00044101470d0b2000410c6a2200280200103c2000280200101d0f0b200041086a280200450d0a2000280204101d0f0b200041086a2d000022014102490d0920014103460d0220014102470d03200041106a280200450d092000410c6a280200101d0f0b2000410c6a2200280200103c2000280200101d0f0b200041106a280200450d072000410c6a280200101d0f0b200041346a280200450d06200041306a280200101d0f0b200041306a280200450d052000412c6a280200101d0f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200101d0b2001410c6a2101200241746a22020d000b0b200041106a280200450d042000410c6a280200101d0f0b200041106a280200450d032000410c6a280200101d0f0b200041106a280200450d022000410c6a280200101d0f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200241686a22020d000b0b200041106a280200450d012000410c6a280200101d0f0b200041106a280200450d002000410c6a280200101d0f0b0ba90404027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110e1012005290310200356200541186a290300220720045620072004511b0d010c020b2005200110e1012005290300200358200541086a290300220720045820072004511b0d010b41adb7c0002101412621060c010b200541206a200110ea01024002400240024002402005280228450d0042002107200541c0006a41086a2206420037030020054200370340418cb9c000410d200541c0006a1001200541306a41086a2006290300370300200520052903403703300240200541306a411041f8b3c200410041001002417f460d0020054200370340200541306a4110200541c0006a41084100100241016a41084d0d03200529034021070b200541c0006a200110ea012005280244210820052802402109024020052802482201450d00200141286c210620092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d040b200141286a2101200641586a22060d000b0b410021012008450d040c030b02402005280224450d002005280220101d0b410021010c040b41d3b7c000210120080d010c020b41df88c0004133103a000b2009101d0b02402005280224450d002005280220101d0b413121060b2000200636020420002001360200200541d0006a24000b820701087f230041900a6b22042400024002400240024020002802000d002000417f360200200441e0006a41186a200141186a290000370300200441e0006a41106a200141106a290000370300200441e0006a41086a200141086a29000037030020042001290000370360024002402000280204220541f0c0c100460d00200041086a28020021060c010b418009101f2205450d0241002106200541003b010620054100360200200541086a20044198016a41f80810ce031a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f010622084105742109410021014100210a0240034020092001460d01200441e0006a200520016a41086a412010d003220b450d03200141206a2101200a41016a210a200b417f4a0d000b200a417f6a21080b02402006450d002006417f6a2106200520084102746a4180096a28020021050c010b0b200441086a41186a200441e0006a41186a290300370300200441086a41106a200441e0006a41106a290300370300200441086a41086a200441e0006a41086a290300370300200420042903603703082000410c6a2101410021062008210a41000d010c040b2000410c6a21014101450d030b200441b0016a4200370300200441ac016a41f0c0c100360200200441003602b801200441003602a801200442003703a001200441f0c0c10036029c0120044100360298012005200a41c8006c6a41e8026a210120044198016a10320c030b10f901000b41800941081020000b200441e0006a411c6a200441086a41086a29030037020020044184016a200441086a41106a2903003702002004418c016a200441086a41186a290300370200200420013602702004200a36026c2004200736026820042005360264200420063602602004200429030837027420044198016a411c6a420037020020044198016a41106a200441d0006a41086a290300370300200441bd016a200429002d370000200441c5016a2004412d6a41086a290000370000200441cd016a2004412d6a41106a290000370000200441d5016a2004412d6a41186a290000370000200441dc016a200441cc006a2800003600002004420037039801200441023a00bc01200441f0c0c1003602b001200420042903503703a001200441e0006a20044198016a103121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900a6a24000b7701017f230041c0006b220024002000411836020c200041fca8c100360208200041346a4119360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802800921002005417f6a22050d000b0340200320032f01064102746a4180096a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a103b200141306a24000bfc1b03027f027e097f230041d0036b2209240002400240024020012802242001280240220a2802a001470d00200041a582c00036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a4190016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d00200041ce82c00036020420004101360200200041086a41233602000c010b200941106a2001410c6a220a2002103020094180026a41186a220d200241186a29000037030020094180026a41106a220e200241106a29000037030020094180026a41086a220f200241086a2900003703002009200229000037038002200941c8016a20094180026a103320092802d001211020092902d401210c200941f0006a4200370300200941e8006a42808080808001370300200941d8006a4184d0c200360200200941d4006a200a360200200941cc006a4200370200200941386a41106a41f0c0c1003602002009418c016a200f29030037020020094194016a200e2903003702002009419c016a200d290300370200200942083703604100210e200941003602442009200c37023c2009201036023820092009290380023702840120092001280248360280012009200141c0006a2902003703784101210d2009200141246a28020041016a36025c0240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941386a103420092802082202450d00200928020c21012000200236020420004101360200200041086a2001360200024020092802382201450d00200928023c450d002001101d0b200941386a41186a280200210a200941c8006a2802002101200941386a41146a2802002202450d012002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c030b0b0240024020092d0010450d00200941a8016a41186a200941296a290000370300200941a8016a41106a200941216a290000370300200941a8016a41086a200941196a290000370300200920092900113703a80120094180026a200941a8016a200141c8006a28020028020010352009280280024101470d01200020092902840237020420004101360200024020092802382201450d00200928023c450d002001101d0b200941386a41186a280200210a200941c8006a2802002101200941386a41146a2802002202450d042002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c060b0b410021074101210f0c070b200941b0036a41186a220d2009419c026a280200360200200941b0036a41106a220e20094194026a290200370300200941b0036a41086a22022009418c026a29020037030020092009290284023703b003200941c8016a41106a2002290300370300200941c8016a41186a200e290300370300200941e8016a200d280200360200200941043602cc012009418df9c1003602c801200920092903b0033703d001200141c4006a280200210d200941e0026a41186a200141e4006a290000370300200941e0026a41106a200141dc006a290000370300200941e0026a41086a200141d4006a2900003703002009200129004c3703e00220024200370300200942003703b003418390c100410d200941b0036a1001200941a0036a41086a2002290300370300200920092903b0033703a0034200210c0240200941a0036a411041f8b3c200410041001002417f460d00200942003703b003200941a0036a4110200941b0036a41084100100241016a41084d0d0a20092903b003210c0b200941b0036a41086a22024200370300200942003703b00341fbb8c0004111200941b0036a1001200941a0036a41086a2002290300370300200920092903b0033703a003200941a0036a411041f8b3c200410041001002417f460d04200941c8036a4200370300200941b0036a41106a420037030020024200370300200942003703b003200941a0036a4110200941b0036a4120410010022202417f460d0a2002411f4d0d0a20094180036a41186a200941b0036a41186a29030037030020094180036a41106a200941b0036a41106a29030037030020094180036a41086a200941b0036a41086a290300370300200920092903b003370380030c050b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d09200941ec006a280200101d200841046a2802000d0a0c0b0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d07200941ec006a280200101d200841046a2802000d080c090b20094198036a420037030020094180036a41106a420037030020094180036a41086a420037030020094200370380030b200941a4026a200941e0026a41086a290300370200200941ac026a200941e0026a41106a290300370200200941b4026a200941e0026a41186a290300370200200941c4026a20094180036a41086a290300370200200941cc026a20094180036a41106a290300370200200941d4026a20094180036a41186a2903003702002009200337038002200920092903e00237029c022009200c3703900220092009290380033702bc0220092004370388022009200941386a36029802200941b0036a41086a200841086a280200360200200920082902003703b003200941f0016a200d200941c8016a20094180026a20062007200941b0036a200510364101210d0240024020092802f00122024101460d004100210e4100210720024102470d01200020092902f401370204200041013602000240200941e0016a280200450d00200941dc016a280200101d0b024020092802382201450d00200928023c450d002001101d0b200941386a41186a2802002108200941c8006a2802002101200941386a41146a2802002202450d032002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c050b0b200941fc016a280200210e200941f0016a41086a280200210720092802f401210d0b0240200941e0016a280200450d00200941dc016a280200101d0b4100210f0b20094180026a41086a2206200941386a410c6a220241086a290200370300200941c8016a41086a221020094180026a410c6a280200360200200920022902003703800220092009290284023703c801200941f4006a2802002111200941f0006a2802002112200941386a41346a2802002102200941e8006a2802002113200941e4006a2802002114200941386a41286a2802002105024020092802382215450d00200928023c450d002015101d0b20062010280200360200200920092903c80137038002200941386a41086a20062802003602002009200929038002370338200a200941386a103720092005201341d8006c6a360244200920053602402009201436023c20092005360238200141286a200941386a10382009200220114107746a360244200920023602402009201236023c20092002360238200141346a200941386a10392000410c6a200e360200200041086a20073602002000200d36020420004100360200200f450d06200841046a280200450d062008280200101d200941d0036a24000f0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a2001360200200920083602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d04200941ec006a280200101d200941d0036a24000f0b41df88c0004133103a000b41df88c0004133103a000b200841046a280200450d010b2008280200101d0b200941d0036a24000ba07709227f047e4f7f017e397f017e057f027e0f7f230041c0046b220424004100210520044100360290022004200236028c022004200136028802024002400240024002400240200241034b0d00200441013a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a1028200428026821022004280264210620042802602107410521080c010b20044190026a4104360200024002400240024020012800004180c2cdeb06470d002002417c714104470d01200441013a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a102820042802682102200428026421062004280260210741052108410021050c040b410121080c010b02400240024002400240024002400240024002400240024002400240200241074d0d0020044188026a41086a41083602000240024002400240200128000422074101470d00200441b0036a20044188026a104320042802b0034101470d014104210a4100210b4100210c20042d00b4030d020c050b410221080c120b200441b0036a410572210f4104210a200441b0036a412c6a2110200441d4036a2111200441d0036a2112200441cc036a2113200441c8036a2114200441c4036a2115200441c0036a2116200441bc036a2117200441b8036a211841002107412821054100210b4100210c410021090340200441f0016a41026a2219200f41026a2d00003a00002004200f2f00003b01f0012010280200211a200441d8036a280200211b2011280200211c2012280200211d2013280200211e2014280200211f20152802002120201628020021212017280200212220182802002106024020042d00b4032223417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22240d00024020010e0b00070405020809060b030a000b200941ff0171222541014d0d0c0c0b0b200941ff0171222541004b0d0a0c0b0b200941ff0171222541054d0d0a0c090b200941ff01712225410a4d0d090c080b200941ff0171222541034d0d080c070b200941ff0171222541044d0d070c060b200941ff0171222541084d0d060c050b200941ff0171222541024d0d050c040b200941ff0171222541064d0d040c030b200941ff0171222541074d0d030c020b200941ff01712225410b4d0d020c010b200941ff0171222541094d0d010b411321082023410d4b0d010c020b02400240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421082023410d4d0d010b02402022450d002006101d0b0240201f450d00201e450d00201f101d0b201b450d10201c101d200b0d110c120b0240024002400240024002400240024002400240024020230e0e1904050119191908031a07000206190b2021450d184118213d2006202141186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff0321454170214620062147410121010c110b2021450d17202141286c21022006210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200241586a22020d000c180b0b2021450d16411c214820062021411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff0321504170215120062152410221010c0f0b2021450d15202141146c21022006210103400240200141046a280200450d002001280200101d0b200141146a21012002416c6a22020d000c160b0b02402022450d002006101d0b201f450d152020101d200b0d160c170b2021450d13202141047421022006210103400240200141046a280200450d002001280200101d0b200141106a2101200241706a22020d000c140b0b200641ff017122014102460d0320014101460d022021450d132022101d200b0d140c150b2021450d11411c215320062021411c6c6a2154410c2155410821564114215741042158411021594109215a41ffffffff03215b4170215c2006215d410321010c0a0b2021450d104104215e200620214104746a215f41102160410921614108216241ffffffff0321634170216420062165410421010c090b201f450d0c201f410c6c2102202121010340024020012802002205450d00200141046a280200450d002005101d0b2001410c6a2101200241746a22020d000c0d0b0b201f450d0b41042195012021201f4104746a2196014110219701410c21980141082199014174219a012021219b01410521010c070b0240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b410121090c0b0b410021090c0a0b410521090c090b410a21090c080b410321090c070b410421090c060b410821090c050b410221090c040b410621090c030b410721090c020b410b21090c010b410921090b200441e0006a41026a222420192d00003a0000200420042f01f0013b01600240200b200c470d00200b41016a2201200b490d072007200120012007491b220cad422c7e2226422088a70d072026a722014100480d070240200b450d00200a200541586a2001101e220a0d010c040b2001101f220a450d030b200a20056a220141586a20233a00002001201a3602002001417c6a201b360200200141786a201c360200200141746a201d360200200141706a201e3602002001416c6a201f360200200141686a2020360200200141646a2021360200200141606a20223602002001415c6a20063602002001415b6a20242d00003a0000200141596a20042f01603b0000200741026a21072005412c6a2105200b41016a210b200441b0036a20044188026a104320042802b0034101470d000b20042d00b403450d030b20042902b4032227a722084110762105200841087621092027422088a72107200441b0036a41106a2802002102200441bc036a2802002106200b0d0c0c0d0b200141041020000b41082002102b000b200b412c6c2101200a41606a21050240024003402001450d01200141546a2101200541206a21072005412c6a220d210520072d0000410b470d000b200d280200210e0c010b4100210e0b200b412c6c2101200a41586a21050240024003402001450d01200141546a2101200541286a21072005412c6a220d210520072d00004104470d000b200441c0006a200d1044200e2004280244460d010c0d0b200e4100470d0c0b024002400240024020044188026a41086a2802002002470d004280c2cdeb062128200441b4026a200b360200200441b0026a2201200c360200200441ac026a200a360200200441003602a00220044280c2cdeb06428080808010843702a402200a450d0320012903002229a7212a200a2029422088a7222b412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024102470d000b200441386a200741586a104420042802382101200428023c21020c020b200441003a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a1028200441bb036a200441e0006a41086a280200360000200420042903603700b303200441ac026a200441b7036a290000370000200441053a00a402200441013602a002200420042900b0033700a5020240200b450d00200b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b200441a0026a41047221010240200c450d00200a101d0b4100450d130c140b410021010b2002410020011b212c200141f8b3c20020011b212d200a202b412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024108470d000b200441306a200741586a104420042802302101200428023421020c010b410021010b2002410020011b212e200141f8b3c20020011b210d200a202b412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024104470d000b200441286a200741586a104420042802282101200428022c21020c010b410021010b2002410020011b212f200141f8b3c20020011b2130200a202b412c6c6a2105200a210102400240024003404100210e20052001460d0120012d000021022001412c6a2207210120024103470d000b200441206a200741586a104420042802244100200428022022011b22020d010c020b410021014100410041001b2202450d010b200241286c2102200141f8b3c20020011b41186a21014100210e0340200e20012d0000456a210e200141286a2101200241586a22020d000b0b41142131200d202e41146c6a213241002133410821344106212e419289c0002135410c2136411021374102213841042139418df9c100213a41e3c2b1e306213b4100213c410021010c010b418284c0004136103a000b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e080001020304070a0b0b0b0240200d2032460d000240024002400340200d280200210102400240200d20346a2802002202202e460d0020022039470d012001203a460d042001280000203b470d010c040b20012035460d0220012035202e10d003450d020b200d20316a220d2032470d000c040b0b4101213c200d20366a280200450d010c0a0b41012133200d20366a2802000d090b200d20376a2802002201200e6b220220014b0d09419988c000210141262123202f20024d0d52203020022038746a2202450d5241bf88c000210141202123202c200228020022024d0d52202d20022039746a2202450d52411f212341c483c000210120022802080d52200d20316a210d20022d000d2039460d200c520b024002402033203c71410171450d00200a202b412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024106470d000b200441186a200741586a1044200428021c450d01200041e383c000360204411f21230c540b411c411e203c41017122011b212341df87c00041fb87c00020011b21010c520b200a202b412c6c6a2105200a2101034020052001460d0520012d000021022001412c6a2207210120024102470d000b200441106a200741586a104420042802102101200428021421020c050b02402047203f6a280200450d002047280200101d0b0240204720406a2802002202450d00204728020c21012002203f7421020340024020012d00002043470d00200120446a280200204571450d002001203f6a280200101d0b200120416a2101200220466a22020d000b0b2047203d6a21010240204720416a280200450d00204720426a280200101d0b200121472001203e470d1f0c520b02402052204a6a2802002202450d00205228020421012002204d7421020340024020012d0000204f470d002001204b6a280200205071450d002001204d6a280200101d0b2001204e6a2101200220516a22020d000b0b02402052204b6a280200450d002052204d6a280200101d0b205220486a210102402052204c6a280200450d002052280210101d0b2001215220012049470d1f0c510b0240205d20556a2802002202450d00205d2802042101200220587421020340024020012d0000205a470d00200120566a280200205b71450d00200120586a280200101d0b200120596a21012002205c6a22020d000b0b0240205d20566a280200450d00205d20586a280200101d0b205d20536a21010240205d20576a280200450d00205d280210101d0b2001215d20012054470d1f0c500b024020652802082202450d00206528020021012002205e7421020340024020012d00002061470d00200120626a280200206371450d002001205e6a280200101d0b200120606a2101200220646a22020d000b0b206520606a210102402065205e6a280200450d002065280200101d0b200121652001205f470d1f0c4f0b410021010b2002410020011b2166200141f8b3c20020011b2167200a202b412c6c6a2105200a21010240024003404100216820052001460d0120012d000021022001412c6a2207210120024103470d000b200441086a200741586a104420042802082101200428020c21020c010b410021010b41282169200141f8b3c20020011b226a2002410020011b41286c6a216b4103216c41dfa3c200216d4104216e41e2a3c200216f4101217041e0002171410d217241792173410e217441c49ec20021754107217641cb9dc20021774106217842e5f0d1fbb5ac98b6ec00217941d39dc200217a410a217b41dd9dc200217c4102217d41e79dc200217e41f19dc200217f410b21800141959ec20021810141899ec200218201410c21830141fc9dc20021840141dc9ec20021850141ea9ec20021860141ad9dc200218701410f21880141bc9dc20021890141b59ec200218a0141f89ec200218b014110218c0141889fc200218d0141cb9ec200218e014111218f0141989fc20021900141a09ec2002191014115219201411c21930141002194010c330b209b0122072097016a219b01024020072802042201450d00024020072098016a2802002202450d0020022098016c21020340024020012802002205450d0020012095016a280200450d002005101d0b20012098016a21012002209a016a22020d000b0b20072099016a280200450d0020072095016a280200101d0b209b01209601470d1d0c490b41132123418783c00021010c490b412a2123419a83c00021010c480b0240024002400240024002400240024002400240024002400240206a206b460d0041b884c000211b412d2123206a280208206c470d070240206a2802002201206d460d002001206d206c10d0030d080b206a20696a211e0240024002400240024002400240024002400240024002400240024002400240024002400240206a2d001822010d00418b85c000211b413621232066206a28021c22014d0d1a20672001206e746a221f450d1a206a28020c2101024002400240024002400240024002400240024002400240206a2802142202206c470d0041e584c000211b412621232001206f460d262001206f206c10d003450d26206f2001206c10d0030d262070101f2207450d33200720683a0000201f2d000c2071470d1e201f2802082070470d1e201f280200210f41002101034020010d02200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c1f0b0b41e584c000211b41262123200220736a220220744b0d25024020020e0f000926070508040602030b2626260a000b024020012075460d0020752001207610d0030d260b201f2d000c2071470d25201f2802080d25201e216a201f20726a2d0000206e460d4a0c250b201f20726a2d000021012007101d201e216a2001206e460d580c240b2001208701460d0a208701200120880110d003450d0a2001208901460d14208901200120880110d003450d1402402001208a01460d00208a01200120880110d0030d240b201f2d000c2071470d23201f2802080d23201e216a201f20726a2d0000206e460d520c230b2001208b01460d0a208b012001208c0110d003450d0a02402001208d01460d00208d012001208c0110d0030d230b206c101f2207450d32200720683a0002200720683b0000201f2d000c2071470d23201f280208206c470d23201f280200210f4100210103402001207d4b0d16200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c240b0b02402001208401460d002084012001207210d0030d220b201f2d000c2071470d21201f2802080d21201e216a201f20726a2d0000206e460d490c210b2001207f460d09207f200120800110d003450d0902402001208101460d00208101200120800110d0030d210b201f2d000c2071470d20201f2802080d20201e216a201f20726a2d0000206e460d490c200b2001208501460d092085012001207410d003450d0902402001208601460d002086012001207410d0030d200b206c101f2207450d32200720683a0002200720683b0000201f2d000c2071470d21201f280208206c470d21201f280200210f4100210103402001207d4b0d14200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c220b0b2001207a460d09207a2001207b10d003450d092001207c460d10207c2001207b10d003450d1002402001207e460d00207e2001207b10d0030d1f0b201f2d000c2071470d1e201f2802080d1e201e216a201f20726a2d0000206e460d490c1e0b02402001208201460d00208201200120830110d0030d1e0b201f2d000c2071470d1d201f2802080d1d201e216a201f20726a2d0000206e460d440c1d0b024020012077460d0020012900002079520d1d0b2076101f2207450d3220072068360003200720703a0002200720683b0000201f2d000c2071470d16201f2802082076470d16201f280200210f410021010340200120784b0d0a200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c170b0b02402001209101460d00209101200120920110d0030d1c0b201f2d000c2071470d1b201f2802080d1b201e216a201f20726a2d0000206e460d410c1b0b2001208e01460d06208e012001208f0110d003450d0602402001209001460d002090012001208f0110d0030d1b0b207d101f2207450d28200720683b0000201f2d000c2071470d19201f280208207d470d19201f280200210f410021010340200120704b0d10200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c1a0b0b02402001207d470d00206a2093016a2194010b201e216a410621010c610b206e101f2207450d2a20072068360000201f2d000c2071470d15201f280208206e470d15201f280200210f4100210103402001206c4b0d07200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b201f2d000c2071470d17201f2802080d17201f20726a2d00002201206e460d17201e216a2001206e72206e460d4a0c170b201f2d000c2071470d16201f2802080d16201e216a201f20726a2d0000206e460d400c160b201f2d000c2071470d15201f2802080d15201f20726a2d00002201206e460d15201e216a2001206e72206e460d370c150b2076101f2207450d2920072068360003200720703a0002200720683b0000201f2d000c2071470d0f201f2802082076470d0f201f280200210f410021010340200120784b0d04200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c100b0b207d101f2207450d22200720683b0000201f2d000c2071470d0f201f280208207d470d0f201f280200210f410021010340200120704b0d04200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c100b0b201f20726a2d00002201206e460d0c2007101d201e216a2001206e72206e460d400c120b201f20726a2d000021012007101d201e216a2001206e460d420c110b201f20726a2d00002201206e460d0b2007101d201e216a2001206e72206e460d3d0c100b201f20726a2d000021012007101d201e216a2001206e460d330c0f0b2070101f2207450d1f200720683a0000201f2d000c2071470d15201f2802082070470d15201f280200210f41002101034020010d05200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b207d101f2207450d21200720683b0000201f2d000c2071470d15201f280208207d470d15201f280200210f410021010340200120704b0d05200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b201f20726a2d000021012007101d201e216a2001206e460d3e0c0c0b201f20726a2d000021012007101d201e216a2001206e460d2c0c0b0b201f20726a2d000021012007101d201e216a2001206e460d2d0c0a0b201f20726a2d00002201206e460d102007101d201e216a2001206e72206e460d390c090b201f20726a2d000021012007101d201e216a2001206e460d340c080b2007101d200041e584c0003602040c550b209401450d04209401280204450d09209401280200229c01209401280208229d014d0d0a200041c185c00036020441c90021230c540b2007101d200041e584c0003602040c530b2007101d200041e584c0003602040c520b2007101d200041e584c0003602040c510b2007101d200041e584c0003602040c500b4100219c014100219d010c060b2007101d0b2000201b3602040c4d0b2007101d200041e584c0003602040c4c0b2007101d200041e584c0003602040c4b0b200041cb86c000360204413221230c4a0b209d0120032802484d0d002000418a86c00036020441c10021230c490b200441b0036a41086a22024200370300200441f0c0c1003602b403200420032903083e02c003200420032903103e02b003200441b0036a4104722201410d10462001410c10462001410710462001410f1046200441d8006a20042802c003360200200441c8006a41086a2002290300370300200420042903b003370348200a450d11200441b0036a410c6a20293702002004200a3602b80320042028428080808010843703b003200441e0006a200441b0036a10474101101f2201450d12200141003a0000200420042f01b0033b01a002200441c0036a41e0083b0100200441b8036a428180808010370300200420013602b403200441013602b003200420042f01a0023b01c203200441e0006a200441b0036a1048219e014103101f2202450d13200241026a41002d00e1a3423a0000200241002f00dfa3423b00004103101f2205450d14200541026a41002d00e4a3423a0000200541002f00e2a3423b0000200441a0026a41026a229f01200441b0036a41026a22a0012d00003a0000200420042f00b0033b01a002200441f4006a22a1012802002107200441e0006a41106a280200210120a001209f012d00003a0000200420042f01a0023b01b00320072001470d05200141016a22072001490d432001410174229f0120072007209f01491b229f01ad42287e2227422088a70d432027a722074100480d432001450d03200441ec006a280200200141286c2007101e2201450d060c040b20a2012d000020a8016a220120a9014b0d32024002400240024020010e0400030102000b20a20128020c2201450d35200120aa016c210220a20128020420ab016a210103400240200120ac016a2802000d002001280200220520a101490d0020012005209e016a3602000b200120aa016a2101200220ad016a22020d000c360b0b20a20128020c2201450d3420a20128020422c001200120ae016c6a21c101410021010c330b20a20128020c2201450d3320a20128020422c201200120b0016c6a21c3010c310b20a201280204220120a101490d3220a201209f016a2001209e016a36020020a20120a4016a22a20120a501470d2f0c330b2007101d200041e584c0003602040c460b2007101d200041e584c0003602040c450b2007101f2201450d020b200441f0006a209f01360200200441ec006a2001360200200441f4006a28020021070b200441ec006a280200200741286c6a220141003a00182001200536020c200142838080803037020420012002360200200141106a4283808080303702002001411b6a200441b2036a2d00003a0000200141196a20042f01b0033b00002001411c6a209e0136020020a10120a10128020041016a360200200441b0036a200441e0006a418c0110ce031a200441f0016a200441b0036a1049200441f0016a41106a280200229f01412c6c210120042802f80122a20141586a210202400340410021052001450d01200141546a2101200241286a21072002412c6a22a101210220072d00004103470d000b20a10141086a2802002201450d00200141286c210220a10128020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b209f01412c6c210120a20141586a21022005417f6a21a10102400340410021052001450d01200141546a2101200241286a21072002412c6a229e01210220072d00004103470d000b209e0141086a2802002201450d00200141286c2102209e0128020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b209f01412c6c210120a20141606a21020240024003402001450d01200141546a2101200241206a21072002412c6a229e01210220072d00004104470d000b209e012802002101209f010d010c310b41002101209f01450d300b200120056a21a301412c21a40120a201209f01412c6c6a21a5014104219f01200441c8006a41047221a601410021a701417821a801410321a901411421aa01411021ab01417c21ac014101219e01416c21ad01411c21ae01410221af01411821b001410c21b101410821b20142808080801021b301412d21b40142202127417f21b501410b21a001417021b601417e21b70141ec0021b801420321b901420221ba0141ff0121bb01410521bc01410621bd01410021be01410021bf01410721010c3c0b200741041020000b410141011020000b410241011020000b410241011020000b410341011020000b410141011020000b410441011020000b410341011020000b410241011020000b410741011020000b410741011020000b418284c0004136103a000b410141011020000b410341011020000b410341011020000b410021010c2c0b410121010c2b0b410221010c2a0b410321010c290b410421010c280b410521010c270b410621010c260b410621010c250b410621010c240b410621010c230b410621010c220b410621010c210b410621010c200b410621010c1f0b410621010c1e0b410621010c1d0b410621010c1c0b410621010c1b0b410621010c1a0b410621010c190b410621010c180b410621010c170b410621010c160b410621010c150b410621010c140b410621010c130b410621010c120b410721010c110b410121010b034002400240024002400240024002400240024020010e020001010b20c001220120ae016a21c001024020012802182202450d0020012802102101200220af01742102034002402001280200220520a101490d0020012005209e016a3602000b2001209f016a2101200220ac016a22020d000b0b20c00120c101470d010c090b20bf012111024020c201280214209f01742202450d0020c20128020c21010340024020012d000020a001470d002001209f016a2205280200220720a101490d0020052007209e016a3602000b200120ab016a2101200220b6016a22020d000b0b20b201101f2201450d02200120b301370200209f01101f221c450d0120c20120b1016a2105201c20a70136020020c20120aa016a22102802002224450d0341002102410121234101210f4101211b41012107024002400240024041002024221f4f0d00024003402002209e016a211f0240024002400240024002400240024020052802002002209f01746a2d0000220220b7016a20a9014f0d002002104a21c401200441c8006a20b2016a28020021c50120a60121c6010c010b0240024002400240024002400240200220bc01460d00200220bd01470d012007450d0f200720b5016a21070c0a0b2007450d0e2023200f470d012023209e016a22022023490d2b2023209e0174221e20022002201e491b221ead20b901862226202788a70d2b2026a7220220a701480d2b2023450d022001202320a901742002101e22010d030c040b2002104a21c701200441c8006a20b2016a28020021c80120a60121c9010c060b2023211e0c010b2002101f2201450d010b2001200f20a901746a2202209e013602042002201f360200024002400240201b200720b5016a2223470d00201b209e01742202200720072002491b2219ad20ba01862226202788a70d2a2026a7220220a701480d2a201b450d01201c201b20af01742002101e221c0d020c040b201b21190c010b2002101f221c450d020b200f209e016a2102201c202320af01746a200f360200201f20244f0d130c080b200241041020000b200241041020000b410021020c010b410121020b0240024003400240024020020e020001010b20c601280200221920b2016a21bf0120192f0106211e410021020240024002400340201e2002460d0120a70120b501209e0120bf0120026a2d0000221a20c40120bb0171221d4b1b201a201d461b221a450d022002209e016a2102201a209e01460d000b200220b5016a211e0b024020c501450d0020c50120b5016a21c5012019201e20af01746a20b8016a21c601410021020c040b200441c8006a211e200720b5016a22022007490d010c0b0b200441c8006a211e02402019200220a901746a20aa016a2202450d0020022802002219209e01460d0b201920af01470d002002209f016a211e0b200720b5016a220220074f0d0a0b200220074b0d09200f201c200220af01746a28020022024d0d092001200220a901746a22192802042202201e2802006a221e2002490d092019209f016a201e36020002402023200f470d002023209e016a22022023490d272023209e0174221e20022002201e491b221ead20b901862226202788a70d272026a7220220a701480d272023450d062001202320a901742002101e22010d070c0c0b2023211e0c060b20c901280200221920b2016a21bf0120192f0106211e4100210202400340201e2002460d0120a70120b501209e0120bf0120026a2d0000221a20c70120bb0171221d4b1b201a201d461b221a450d032002209e016a2102201a209e01460d000b200220b5016a211e0b024020c801450d0020c80120b5016a21c8012019201e20af01746a20b8016a21c901410121020c010b0b200441c8006a211e200720b5016a22022007490d010c070b200441c8006a211e02402019200220a901746a20aa016a2202450d0020022802002219209e01460d07201920af01470d002002209f016a211e0b200720b5016a220220074f0d060b200220074b0d05200f201c200220af01746a28020022024d0d052001200220a901746a22192802042202201e2802006a221e2002490d052019209f016a201e3602000b2023211e200f2102201b2119201f2024490d020c0d0b2002101f2201450d050b2001200f20a901746a2202209e013602042002201f360200024002400240201b2007470d00201b209e016a2202201b490d22201b209e01742223200220022023491b2219ad20ba01862226202788a70d222026a7220220a701480d22201b450d01201c201b20af01742002101e221c0d020c080b201b21190c010b2002101f221c450d060b200f209e016a2102201c200720af01746a200f3602002007209e016a2107201f20244f0d0b0b201e21232002210f2019211b201f22022010280200221f490d000c020b0b02402023450d002001101d0b410121be010240201b450d00201c101d201121bf0120a20120a4016a22a20120a501470d040c0e0b201121bf010c0c0b41a0aec4002002201f104b000b200241041020000b200241041020000b410721010c170b410021010c060b410441041020000b410841041020000b200120b2016a210f410121194101211e0c010b2002450d012001200220a901746a210f0b2001212341012102034020012902002126200420b4013a00b003200420262027883e02b403200520022026a76a220720b5016a200441b0036a104c200420a0013a00b003200420a1013602b40320052007200441b0036a104c200220af016a2102200f200120b2016a2201470d000b202321010b0240201e450d002001101d0b02402019450d00201c101d0b20c20120b0016a21c20102400240200441c8006a20ab016a280200450d0020102802002202450d00200528020021012002209f01742102410021050340024020012d000020a401470d00200120a0013a00002001209f016a20a3013602002005209e016a21050b200120ab016a2101200220b6016a22020d000b410121bf0120050d010b201121bf010b20c20120c301460d01410121010c000b0b20a20120a4016a22a20120a501470d0d0b024020be01410171450d0020042802f8012109200441fc016a2902002227a7210202402027422088a72201450d002001412c6c2108200921010340200110452001412c6a2101200841546a22080d000b0b02402002450d002009101d0b200428024c200441d0006a280200200441d4006a280200104d200041fd86c000360204411a21010c030b024020bf01410171450d00200441b0036a41106a200441f0016a41106a280200360200200441b0036a41086a200441f0016a41086a290300370300200420042903f0013703b003200441a0026a200441b0036a10474110101f2208450d08200841063a00004101101f2201450d09200141003a00004101101f2202450d0a200220012d00003a00002001101d4110101f2209450d0b200941063a000041f000101f2201450d0c200141063a00602001412c3b0150200120a1013602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441d8006a280200360224024020092d00004109470d00200928020841ffffffff0371450d002009280204101d0b2009101d024020082d00004109470d00200828020841ffffffff0371450d002008280204101d0b2008101d200441d4036a4287808080f000370200200441d0036a2001360200200441cc036a4100360200200441b0036a410c6a4281808080800c370200200441b8036a4101360200200441003602dc03200442043702c403200420023602b403200441013602b003200441a0026a200441b0036a104e200441b0036a200441a0026a418c0110ce031a20044188026a200441b0036a104920044188026a410c6a290200212720042802900221a201200428028c02210120042802880221080c020b20042802f80121a2010b200441fc016a290200212720042802f401210120042802f00121080b200428024c200441d0006a280200200441c8006a410c6a280200104d20a201450d02200441a0026a410c6a2027370200200420a2013602a80220042001ad4220862008ad843703a002200441b0036a200441a0026a2003280244104f20042802b0034101470d010240200441b8036a280200450d0020042802b403101d0b2000419787c000360204412321010b20004101360200200041086a2001360200200441c0046a24000f0b200441bc036a28020022a101450d01200441c0036a2903002127200441b8036a280200210220042802b403210920032802402161200441003602900220044201370388024104101f2201450d022004410436028c0220044190026a22082008280200220541046a3602002004200136028802200120056a2009360000024002400240200428028c022209200828020022016b41044f0d00200141046a22082001490d0d20094101742201200820082001491b22014100480d0d2009450d0120042802880220092001101e2208450d020c0e0b20042802880221080c0e0b2001101f22080d0c0b200141011020000b418284c0004136103a000b418284c0004136103a000b410441011020000b411041081020000b410141011020000b410141011020000b411041081020000b41f00041081020000b410721010c000b0b1021000b2004200136028c02200420083602880220044190026a28020021010b20044188026a41086a200141046a360200200820016a200236000020a1012027422088a72201412c6c22086a21022027a72164024002400240024002402001450d00200841546a2122200441b0036a4101722108200441b0036a41276a2105200441b0036a41206a210b200441b0036a41186a2107200441b0036a41106a2106200441b0036a41086a212120a1012101034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703b0032009410f460d02200441a0026a41276a22202005280000360000200441a0026a41206a220d200b290300370300200441a0026a41186a220e2007290300370300200441a0026a41106a22412006290300370300200441a0026a41086a22602021290300370300200420042903b0033703a002200820042903a002370000200841086a2060290300370000200841106a2041290300370000200841186a200e290300370000200841206a200d290300370000200841276a2020280000360000200420093a00b003200441e0006a200441b0036a20044188026a105020042d00602209411a470d05202241546a21222001412c6a22012002470d000b200222012002470d020c030b20a10122012002470d010c020b2001412c6a22012002460d010b200441b0036a4101722108200441b0036a41276a2105200441b0036a41206a210b200441b0036a41186a2107200441b0036a41106a2106200441b0036a41086a2121034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703b0032009410f460d01200441a0026a41276a22222005280000360000200441a0026a41206a2220200b290300370300200441a0026a41186a220d2007290300370300200441a0026a41106a220e2006290300370300200441a0026a41086a22412021290300370300200420042903b0033703a002200820042903a002370000200841086a2041290300370000200841106a200e290300370000200841186a200d290300370000200841206a2020290300370000200841276a2022280000360000200420093a00b003200441b0036a10452001412c6a22012002470d000b0b02402064450d0020a101101d0b20044188026a41086a280200210120042903880221272000411c6a41003a0000200041186a2001360200200041106a20273702002000410c6a209d01360200200041086a209c0136020020002061360204200041003602002000411d6a20042f00b0033b00002000411f6a200441b2036a2d00003a0000200441c0046a24000f0b200441e0006a41086a28020021612004280264215c02402022450d002001412c6a2101200441b0036a4101722108200441b0036a41276a210b200441b0036a41206a2107200441b0036a41186a2106200441b0036a41106a2121200441b0036a41086a2122034020012d00002105200b200141286a2800003600002007200141216a2900003703002006200141196a2900003703002021200141116a2900003703002022200141096a2900003703002004200141016a2900003703b0032005410f460d01200441a0026a41276a2220200b280000360000200441a0026a41206a220d2007290300370300200441a0026a41186a220e2006290300370300200441a0026a41106a22412021290300370300200441a0026a41086a22602022290300370300200420042903b0033703a002200820042903a002370000200841086a2060290300370000200841106a2041290300370000200841186a200e290300370000200841206a200d290300370000200841276a2020280000360000200420053a00b003200441b0036a10452001412c6a22012002470d000b0b02402064450d0020a101101d0b0240200428028c02450d00200428028802101d0b024020094105470d002061450d00205c101d0b200041ba87c00036020420004101360200200041086a4125360200200441c0046a24000f0b2020450d032021101d200b0d040c050b200020013602040b20004101360200200041086a2023360200200a450d0b0240202b450d00202b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b202a450d0b200a101d200441c0046a24000f0b2022450d002006101d0b200b450d010b200b412c6c210b200a21010340200110452001412c6a2101200b41546a220b0d000b0b200c450d04200a101d0c040b0240200b450d00200b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b41192108200c450d00200a101d0b0b0c010b410021090b200441b0026a2002360200200441ac026a2006360200200441013602a00220042007ad4220862005ad42ffff03834210862009ad42ff0183420886842008ad42ff018384843702a402200441a0026a4104722101200841ff01714105470d010b2001280208450d002001280204101d20042802a0020d0041002108200441ac026a280200220921010340200110452001412c6a2101200841546a22080d000b200441b0026a280200450d002009101d0b200041f182c00036020420004101360200200041086a41163602000b200441c0046a24000bf5d8012b0a7f027e027f017e027f017e387f027e107f017e0f7f027e067f017e117f027e0e7f017e0b7f027e107f027e177f027e177f017e067f017e017f017e027f017e017f017e1a7f017e097f017e0b7f017e0b7f017e277f230041d080046b22022400024002402001280204220320012802082204470d00200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802bc8004210120022802b88004210520004101360200200041003a00042001450d012005101d0c010b200441016a210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d00002104200141086a2005360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b41002104200141086a21074100210803402004411f4b0d1820032005460d192005417f460d6a2003200541016a2209490d6b200620056a2d0000210a20072009360200200a41ff00712004411f71742008722108200441076a210420092105200a418001710d000b20044120490d36200a6741686a41ff017141044f0d36410d21010cb6010b200241206a2001105520022802204101470d0b20022802242201410876210b200241206a41086a290300220c422088210d200241306a280200210e0cc9010b200241206a2001105520022802204101470d0b200228022422054108762104200241206a41086a290300220d422088210c200241306a28020021010cc6010b200241206a2001105520022802204101470d0b20022802242201410876210f200241206a41086a2903002210422088210d200241306a28020021110cc3010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cc0010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cbd010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cba010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cb7010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cb4010b200241206a2001105520022802204101470d0b200228022422124108762101200241206a41086a2903002213422088210d200241306a28020021140cb1010b200241206a2001105520022802204101470d0b200228022422154108762101200241206a41086a290300220d422088210c200241306a28020021160cae010b200241206a2001105520022802204101470d0b200041013602002000200241206a41047222012902003702042000410c6a200141086a290200370200200241d080046a24000f0b200041123a000420004101360200200041056a20043a0000200241d080046a24000f0b200241186a200241346a280200360200200241106a2217200241206a410c6a290200370300200220022902243703084100210b410021014100211803402001411f4b0d0d20172802002203200241086a410c6a22192802002205460d1d200541016a21042005417f460d5f20032004490d60200228020820056a2d0000210520192004360200200541ff00712001411f71742018722118200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a4100210b410d211a0c0d0b200241c880046a200241346a280200360200200241c080046a22012002412c6a290200370300200220022902243703b88004200128020021044100210520022802c48004210120022802b8800421084100210903402005411f4b0d0e20042001460d1d2001417f460d602004200141016a220a490d61200820016a2d0000220341ff00712005411f71742009722109200541076a2105200a21012003418001710d000b200241c480046a200a36020020054120490d2a20036741686a41ff017141044f0d2a41002105410d210a0c0e0b200241c880046a200241346a280200360200200241c080046a221b200241206a410c6a290200370300200220022902243703b880044100210f410021014100211c03402001411f4b0d0f201b2802002203200241b880046a410c6a221d2802002205460d1d200541016a21042005417f460d6120032004490d6220022802b8800420056a2d00002105201d2004360200200541ff00712001411f7174201c72211c200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a4100210f410d211e0c0f0b200241c880046a200241346a280200360200200241c080046a221f200241206a410c6a290200370300200220022902243703b8800441002106410021014100212003402001411f4b0d10201f2802002203200241b880046a410c6a22212802002205460d1d200541016a21042005417f460d6220032004490d6320022802b8800420056a2d0000210520212004360200200541ff00712001411f71742020722120200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d21014100210a0cb3010b200241346a2802002122200241306a28020021012002412c6a2802002107200241286a28020021232002280224212441002121410021054100212503402005411f4b0d1020072001460d1d2001417f460d632007200141016a2226490d64202420016a2d0000220441ff00712005411f71742025722125200541076a2105202621012004418001710d000b20054120490d2a20046741686a41ff017141044f0d2a410d2101410021050cb0010b200241c880046a200241346a280200360200200241c080046a2227200241206a410c6a290200370300200220022902243703b8800441002128410021014100212903402001411f4b0d1020272802002203200241b880046a410c6a22212802002205460d1d200541016a21042005417f460d6420032004490d6520022802b8800420056a2d0000210520212004360200200541ff00712001411f71742029722129200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d21014100210a0cad010b200241346a280200212a200241306a28020021012002412c6a280200210a200241286a280200212b2002280224212c41002121410021054100212d03402005411f4b0d10200a2001460d1d2001417f460d65200a200141016a222e490d66202c20016a2d0000220441ff00712005411f7174202d72212d200541076a2105202e21012004418001710d000b20054120490d2a20046741686a41ff017141044f0d2a410d21014100210a0caa010b200241c880046a200241346a280200360200200241c080046a22012002412c6a290200370300200220022902243703b88004200128020021034100210520022802c48004210120022802b8800421084100210403402005411f4b0d1020032001460d1d2001417f460d662003200141016a220a490d67200820016a2d0000220941ff00712005411f71742004722104200541076a2105200a21012009418001710d000b200241c480046a200a36020020054120490d2a20096741686a41ff017141044f0d2a41002105410d21080c100b200241c880046a200241346a280200360200200241c080046a222f200241206a410c6a290200370300200220022902243703b8800441002130410021014100212103402001411f4b0d11202f2802002214200241b880046a410c6a22032802002205460d1d200541016a21042005417f460d6720142004490d6820022802b88004220620056a2d0000210520032004360200200541ff00712001411f71742021722121200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d2112410021310ca4010b200241346a2802002132200241306a28020021012002412c6a2802002108200241286a280200213320022802242134410021054100213503402005411f4b0d1120082001460d1d2001417f460d682008200141016a2209490d69203420016a2d0000220441ff00712005411f71742035722135200541076a2105200921012004418001710d000b20054120490d2a20046741686a41ff017141034b0d2a410d21150c110b200241346a2802002120200241306a28020021012002412c6a2802002104200241286a280200210720022802242108410021054100210303402005411f4b0d1220042001460d1e2001417f460d692004200141016a2209490d6a200820016a2d0000220a41ff00712005411f71742003722103200541076a210520092101200a418001710d000b024020054120490d00410d2101200a6741686a41ff017141034d0d1f0b2020200946210102402007450d002008101d0b2001450d2b410921050c9c010b410f21010c9e010b200241013a00a88004200241346a41013602002002410136020c2002420137022420024190afc4003602202002200241a880046a3602082002200241086a360230200241b880046a200241206a102820022802c08004210520022903b88004210d410521010c9d010b410f211a0b41002136410021370cae010b200241c480046a200136020041002105410f210a0b41002108410021070caa010b410f211e0b41002138410021390ca6010b410f21014100210a0ca3010b410f2101410021050ca0010b410f21014100210a0c9d010b410f21014100210a0c9a010b200241c480046a200136020041002105410f21080b41002107410021200c96010b410f2112410021310c93010b410f21150b0c0b0b410f21010c0c0b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7213620022802c08004210e200da721374105211a4100210b0c9f010b200241c480046a2004360200200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210820022802102101200da721074105210a410021050c9c010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7213820022802102111200da721394105211e4100210f0c99010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210620022802102104200da7210a410521010c96010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7212120022802c080042104200da72105410521010c93010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7212820022802102104200da7210a410521010c90010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7212120022802c080042104200da7210a410521010c8d010b200241c480046a2003360200200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210720022802102104200da7212041052108410021050c8a010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7213020022802102114200da72131410521120c87010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802c08004211620022903b88004210d410521150b200d422088a7213a200da7213b0c83010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a1028410521010b2000200136020420004101360200200041086a20022902b88004370200200041106a200241b880046a41086a2802003602002007450d95012008101d200241d080046a24000f0b4100210a200241206a41004180800110cd031a41012125410021074100210402402008450d00200141086a211c200141046a211841012125410021074100210341002109034020182802002229201c28020022046b200820096b220541808001200541808001491b2205490d0c200420056a22202004490d4c20292020490d4d200241206a200128020020046a200510ce031a201c20203602000240024002400240200720036b20054f0d00200320056a22042003490d6b20074101742220200420042020491b22204100480d6b2007450d01202520072020101e22250d020c530b200520036a21040c020b2020101f2225450d510b202021070b202520036a200241206a200510ce031a200421032008200520096a22094b0d000b0b41002101410021050340410021082001411f4b0d0d2004200a460d0e2004200a4d0d4d2025200a6a2d0000220341ff00712001411f71742005722105200141076a2101200a41016a2209210a2003418001710d000b20014120490d1b20036741686a41ff017141044f0d1b410d21014100210a0c7d0b2018450d0d4100213c4104213d4101213e411f213f410c2140200241086a410c6a214141082142200241086a41086a2143417f214441ff002145410721464180012147416821484120214941ff01214a41808004214b421c214c4220214d411c214e4110214f410321504118215141142152410421034100211741002119410021210c590b2009450d0d41042103200241b880046a410c6a21294108211c410021204100212502402004200a460d000340200a41016a2101200a417f460d4f20042001490d502008200a6a2c000021052029200136020020054100480d1c4107210a200541c00071450d1d200541807f7222054170470d1f200241206a200241b880046a105620022f002520022d002741107472210520022d0024210a20022802204101460d1e200241206a410c6a2802002104200241206a41086a280200210802400240024020252020470d0020204101742201202041016a220720072001491b2207ad420c7e220d422088a70d68200da722014100480d682020450d0120032020410c6c2001101e22030d020c5a0b202021070c010b2001101f2203450d580b2003201c6a220120043602002001417b6a200541ffffff077122054110763a0000200141796a20053b00002001417c6a2008360200200141786a200a3a0000202541016a220120094f0d20201c410c6a211c20022802b8800421082007212020012125200241b880046a41086a28020022042029280200220a470d000b0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200241106a2802002101200228020c2108200228020821074105210a0c1d0b201c450d0d4100215f4104216041012161411f2162410c2163200241b880046a410c6a216441082165200241b880046a41086a2166417f216741ff00216841072169418001216a4168216b4120216c41ff01216d421c216e4220216f411c2170411021714103217241182173411421744102217542022176417c2177410421034100211b4100211d410121210c580b2020450d0d41042178410021794101217a410c217b200241206a410c6a217c4108217d200241206a41086a217e417f217f4103218001411f21810141ff0021820141072183014180012184014168218501412021860141ff01218701422821880142202189014128218a01411c218b01411a218c014119218d014118218e014114218f014110219001410221910141c00021920141807f219301417021940141fc012195014100211f4104210341002196014100219701410221210c580b410421032025450d0d41002199014101219a01411f219b01417f219c0141ff00219d014107219e01418001219f01416821a001412021a10141ff0121a201410321a301420221a401422021a501410221a601410021a701410021a801410321210c580b2029450d0d410421a901410021aa01410121ab01410c21ac01410821ad01417f21ae01410321af01411f212841ff0021b001410721b10141800121b201416821b301412021b40141ff0121b501421421b601422021b701411421b8014100212741042103410021b901410021ba01410421210c580b202d450d0d410021bb014100200a6b21bc01410421bd01410121be01417f21bf0141e00021c001410321c101411f21c20141ff0021c301410721c40141800121c501416821c601412021c70141ff0121c801411021c901410821ca0141c00021cb0141807f21cc0141fb0121cd014180807c21ce01420421cf01422021d001410221d101410021d20141042103410021d301410021d401410521210c580b2004450d0d200241206a410c6a2129200241206a41086a21184100212541002109410021014100211c410421030340200241206a200241b880046a105620022f002520022d0027411074722105202928020021072018280200212020022d0024210820022802204101460d13200141016a210a02402001201c470d002025200a200a2025491b221cad420c7e220d422088a70d5f200da7222d4100480d5f02402001450d0020032009202d101e22030d010c490b202d101f2203450d480b200320096a220120083a0000200141036a20054110763a0000200141016a20053b0000200141086a2007360200200141046a2020360200202541026a21252009410c6a2109200a2101200a2004490d000c0f0b0b2021450d0e200241b880046a410c6a215c200241206a41086a215b4100215941002158410021544100212f41042153410421d60141042103024020142004460d000340200441016a21052004417f460d4a20142005490d4b200620046a2c00002101205c200536020020014100480d1b41062112200141c00071450d1c200141807f72225d41ff017141fc01490d1e20142005460d1f200441026a21042005417f460d4e20142004490d4f200620056a2d00002101410c2112200241b880046a410c6a20043602004100210402402001450d0020014101470d2241800221040b200241206a200241b880046a1025200241206a410c6a2802002130205b28020021312002280224211220022802204101460d22205441016a210502402054202f470d002059200520052059491b222fad420486225e422088a70d5f205ea722014100480d5f024002402054450d00205320582001101e22530d010c540b2001101f2253450d530b205321d601205321030b200320586a220120123602002001410c6a205a4180807c71205d417f7341ff017172200472225a360200200141086a2030360200200141046a2031360200200520214f0d24205941026a2159205841106a215820022802b88004210620052154200241b880046a41086a2802002214205c2802002204470d000b0b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10280c1e0b2035450d0e200241296a21d701410021d801410421d901410121da01411f21db01417f21dc0141ff0021dd01410721de0141800121df01416821e001412021e10141ff0121e2014180800121e301411021e401200241086a41106a21e501410c21e601200241086a410c6a21e701422021e801410221e901410821ea01200241206a41086a21eb01410621ec01411421ed01200241206a41146a21ee01420421ef01410321f001421821f101411821f201417e21f301420321f401410121f501420121f6014190afc40021f70141c00021f80141807f21f90141fb0121fa014180807c21fb0141042103410021fc01410021fd01410621210c560b200241013a00a88004200241cc80046a410136020020024101360204200242013702bc800420024190afc4003602b880042002200241a880046a360200200220023602c88004200241086a200241b880046a1028200228021021052002290308210d4105210120070d730c740b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a10282002412b6a200241c080046a280200360000200220022903b88004370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241d080046a24000f0b410f21014100210a0c700b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7210820022802c080042105200da7210a410521010c6f0b410021174104210341002119410021010c550b4100210741042103410021050c110b4100211b410421034100211d410121010c530b410021960141042103410021010c690b410021a701410021a8010c670b410021b90141042103410021010c650b410021d30141042103410021590c630b410421034100210a4100211c0b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b2001450d02200aad422086201cad84210d410621050c650b41042103410021054100212f0c4b0b410021fc0141042103410021fd01410221010c4b0b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088210c200228021021044105210141002105201c450d6b2003101d0c6b0b200241306a2802002104201c450d692003101d0c690b2005450d08200241206a410041800810cd031a410121294100210a41002103410021200340200420096b200520206b22014180082001418008491b2201490d0f200920016a221c2009490d382004201c490d39200241206a202520096a200110ce031a0240024002400240200a20036b20014f0d00200320016a22082003490d4e200a4101742209200820082009491b22094100480d4e200a450d012029200a2009101e22290d020c420b200120036a21080c020b2009101f2229450d400b2009210a0b202920036a200241206a200110ce031a201c2109200821032005200120206a22204b0d000b200241206a20292008105720022802204101470d1041082101200a450d132029101d0c610b4118210a0b0c010b20054180feff07714108762104200241306a28020021012002412c6a2802002108200241206a41086a28020021070b2004410874200541ff01717221052020450d702003101d0c700b202541016a21050b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b02402001450d002005ad4220862007ad84210d410521050c5b0b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088210c2002280210210141052105410021042007450d6f2003101d0c6f0b411821120b0c040b4100210341012129410021084100210a20042009490d080c3d0b205d21010c020b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10280b20022802102114200228020c213020022802082131410521120b200141ff017141087420127221122054450d450c380b200241306a280200211420540d370c440b200241013a00a88004200241cc80046a410136020020024101360204200242013702bc800420024190afc4003602b880042002200241a880046a360200200220023602c88004200241086a200241b880046a10282002290308220d422088a7210820022802102105200da7210441052101200a450d032029101d2004210a0c520b205441016a21050c370b202941087621032004201c22094f0d350b20092004102a000b2004210a0c4e0b0c4d0b417f2005102a000b20052003102b000b417f200541016a102a000b200541016a2003102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a2004102b000b417f2004102a000b20042003102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a2007102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a200a102b000b417f200141016a102a000b200141016a2003102b000b417f2004102a000b20042014102b000b417f200141016a102a000b200141016a2008102b000b417f200141016a102a000b200141016a2004102b000b20042020102a000b20202029102b000b200a41016a2004102b000b202041011020000b202d41041020000b417f2001102a000b20012004102b000b417f2005102a000b20052014102b000b2009201c102a000b201c2004102b000b417f2004102a000b20042014102b000b200141041020000b200141041020000b200941011020000b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b200320586a21be02411021bf02410421c002410921c102410821c20241ffffffff0321c302417021c402410c2121410321010c020b0240200420096b2205417f4c0d00024002402005450d002005101f22010d01200541011020000b410121010b2008ad422086210d200aad210c2001202520096a200510ce031a2005ad2210422086211302402007450d002025101d0b200d200c84210d2013201084210c2003410874202941ff0171722103410121050c1a0b102e000b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b02402001450d002005ad422086202fad84210d410721050c190b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a1028422021910220022903082113200228021021142005450d124104219202200320054104746a21930241102194024109219502410821960241ffffffff032197024170219802200321990241082121410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b200241146a28020020022802184621010240200228020c450d002002280208101d0b2001450d032019ad4220862017ad84210d410c21050cdf010b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b2001450d01201dad422086201bad84210d410a21050cde010b2009203246210102402033450d002034101d0b2001450d0220fd01ad42208620fc01ad84210d410b21050cdd010b20024103410220011b3a00a880044114219a02200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10284220219b022002290308211020022802102111201d450d03411c219c022003201d411c6c6a219d02410c219e024108219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200321a502410921210cb9010b20024103410220011b3a00a88004411421a602200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241b880046a200241206a1028422021a70220022903b88004210c20022802c08004210e2019450d04411c21a80220032019411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200321b102410a21210cba010b20024103410220011b3a0008411421b202200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a1028422021b30220022903b88004210d20022802c08004211620fd01450d05411821b402200320fd0141186c6a21b502410421b602411021b702410c21b802410921b902410821ba0241ffffffff0321bb02417021bc02200321bd02410b21210cbb010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024020210e0f000102030405060b0d1416181c202c2c0b20192253203e6a2119410021014100210603404100210b2001203f4b0d0c2043280200225420412802002205460d0e2005203e6a210420052044460d7420542004490d75200228020820056a2d000021052041200436020020052045712001203f71742006722106200120466a210120052047710d000b024020012049490d0020056720486a204a71203d490d530b200241206a200241086a10252002280220203e460d53200241206a20406a2802002155200241206a20426a280200215620022802242157410021054100215803402005203f4b0d1d2043280200225420412802002204460d1f2004203e6a210120042044460d840120542001490d85012002280208225920046a2d000021042041200136020020042045712005203f71742058722158200520466a210520042047710d000b024020052049490d0020046720486a204a71203d490d5e0b4100215a200241206a4100204b10cd031a024002402058450d004100215a4101215b410021044100215c0340205420016b2058205c6b2205204b2005204b491b2205490d3d200120056a225d2001490d9b012054205d490d9c01200241206a205920016a200510ce031a2041205d3602000240024002400240205a20046b20054f0d00200420056a225d2004490ddd01205a203e742201205d205d2001491b2201203c480ddd01205a450d01205b205a2001101e225b0d020ca1010b200520046a215d0c020b2001101f225b450d9f010b2001215a0b205b20046a200241206a200510ce031a20582005205c6a225c4d0d02204128020021012043280200215420022802082159205d21040c000b0b4101215b4100215d0b024020172053470d002017203e7422012017203e6a220520052001491b2205ad204c7e225e204d88a70dd701205ea72201203c480dd701024002402017450d0020032017204e6c2001101e22030d010ca3010b2001101f2203450da2010b200521170b20032053204e6c6a2201200620427622053b00012001205b36021020012057360204200120063a0000200120506a2005204f763a0000200120516a205d360200200120526a205a360200200120406a2055360200200120426a205636020020192018490dae010cbd010b201d225820616a211d410021014100210603404100210f200120624b0d072066280200225420642802002205460d09200520616a210420052067460d7120542004490d7220022802b8800420056a2d000021052064200436020020052068712001206271742006722106200120696a21012005206a710d000b02402001206c490d00200567206b6a206d712060490d4b0b200241206a200241b880046a102520022802202061460d4b200241206a20636a2201280200215c200241206a20656a2205280200215d2002280224215a200241206a200241b880046a102920022802202061460d4c200528020021532002280224215902400240024020012802002201450d0020012075742204207575225bad207686225e206f88a70dd801205ea72201205f480dd8012001101f2254450d9d01200420776a21552054210120592105034020012005280200360200200120606a2101200520606a2105200420776a22040d000b205520757620616a21052053450d020c010b4100215b41042154410021052053450d010b2059101d0b0240201b2058470d00201b2061742201201b20616a220420042001491b2204ad206e7e225e206f88a70dd601205ea72201205f480dd60102400240201b450d002003201b20706c2001101e22030d010c9e010b2001101f2203450d9d010b2004211b0b2003205820706c6a2201200620657622043b0001200120543602102001205a360204200120063a0000200120726a20042071763a0000200120736a2005360200200120746a205b360200200120636a205c360200200120656a205d360200201d201c490dae010cbd010b200241206a200241b880046a1058207c2802002106207e280200215d2002280224215b2002280220207a460d23200241206a200241b880046a1058207c2802002157207e2802002153200228022421552002280220207a460d24200241b880046a207d6a2802002204200241b880046a207b6a22592802002221460d252021207a6a21012021207f460d850120042001490d860120022802b88004225c20216a2d00002105205920013602004100215a20052080014b0d2602400240024002400240024020050e0400030102000b4100215a4100210541002121034020052081014b0d1d20042001460d1e2001207f460d7f20042001207a6a2258490d8001205c20016a2d000021542059205836020020542082017120052081017174202172212120052083016a2105205821012054208401710d000b4100215a02402005208601490d002054672085016a208701712078490d5b0b209601209701460d030c040b200241206a200241b880046a1056207e290300215e200228022421212002280220207a460d424102215a209601209701460d020c030b20042001460d4320212091016a21582001207f460da30120042058490da401205c20016a2c000021052059205836020020052079480d44200520920171450d38200520930172220520870171209501490d3820042058460d4820212080016a21012058207f460d9f0120042001490da0012005207f732154205c20586a2d00002105410c2121200241b880046a410c6a20013602004103215a4100210402402005450d002005207a470d4b410121040b209601209701460d010c020b20042001460d4120212091016a21052001207f460d900120042005490d9101205c20016a2c00002101205920053602002001207f4c0d44200120920171450d382001209301722201209401470d38200241206a200241b880046a1056207e290300215e200228022421212002280220207a460d484101215a209601209701470d010b209601207a742201209601207a6a220520052001491b2205ad2088017e22980120890188a70dd501209801a722012079480dd50102400240209601450d002003209601208a016c2001101e22030d010c93010b2001101f2203450d92010b20052196010b2003209701208a016c6a2201205536020c200120063602082001205d3602042001205b36020020012086016a205e3702002001208b016a20213602002001208c016a20043a00002001208d016a20543a00002001208e016a205a3a00002001208f016a205736020020012090016a2053360200201f208a016a211f209701207a6a220121970120012020490dae010cea010b20a7012206209a016a21a70120262101410021054100210403402005209b014b0d0420072001460d062001209c01460d6d20072001209a016a2226490d6e202420016a2d00002221209d01712005209b01717420047221042005209e016a2105202621012021209f01710d000b0240200520a101490d0020216720a0016a20a2017120a3014d0d480b024020a8012006470d002006209a0174220120a70120a7012001491b22a801ad20a40186225e20a50188a70dd401205ea72201209901480dd40102402006450d002003200620a601742001101e22030d010c9c010b2001101f2203450d9b010b2003200620a601746a200436020020a7012025490dae010ce8010b200241206a200241b880046a1058200228022020ab01460d2b200241206a20ad016a280200215a2002280224215d200241b880046a20ad016a2802002205200241b880046a20ac016a22212802002204460d2c200420ab016a2101200420ae01460d900120052001490d9101200241206a20ac016a280200215320022802b88004220620046a2d0000215c20212001360200205c20af014b0d2f02400240024002400240205c0e0400030102000b4100215c41002154410021040340205420284b0d1e20052001460d24200120ae01460d86012005200120ab016a2259490d8701200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4100215c205420b401490d0320586720b3016a20b5017120a9014f0d030c620b41002154410021040340205420284b0d1220052001460d21200120ae01460d89012005200120ab016a2259490d8a01200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4102215c205420b401490d0220586720b3016a20b5017120a9014f0d020c550b41002154410021040340205420284b0d1120052001460d21200120ae01460d7e2005200120ab016a2259490d7f200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4103215c205420b401490d0120586720b3016a20b5017120a9014f0d010c540b41002154410021040340205420284b0d1020052001460d1e200120ae01460d7b2005200120ab016a2259490d7c200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4101215c205420b401490d0020586720b3016a20b5017120a901490d530b200241a880046a20ad016a20043602002002205c3602ac8004200220533602a8800420022902ac8004215e024020b90120ba01470d0020b90120ab0174220120b90120ab016a220520052001491b2205ad20b6017e22980120b70188a70dd301209801a7220120aa01480dd3010240024020b901450d00200320b90120b8016c2001101e22030d010c92010b2001101f2203450d91010b200521b9010b200320ba0120b8016c6a2201205e37020c200120533602082001205a3602042001205d360200202720b8016a212720ba0120ab016a220121ba0120012029490dae010ce6010b200a202e460d34202e20be016a2101202e20bf01460d9101200a2001490d9201202c202e6a2d0000225820c001470d3820d40120be016a2159202e20c1016a210641002158410021054100212103402006212e200520c2014b0d0c200a2001460d0d200120bf01460d73200a200120be016a2204490d74202c20016a2d0000225420c30171200520c20171742021722121202e20be016a2106200520c4016a210520042101205420c501710d000b0240200520c701490d0020546720c6016a20c8017120bd01490d510b41002105024002402021450d0020bc0120046a2153202c20046a215b4101215a41002154410021014100215d0340205320016a450d30202e450da701200a202e490da801205b20016a2c0000225820bb01480d324106215c205820cb0171450d33205820cc0172225820c8017120cd014d0d33200120be016a210602402001205d470d002054200620062054491b225d20bb01480dd50102402001450d00205a2001205d101e225a0d010ca1010b205d101f225a450da0010b205a20016a205820bf01733a0000205420d1016a2154202e20be016a212e2006210120062021490d000b200420066a21040c010b4101215a410021064100215d0b205a20c9017620c901742253205a20ca017620c8017120ca0174225b72205a20c80171225a72215441002101034041002158200520c2014b0d28200a2004460d2a200420bf01460d8701200a200420be016a222e490d8801202c20046a2d0000222120c30171200520c20171742001722101200520c4016a2105202e2104202120c501710d000b0240200520c701490d0020216720c6016a20c8017120bd01490d620b024002400240200120be01460d0020010d654104210520d30120d401460d010c020b200a202e460d65202e20bf01460da801200a202e20be016a2201490da901202c202e6a2c0000225820bb01480d664106215c205820cb0171450d2a205820cc0172225820c8017120cd014d0d2a205820bf017321052001212e20d30120d401470d010b20d30120be0174220120d30120be016a220420042001491b2204ad20cf0186225e20d00188a70dd201205ea7220120bb01480dd2010240024020d301450d00200320d30120bd01742001101e22030d010cab010b2001101f2203450daa010b200421d3010b200320d40120bd01746a220120d50120ce0171200520c8017120ca01747220c0017222d50136020c200120063602082001205d3602042001205b205a7220537236020020d20120c9016a21d201205921d4012059202d490dae010ce4010b20fd01225d20da016a21fd0141002101410021040340200120db014b0d0920082009460d0a200920dc01460d702008200920da016a2205490d71203420096a2d0000220620dd0171200120db0171742004722104200120de016a210120052109200620df01710d000b0240200120e101490d0020066720e0016a20e2017120d901490d4f0b41002158200241206a410020e30110cd031a4101215a024002402004450d00410021544100215c410021590340200820056b200420596b220120e301200120e301491b2201490d21200520016a22092005490d7e20082009490d7f200241206a203420056a200110ce031a0240024002400240205c20546b20014f0d00205420016a22062054490dd701205c20da01742205200620062005491b220520d801480dd701205c450d01205a205c2005101e225a0d020c8e010b200120546a21060c020b2005101f225a450d8c010b2005215c0b205a20546a200241206a200110ce031a20092105200621542004200120596a22594b0d000c020b0b200521094100215c410021060b20e501200636020020e70141003602002002205a36020820022006ad20e80186205cad8437020c41002101410021590340200120db014b0d2420062058460d25205820dc01460d89012006205820da016a2204490d8a01205a20586a2d0000210520e7012004360200200520dd0171200120db0171742059722159200120de016a210120042158200520df01710d000b0240200120e101490d0020056720e0016a20e2017120d901490d5e0b4100215b024002402059450d004100215c410421554100215a0340205a225320da016a215a410021014100210602400240024002400340200120db014b0d01200241086a20ea016a280200225420e7012802002205460d02200520da016a2104200520dc01460d7b20542004490d7c2002280208225820056a2d0000211520e7012004360200201520dd0171200120db0171742006722106200120de016a2101201520df01710d000b02400240200120e101490d0020156720e0016a20e2017120f0014d0d010b0240024020542004470d00200220da013a00a8800420ee0120da01360200200220f501360204200241206a20e4016a2002360200200220f601370224200220f7013602202002200241a880046a360200200241b880046a200241206a1028200241b880046a20ea016a28020021fe0120022802bc800421ff0120022802b88004218002410521060c010b200520e9016a2101200420dc01460da70120542001490da801205820046a2c0000210520e701200136020002400240200520d801480d00200520f801710d01410621060c020b411821060c010b0240200520f90172220120e2017120fa014d0d00200620fb01712104200620ea01762105200120dc01732101410021540c060b41062106200121050b20800220ea0176218102410121544100210420ff0121820220fe0121830220800221010c040b203b2101203a218202410d21060c020b410f2106203b2101203a2182020c010b200220da013a00a8800420ee0120da01360200200220f501360204200241206a20e4016a2002360200200220f601370224200220f7013602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e20e80188a7218202200241b880046a20ea016a2802002116205ea72101410521060b200120ea017621810241012154410021052016218302410021042001213b208202213a0b2004200520e2017120ea017472200620e2017172211520540d3b0240205c2053470d00205c20da01742205205c20da016a220420042005491b2204ad20f40186225e20e80188a70dd401205ea7220520d801480dd40102400240205c450d002055205c20f001742005101e22550d010ca6010b2005101f2255450da5010b2004215c0b2055205320f001746a220520013a000420052015360200205a2059490d000c020b0b410421554100215c4100215a0b410121064108215641002101410021044100218402034020012105200241206a200241086a1026200228022020da01460d3a200241b880046a20e9016a220120d70120e9016a2d00003a0000200220d7012f00003b01b88004200241206a20e6016a2802002159200241206a20e4016a280200215820ee0128020021530240024020eb012d0000225420ec01470d00200620dc016a21060c010b205420f3016a20e9014b0d00200620da016a225720064f21850220572106208502450d540b200241206a20e9016a225720012d00003a0000200220022f01b880043b012002402004208402470d00200420da016a22012004490dd201205b20012001205b491b228402ad20ef0186225e20e80188a70dd201205ea7220120d801480dd20102402004450d00205620052001101e22560d010ca4010b2001101f2256450da3010b205620056a220120543a0000200120e6016a2053360200200120ea016a2058360200200120d9016a2059360200200120f0016a20572d00003a0000200120da016a20022f01203b0000205b20e9016a215b200520e4016a2101200420da016a210420060d000b20e70128020020e5012802004621010240200228020c450d002002280208101d0b2001450d64024020fc01205d470d0020fc0120da0174220120fc0120da016a220520052001491b2205ad20f1017e225e20e80188a70dd101205ea7220120d801480dd1010240024020fc01450d00200320fc0120f2016c2001101e22030d010ca5010b2001101f2203450da4010b200521fc010b2003205d20f2016c6a2201205636020c2001205a3602082001205c36020420012055360200200120ed016a2004360200200120e4016a20840236020020fd012035490dae010cb9010b410f210120a8010de1010cf4010b410f211e20580d480c490b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802c08004210420022802bc8004212120022802b8800421054105210120a801450df2010cdf010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a10282002290308225e422088a72138200241106a2802002111205ea721394105211e0c440b02402090022088026a2802002205450d0020900228020421012005208b027421050340024020012d0000208d02470d0020012089026a280200208e0271450d002001208b026a280200101d0b2001208c026a21012005208f026a22050d000b0b02402090022089026a280200450d00209002208b026a280200101d0b2090022086026a21010240209002208a026a280200450d00209002280210101d0b20012190022001208702470daa010c460b410f211a20530d540c550b02402099022802082205450d00209902280200210120052092027421050340024020012d0000209502470d0020012096026a28020020970271450d0020012092026a280200101d0b20012094026a210120052098026a22050d000b0b2099022094026a210102402099022092026a280200450d00209902280200101d0b20012199022001209302470da9010cda010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a72136200241c080046a280200210e205ea721374105211a20530d520c530b410f2115205d0d5e0c5f0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a7213a200241c080046a2802002116205ea7213b41052115205d0d5d0c5e0b410f215c0cc8010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a102820022903b88004220d422088a72121200241c080046a2802002101200da7210a4105215c0cc7010b410f21014100215c0cc7010b024020a502209e026a2802002205450d0020a5022802042101200520a0027421050340024020012d000020a202470d002001209f026a28020020a30271450d00200120a0026a280200101d0b200120a1026a2101200520a4026a22050d000b0b024020a502209f026a280200450d0020a50220a0026a280200101d0b20a502209c026a2101024020a502209a026a280200450d0020a502280210101d0b200121a5022001209d02470da3010b2010209b0288210d410521014100210f201b450deb012003101d0ceb010b024020b10220aa026a2802002205450d0020b1022802042101200520ac027421050340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a280200101d0b200120ad026a2101200520b0026a22050d000b0b024020b10220ab026a280200450d0020b10220ac026a280200101d0b20b10220a8026a2101024020b10220a6026a280200450d0020b102280210101d0b200121b102200120a902470da2010b200c20a70288210d410521014100210b2017450ded012003101d0ced010b024020bd0220b6026a280200450d0020bd02280200101d0b024020bd0220b2026a2802002205450d0020bd0228020c2101200520b6027421050340024020012d000020b902470d00200120ba026a28020020bb0271450d00200120b6026a280200101d0b200120b7026a2101200520bc026a22050d000b0b20bd0220b4026a2101024020bd0220b7026a280200450d0020bd0220b8026a280200101d0b200121bd02200120b502470da1010b200d20b30288210c410521154100210120fc01450dd9012003101d0cd9010b410f21210cc6010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a410521214100215a0cc6010b024020032802082205450d0020032802002101200520c0027421050340024020012d000020c102470d00200120c2026a28020020c30271450d00200120c0026a280200101d0b200120bf026a2101200520c4026a22050d000b0b200320bf026a21010240200320c0026a280200450d002003280200101d0b2001210320be022001470d9e010cc3010b410f211a20550d410c420b410f21010cbc010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a72136200241c080046a280200210e205ea721374105211a0c1c0b024020cf0220c7026a2802002205450d0020cf022802042101200520ca027421050340024020012d000020cc02470d00200120c8026a28020020cd0271450d00200120ca026a280200101d0b200120cb026a2101200520ce026a22050d000b0b024020cf0220c8026a280200450d0020cf0220ca026a280200101d0b20cf0220c5026a2101024020cf0220c9026a280200450d0020cf02280210101d0b200121cf02200120c602470d9b010c410b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c100b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c0f0b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c0e0b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a1028200229020c210d2002280208210a410521010cb6010b200241013a00a78004200241cc80046a410136020020024101360204200241c880046a2002360200200242013702bc800420024190afc4003602b880042002200241a780046a360200200241a880046a200241b880046a102820022903a88004225e422088a7213a200241b080046a2802002116205ea7213b41052115205c450d46205a101d205d0d480c490b200241306a2802002104205d210a205b21012097010dbf010cc0010b200241306a28020021042053210a2057210620552101205d0dbc010cbd010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a410521214100215a410021040cba010b41092121410021040cb9010b410f2115200228020c0d3a0c3b0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a7218202200241c080046a280200218302205ea7213b410521150c300b024020da0220d2026a280200450d0020da02280200101d0b024020da0220d3026a2802002205450d0020da0228020c2101200520d2027421050340024020012d000020d602470d00200120d7026a28020020d80271450d00200120d2026a280200101d0b200120d4026a2101200520d9026a22050d000b0b20da0220d0026a2101024020da0220d4026a280200450d0020da0220d5026a280200101d0b200121da02200120d102470d90010c420b410f215c0b205d0daf010cb0010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c205d450daf010cae010b20022002412c6a2902003703a88004200241286a280200210a2002280224210120022802a88004212820022802ac8004210420ba010dab010cac010b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280b200229020c210d2002280208210a410521014100215c0ca8010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c080046a280200210120022802bc8004212120022802b88004210a4105215c205d0d030ca6010b410a21010ca6010b4118215c0b205d450da3010b205a101d0ca2010b41062121410021040caa010b410721040c0c0b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c0ca4010b200241013a00a78004200241cc80046a410136020020024101360204200241c880046a2002360200200242013702bc800420024190afc4003602b880042002200241a780046a360200200241a880046a200241b880046a1028200241b080046a280200210e20022802ac8004213620022802a8800421374105211a205a0d010b2055450d230c220b205b101d20550d210c220b4117215c0ca0010b20810220ea0174200120e2017172213b205c0d1d0c1c0b200241306a2802002183022002412c6a280200218202200241286a280200213b200228022421152004450d1a0c190b200241206a41086a200241306a2802003602002021418080807871215a20214180807c712104202141087621050c97010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200241106a28020021052002290308215e410521040c040b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a102841052121200229020c210d2002280208210a410021040c9f010b41182121410021040c9e010b411821040b0b200141ff017141087420047221210c90010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a41052121410021040c9a010b200241306a28020021050c8e010b4100215a0c98010b410d210120a8010d9d010cb0010b410d211e20580d040c050b2002280224221e410876210f200241306a28020021112002412c6a2802002138200241206a41086a280200213920580d030c040b2002280224211e200241206a41106a28020021112002412c6a2802002138200241206a41086a28020021390240205c450d00205c4104742105205a21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b201e410876210f205d0d010b2058450d020c010b205a101d2058450d010b411c21860220032058411c6c6a218702410c21880241082189024114218a024104218b024110218c024109218d0241ffffffff03218e024170218f022003219002410721210c760b201b450dad012003101d0cad010b410d211a20530d0d0c0e0b2002280224221a410876210b200241306a280200210e2002412c6a2802002136200241206a41086a280200213720530d0c0c0d0b410d2115205d0d180c190b410d215c0c83010b410d21014100215c0c83010b410d21210c88010b024020544109470d00205841ffffffff0371450d002059101d0b4115218202418080c000213b410421152004450d010b205621010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b0240208402450d002056101d0b205c0d010b200228020c450d090c080b2055101d200228020c0d070c080b410d211a2055450d010b20554104742105205721010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b4100210b02402056450d002057101d0b2053450d010b411c21c50220032053411c6c6a21c602410c21c702410821c802411421c902410421ca02411021cb02410921cc0241ffffffff0321cd02417021ce02200321cf02410d21210c700b2017450da1012003101d0ca1010b410d21010c770b410d2115200228020c450d010b2002280208101d0b208202213a20830221160c050b410d215c205d0d760c770b4104215c4198a0c100210a41242121205d0d750c760b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c205d0d740c750b4118215c205d0d730c740b200220f00120e90120011b3a00a88004200241346a410136020020024101360204200241206a41106a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a1028200241b880046a41086a280200211620022802bc8004213a20022802b88004213b02402004450d00200541106a21044100210103400240205620016a22052d00004109470d00200541086a28020041ffffffff0371450d00200541046a280200101d0b2004200141106a2201470d000b0b0240208402450d002056101d0b41052115205c0d010b205d450d020c010b2055101d205d450d010b411821d0022003205d41186c6a21d102410421d202411421d302411021d402410c21d502410921d602410821d70241ffffffff0321d802417021d902200321da02410e21210c650b20fc01450d82012003101d0c82010b417f200141016a102a000b200141016a2007102b000b417f2004102a000b20042054102b000b417f2004102a000b20042054102b000b417f200941016a102a000b200941016a2008102b000b417f200141016a102a000b200141016a200a102b000b417f2004102a000b20042054102b000b417f200141016a102a000b200141016a2004102b000b417f200141016a102a000b200141016a2005102b000b417f200141016a102a000b200141016a2005102b000b20052009102a000b20092008102b000b417f2001102a000b20012054102b000b417f200141016a102a000b200141016a2005102b000b417f2001102a000b20012004102b000b417f200141016a102a000b200141016a2005102b000b417f200441016a102a000b200441016a200a102b000b200541011020000b417f205841016a102a000b205841016a2006102b000b417f2005102a000b20052004102b000b200141041020000b200141041020000b417f2001102a000b20012005102b000b417f2001102a000b2001200a102b000b2001205d102a000b205d2054102b000b200141011020000b200141041020000b200141041020000b200141041020000b417f2001102a000b20012004102b000b200141041020000b205d41011020000b417f2058102a000b20582004102b000b417f2001102a000b20012054102b000b200541041020000b200141081020000b200141041020000b417f202e102a000b202e200a102b000b417f202e41016a102a000b202e41016a200a102b000b200141041020000b410021210c110b410121210c110b410221210c110b410321210c110b410421210c110b410521210c110b410621210c110b410721210c120b410821210c120b410921210c130b410a21210c140b410b21210c150b410c21210c150b410d21210c160b410e21210c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b1021000b200241206a41086a20053602002021418080807871215a20214180807c712104202141087621050b2002205e3703202002290224210d205ea7210a0c090b20014110762105200141087621040c040b205c41087420017221012002200d3703a88004200da721280240205a450d00205d101d0b20022802ac8004210420ba01450d010b2003210503400240200541046a280200450d002005280200101d0b200541146a21052027416c6a22270d000b0b20b901450d1c2003101d0c1c0b2054101d0b200441ff0171410874200141ff017172210420054110742105205841ff01714108742109024020d401450d002003210103400240200141046a280200450d002001280200101d0b200141106a210120d20141706a22d2010d000b0b200420057221042009205c72210120d301450d182003101d0c180b202f450d1320d601101d0c130b0b41002104410021050b202141ff0171200541ff0171410874722004418080fc077172205a722101200d422088a72104200da7210602402053450d002055101d0b205d450d010b205b101d0b209701450d010b2003210503400240200541046a280200450d002005280200101d0b0240200541106a280200450d002005410c6a280200101d0b200541286a2105201f41586a221f0d000b0b209601450d162003101d0c160b201320910288210d4105211241002101202f450d0c2003101d0c0c0b2003101d0c120b202e202a4621010240202b450d00202c101d0b02402001450d002059ad42208620d301ad84210d410221050c040b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004210d20022802c08004210402402059450d00205941047421052003210103400240200141046a280200450d002001280200101d0b200141106a2101200541706a22050d000b0b200d422088210c410521014100210520d301450d0e2003101d0c0e0b200241c480046a28020020022802c88004462105024020022802bc8004450d0020022802b88004101d0b02402005450d002001ad42208620b901ad84210d410821050c030b20024103410220051b3a00a88004200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308210d2002280210210402402001450d00200141146c21052003210103400240200141046a280200450d002001280200101d0b200141146a21012005416c6a22050d000b0b200d422088210c410521014100210520b901450d0f2003101d0c0f0b2026202246210102402023450d002024101d0b02402001450d0020a701ad42208620a801ad84210d410421050c020b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088210c20022802c080042104410521014100210520a801450d102003101d0c100b200241c480046a28020020022802c88004462105024020022802bc8004450d0020022802b88004101d0b02402005450d002001ad422086209601ad84210d410321050c010b20024103410220051b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308210d2002280210210402402001450d00200141286c21052003210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200541586a22050d000b0b200d422088210c4105210141002105209601450d112003101d0c110b200020053a000420004100360200200041056a20022f00b880043b0000200041186a200c370200200041146a20013602002000410c6a200d370200200041086a2003360200200041206a2002290220370200200041076a200241ba80046a2d00003a0000200041286a200241206a41086a290200370200200241d080046a24000f0b2008ad422086200aad84210d2007450d010b2025101d0b2000200136020420004101360200200041106a2005360200200041086a200d370200200241d080046a24000f0b20154108762101203aad220c422086203bad84210d2033450d002034101d0b20004101360200200041106a2016360200200041086a200c422086200d42ffffffff0f838437020020002001410874201541ff017172360204200241d080046a24000f0b201241087621012030ad220d4220862031ad84211320022802bc8004450d0020022802b88004101d0b20004101360200200041106a2014360200200041086a200d422086201342ffffffff0f838437020020002001410874201241ff017172360204200241d080046a24000f0b200541ffffff07712205410874200841ff01717221012007ad220c4220862020ad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052021ad220c422086200aad84210d202b450d00202c101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052028ad220c422086200aad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b2021ad220c4220862005ad84210d410021052023450d002024101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052006ad220c422086200aad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200f410874201e41ff01717221012038ad220d4220862039ad84211020022802bc8004450d0020022802b88004101d0b20004101360200200041106a2011360200200041086a200d422086201042ffffffff0f83843702002000200f410874200141ff017172360204200241d080046a24000f0b200541ffffff07712204410874200a41ff01717221052008ad220c4220862007ad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2001360200200041086a200c422086200d42ffffffff0f838437020020002004410874200541ff017172360204200241d080046a24000f0b200b410874201a41ff01717221012036ad220d4220862037ad84210c200228020c450d002002280208101d0b20004101360200200041106a200e360200200041086a200d422086200c42ffffffff0f83843702002000200b410874200141ff017172360204200241d080046a24000f0b200241d080046a24000b160020002001280208360204200020012802003602000bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a280200101d0f0b0240200041086a280200450d00200041046a280200101d0b0240200041146a2802002201450d00200041186a280200450d002001101d0b200041246a280200450d12200041206a280200101d0f0b0240200041086a280200450d00200041046a280200101d0b200041146a280200450d11200041106a280200101d0f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200101d0b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a280200101d0f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a280200101d0f0b200041086a280200450d0e200041046a280200101d0f0b200041086a280200450d0d200041046a280200101d0f0b200041086a280200450d0c200041046a280200101d0f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200101d0b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a280200101d0f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a280200101d0f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d002006101d0b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a280200101d0f0b2000410c6a280200450d06200041086a280200101d0f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a280200101d0b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d002004280200101d0b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a280200101d0b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a280200101d0b200e200c6a21010240200e20116a280200450d00200e280210101d0b2001210e2001200f470d040c0c0b0240201920186a280200450d002019280200101d0b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a280200101d0b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a280200101d0b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a280200101d0b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a280200101d0b202420226a21010240202420276a280200450d002024280210101d0b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d002034101d0b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a280200101d0b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a280200101d0c040b200041086a280200450d03200041046a280200101d0f0b200041086a280200450d02200041046a280200101d0f0b200041086a280200450d01200041046a280200101d0f0b200041086a280200450d00200041046a280200101d0f0b0bb310012e7f230041a0016b2202240002400240024002402000280200220341f0c0c100460d00200028020421040c010b41ec00101f2203450d0141002104200341003b010620034100360200200341086a200241086a41e40010ce031a20004100360204200020033602000b200141ff017121050c010b41ec0041041020000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b10cf031a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b41037410cf031a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec00101f220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010ce0321092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a220710ce032109200b41146a200341cc006a200741037410ce03210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b10cf031a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b41037410cf031a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b10cf031a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b41037410cf031a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b2012101f2208450d02200820133b010620082013360200200820146a200241086a201510ce032106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a220710ce03212c2008201d6a2010201c6a2007201e7410ce03212d200820206a2010201f6a200920216a222e20227410ce03212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e10cf031a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e7410cf031a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b20227410cf031a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b10cf031a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e7410cf031a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b20227410cf031a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c01101f2207450d03200741003b010620074100360200200741086a200241086a41940110ce03210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a10cf031a2009200c3a0000201041146a220920064103746a200920274103746a2209200a41037410cf031a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b41027410cf031a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c0141041020000b41ec0041041020000b419c0141041020000b410121070c000b0b200241a0016a24000b8f4701af017f230041f0016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a28020021032001280208210441002105024002400240200141106a2802002206450d0041012107200241c0016a410172210841002109417f210a412c210b4109210c4108210d20024190016a41086a210e4111210f20024190016a41106a2110411921114118211220024190016a41186a21134121211420024190016a41206a21154127211620024190016a41276a2117410f2118417e2119410a211a410d211b4114211c200241c0016a41146a211d200241e4016a211e200241c0016a410c6a211f411c21204104212141ffffffff03212241702123410221244174212541582126416c212741002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021320c010b4100210941002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021010c010b410121010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b410421820120022802002183010240200241086a2802002201450d0020014104742132208301210103400240200141046a280200450d002001280200101d0b200141106a2101203241706a22320d000b0b02402002280204450d00208301101d0b2002410c6a2802002183010240200241146a2802002201450d00200141286c2132208301210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203241586a22320d000b0b0240200241106a280200450d00208301101d0b02402002411c6a280200450d00200241186a280200101d0b0240200241286a280200450d00200241246a280200101d0b0240200241346a280200450d00200241306a280200101d0b2002413c6a280200218301200241c4006a2802002201450d01410421840120830120014104746a21850141102186014109218701410821880141ffffffff032189014170218a01208301218b01410121320c2d0b0240024020320e050001030507070b200e20042006200a6a2206200b6c6a2201200c6a29000037030020102001200f6a2900003703002013200120116a2900003703002015200120146a2900003703002017200141286a2800003600002002200129000137039001024020012d000022332018460d0020082002290390013700002008200d6a200e290300370000200841106a2010290300370000200820126a2013290300370000200841206a2015290300370000200820166a2017280000360000200220333a00c00141012134203320196a2235201a4b22360d3c02400240024002400240024002400240024002400240024002400240024002400240024020350e0b000102030405060708090a000b201f2802002137200241c0016a200d6a280200213820022802c40121392030450d0a0240203a450d00203a202174213b2030210103400240200120216a280200450d002001280200101d0b200141106a2101203b20236a223b0d000b0b4100213b0240203c450d002030101d0b2037213a2038213c203921300c4e0b201f2802002137200241c0016a200d6a280200213820022802c4012139202f450d0a0240203d450d00203d41286c213b202f210103400240200120216a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203b20266a223b0d000b0b4100213e0240203f450d00202f101d0b2037213d2038213f2039212f4101213b0c4e0b201f2802002140200241c0016a200d6a280200210120022802c401213302402041450d00202e450d00202e101d0b2033212e2001214120060d200c2f0b201f2802002142200241c0016a200d6a280200210120022802c401213302402043450d00202d450d00202d101d0b2033212d2001214320060d1e0c2d0b201f2802002144200241c0016a200d6a280200210120022802c401213302402045450d00202c450d00202c101d0b2033212c2001214520060d1c0c2b0b201f2802002146200241c0016a200d6a280200214720022802c4012148202b450d072049450d42202b20492021746a214a202b214b4100214c0c4b0b201f2802002137200241c0016a200d6a280200213820022802c4012139202a450d0702402052450d002052201c6c213b202a210103400240200120216a280200450d002001280200101d0b2001201c6a2101203b20276a223b0d000b0b4100214f02402053450d00202a101d0b20372152203821532039212a4101213b4101213e4101214d41012150410121512036450d430c420b4101213120022802c401215420060d130c220b201f2802002155200241c0016a200d6a280200215620022802c40121572029450d062058450d422029205820206c6a21592029215a4101214c0c490b201f280200215c200241c0016a200d6a280200215d20022802c401215e2028450d06205f450d422028205f20126c6a2160202821614102214c0c490b201f2802002163200241c0016a200d6a280200216420022802c40121652009450d062066450d422009206620206c6a2167200921684103214c0c490b203921302038213c2037213a20060d190c280b2039212f2038213f2037213d20060d170c260b2048212b2047214e2046214920060d120c210b2039212a203821532037215220060d100c1f0b205721292056215b2055215820060d0e0c1d0b205e2128205d2162205c215f20060d0c0c1b0b20652109206421692063216620060d0a0c190b20062105410021010c430b0240208b012802082232450d00208b01280200210120322084017421320340024020012d0000208701470d0020012088016a28020020890171450d0020012084016a280200101d0b20012086016a21012032208a016a22320d000b0b208b012086016a21010240208b012084016a280200450d00208b01280200101d0b2001218b012001208501470d120b0240200241c0006a280200450d00208301101d0b200241c8006a280200218c010240200241d0006a2802002201450d00200141146c2132208c01210103400240200141046a280200450d002001280200101d0b200141146a21012032416c6a22320d000b0b0240200241cc006a280200450d00208c01101d0b200241dc006a280200218c01200241e4006a2802002201450d01411c218d01208c012001411c6c6a218e01410c218f014108219001411421910141042192014110219301410921940141ffffffff032195014170219601208c01219701410221320c2d0b0240209701208f016a2802002232450d00209701280204210120322092017421320340024020012d0000209401470d0020012090016a28020020950171450d0020012092016a280200101d0b20012093016a210120322096016a22320d000b0b02402097012090016a280200450d002097012092016a280200101d0b209701208d016a210102402097012091016a280200450d00209701280210101d0b20012197012001208e01470d110b0240200241e0006a280200450d00208c01101d0b200241e8006a280200219801200241f0006a2802002201450d014118219901209801200141186c6a219a014104219b014114219c014110219d01410c219e014109219f01410821a00141ffffffff0321a101417021a20120980121a301410321320c2d0b024020a301209b016a280200450d0020a301280200101d0b024020a301209c016a2802002232450d0020a30128020c21012032209b017421320340024020012d0000209f01470d00200120a0016a28020020a10171450d002001209b016a280200101d0b2001209d016a2101203220a2016a22320d000b0b20a3012099016a2101024020a301209d016a280200450d0020a301209e016a280200101d0b200121a3012001209a01470d100b0240200241ec006a280200450d00209801101d0b41800121a401200241f4006a28020021a501200241fc006a2802002201450d01411c21a60120a5012001411c6c6a21a701410c21a801410821a901411421aa01410421ab01411021ac01410921ad0141ffffffff0321ae01417021af0120a50121b001410421320c2d0b024020b00120a8016a2802002232450d0020b0012802042101203220ab017421320340024020012d000020ad01470d00200120a9016a28020020ae0171450d00200120ab016a280200101d0b200120ac016a2101203220af016a22320d000b0b024020b00120a9016a280200450d0020b00120ab016a280200101d0b20b00120a6016a2101024020b00120aa016a280200450d0020b001280210101d0b200121b001200120a701470d0f0b200220a4016a21010240200241f8006a280200450d0020a501101d0b2066410020091b21322069410020091b218601205f410020281b218a012062410020281b2187012058410020291b219d01205b410020291b21960120524100202a1b21940120534100202a1b21930120494100202b1b21a201204e4100202b1b219f0120444100202c1b21af0120454100202c1b21ad0120424100202d1b21ac0120434100202d1b21890120404100202e1b21880120414100202e1b218301203d4100202f1b219001203f4100202f1b21a901203a410020301b219501203c410020301b218401200920820120091b21a101202820820120281b21a001202920820120291b21ae01202a208201202a1b219201202b208201202b1b218b01202c208201202c1b219b01202d208201202d1b219701202e208201202e1b21ab01202f208201202f1b21a301203020820120301b21b001200110b703024020024184016a2201280200450d0020024180016a280200101d0b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2032360200200241f8006a208601360200200241f4006a20a101360200200241f0006a208a01360200200241ec006a208701360200200241e8006a20a001360200200241e4006a209d01360200200241e0006a209601360200200241dc006a20ae01360200200241d8006a2054360200200241d4006a2031360200200241d0006a209401360200200241cc006a209301360200200241c8006a209201360200200241c4006a20a201360200200241c0006a209f013602002002413c6a208b01360200200241386a20af01360200200241346a20ad01360200200241306a209b013602002002412c6a20ac01360200200241286a208901360200200241246a209701360200200241206a2088013602002002411c6a208301360200200241186a20ab01360200200241146a209001360200200241106a20a9013602002002410c6a20a301360200200241086a2095013602002002208401360204200220b00136020020002002418c0110ce031a200241f0016a24000f0b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410121320c1a0b410221320c1b0b410321320c1c0b410421320c1d0b410021010c2b0b410021010c2a0b410021010c290b410021010c280b410021010c270b410021010c260b410021010c250b410021010c240b410021010c230b410021010c220b410021010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410121010c1b0b410121010c1a0b410121010c190b410121010c180b410121010c170b410121010c160b410121010c150b410121010c140b410121010c130b410121010c120b410121010c110b410121010c100b410121010c0f0b410121010c0e0b410021010c0c0b410821010c0b0b410121010c0a0b410221010c090b410321010c080b410421010c070b410521010c060b410621010c050b410721010c040b410921010c030b410921010c020b410921010c010b410921010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0a00010203040f10111234340b4100214d0240204e450d00202b101d0b204621492047214e2048212b4101213b4101213e4101214f410121504101215120360d70410121010c87010b024020350e0b00040506070809720a0b0c000b203b450d4220022802c40121360240201f2802002201450d00200120217421332036210103400240200120216a280200450d002001280200101d0b200141106a2101203320236a22330d000b0b200241c0016a200d6a280200450d422036101d20060d160c210b410021500240205b450d002029101d0b205521582056215b205721294101213b4101213e4101214d4101214f410121512036450d6d0c6c0b4100215102402062450d002028101d0b205c215f205d2162205e21284101213b4101213e4101214d4101214f410121502036450d6a0c690b410021342069450d092009101d2063216620642169206521094101213b4101213e4101214d4101214f4101215041012151410021342036450d670c660b203e450d3e20022802c40121360240201f2802002201450d00200141286c21332036210103400240200120216a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203320266a22330d000b0b200241c0016a200d6a280200450d3e2036101d20060d110c1c0b200241c0016a200d6a280200450d3d20022802c401101d20060d0f0c1a0b200241c0016a200d6a280200450d3c20022802c401101d20060d0d0c180b200241c0016a200d6a280200450d3b20022802c401101d20060d0b0c160b204d450d3a20022802c401216a201f2802002201450d2b206a20012021746a216b206a216c4104214c0c6e0b204f450d3920022802c40121360240201f2802002201450d002001201c6c21332036210103400240200120216a280200450d002001280200101d0b2001201c6a2101203320276a22330d000b0b200241c0016a200d6a280200450d392036101d20060d080c130b2050450d3820022802c401216d201f2802002201450d2b206d200120206c6a216e206d216f4105214c0c6e0b2051450d3720022802c4012170201f2802002201450d2c2070200120126c6a2171207021724106214c0c6f0b2034450d3620022802c4012173201f2802002201450d2d2073200120206c6a2174207321754107214c0c700b206321662064216920652109410521010c790b4101213b410621010c780b4101213e410721010c770b4101214d4101214f41012150410121512036450d60410821010c760b024002400240024002402033201b4b0d000240024020330e0e0001020202020202023803040506000b200241c0016a200d6a280200450d3720022802c401101d20060d0f0c1a0b0240200241c0016a200d6a280200450d0020022802c401101d0b201d280200450d36200241c0016a41106a280200101d20060d0d0c180b0240200241c0016a200d6a280200450d0020022802c401101d0b0240201d2802002201450d00200241c0016a20126a280200450d002001101d0b201e280200450d35200241c0016a41206a280200101d20060d0e0c190b20022802c4012176201f2802002201450d2d2076200120206c6a2177207621784108214c0c700b20022802c4012179201f2802002201450d2e2079200120126c6a217a2079217b4109214c0c710b20022802c401217c201f2802002201450d2f207c200120206c6a217d207c217e410a214c0c720b02400240024020022d00c40122012024460d0020012007460d0120010d02201f280200450d34200241c0016a200d6a280200101d20060d0a0c150b201f280200217f201d2802002201450d32207f20012021746a218001207f218101410b214c0c750b201f28020021350240201d2802002201450d002001410c6c2133203521010340024020012802002236450d00200120216a280200450d002036101d0b2001410c6a2101203320256a22330d000b0b200241c0016a41106a280200450d322035101d20060d070c120b201f280200450d31200241c0016a200d6a280200101d0c310b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021010c6a0b410021010c690b410021010c680b410021010c670b410021010c660b410021010c650b410021010c640b410021010c630b410021010c620b410021010c610b410021010c600b410121010c5f0b410121010c5e0b410121010c5d0b410121010c5c0b410121010c5b0b410121010c5a0b410121010c590b410121010c580b410121010c570b410121010c560b410121010c550b02400240024002400240204c0e0c000102030406080a0c0e1012120b0240204b2802082237450d00204b2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b204b41106a21010240204b20216a280200450d00204b280200101d0b2001214b2001204a470d2e410021010c570b0240205a410c6a2802002237450d00205a2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240205a200d6a280200450d00205a20216a280200101d0b205a20206a21010240205a201c6a280200450d00205a280210101d0b2001215a20012059470d2e410221010c560b0240206120216a280200450d002061280200101d0b02402061201c6a2802002237450d00206128020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b206120126a21010240206141106a280200450d002061410c6a280200101d0b2001216120012060470d2e410321010c550b02402068410c6a2802002237450d0020682802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402068200d6a280200450d00206820216a280200101d0b206820206a210102402068201c6a280200450d002068280210101d0b2001216820012067470d2e410421010c540b0240206c2802082237450d00206c2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b206c41106a21010240206c20216a280200450d00206c280200101d0b2001216c2001206b470d2e0b200241c0016a200d6a280200450d0e206a101d20060d120c1b0b0240206f410c6a2802002237450d00206f2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240206f200d6a280200450d00206f20216a280200101d0b206f20206a21010240206f201c6a280200450d00206f280210101d0b2001216f2001206e470d2d0b200241c0016a200d6a280200450d0c206d101d20060d0f0c180b0240207220216a280200450d002072280200101d0b02402072201c6a2802002237450d00207228020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b207220126a21010240207241106a280200450d002072410c6a280200101d0b2001217220012071470d2c0b200241c0016a200d6a280200450d0a2070101d20060d0c0c150b02402075410c6a2802002237450d0020752802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402075200d6a280200450d00207520216a280200101d0b207520206a210102402075201c6a280200450d002075280210101d0b2001217520012074470d2b0b200241c0016a200d6a280200450d082073101d20060d090c120b02402078410c6a2802002237450d0020782802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402078200d6a280200450d00207820216a280200101d0b207820206a210102402078201c6a280200450d002078280210101d0b2001217820012077470d2a0b200241c0016a200d6a280200450d062076101d20060d0b0c140b0240207b20216a280200450d00207b280200101d0b0240207b201c6a2802002237450d00207b28020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b207b20126a21010240207b41106a280200450d00207b410c6a280200101d0b2001217b2001207a470d290b200241c0016a200d6a280200450d042079101d20060d0a0c130b0240207e410c6a2802002237450d00207e2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240207e200d6a280200450d00207e20216a280200101d0b207e20206a21010240207e201c6a280200450d00207e280210101d0b2001217e2001207d470d280b200241c0016a200d6a280200450d02207c101d20060d090c120b208101223941106a218101024020392802042201450d0002402039410c6a2802002237450d002037410c6c21370340024020012802002238450d00200120216a280200450d002038101d0b2001410c6a2101203720256a22370d000b0b2039200d6a280200450d00203920216a280200101d0b208101208001470d270b200241c0016a41106a280200450d00207f101d20060d080c110b2006450d08410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021010c3b0b410021010c3a0b410021010c390b410021010c380b410021010c370b410021010c360b410021010c350b410021010c340b410021010c330b410121010c320b410121010c310b410121010c300b410121010c2f0b410121010c2e0b410121010c2d0b410121010c2c0b410121010c2b0b410121010c2a0b4100214c0c140b4101214c0c140b4102214c0c140b4103214c0c140b4104214c0c150b4105214c0c160b4106214c0c170b4107214c0c180b4108214c0c190b4109214c0c1a0b410a214c0c1b0b410b214c0c1c0b410821010c1c0b410121010c1b0b410821010c1a0b410121010c190b410821010c180b410121010c170b410821010c160b410121010c150b410821010c140b410921010c130b410921010c120b410921010c110b410921010c100b410921010c0f0b410921010c0e0b410921010c0d0b410921010c0c0b410921010c0b0b410921010c0a0b410921010c090b410921010c080b410921010c070b410921010c060b410921010c050b410921010c040b410921010c030b410921010c020b410921010c010b410921010c000b0b0b980c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a2000104420022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d101e2209450d020c120b200028020021090c120b201d101f22090d100b201d41041020000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b2001101d200241106a2400200b0f0b1021000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a3602002002200010442002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c101f2207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e101e2207450d020c040b2009210d0c040b200e101f22070d020b200e41041020000b412c41041020000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c2013101e2207450d020c030b410021140c040b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c2013101e2207450d010c020b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c2013101e2207450d020c030b410021190c040b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c2012101e2207450d020c030b4101211e0c040b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c2012101e2207450d010c020b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c2013101e2207450d010c020b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c2012101e2207450d010c020b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c2012101e2207450d020c030b4101212a0c040b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c2028101e2207450d010c020b2028101f22070d010b202841041020000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c2030101e2207450d020c040b200920016a21010c040b2030101f22070d020b203041041020000b1021000b202e210d0b20072009412c6c6a200e202d10ce031a0240202c450d00200e101d0b0240024002400240024041c005101f2209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10b7032009101d2028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c00541041020000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e2013101d410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a280200101d0b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a280200101d0b203b20316a21010240203b20356a280200450d00203b280210101d0b2001213b20012032470d09410021010c150b02402047203f6a280200450d002047280200101d0b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a280200101d0b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a280200101d0b200121472001203e470d090b2026450d002027101d0b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a280200101d0b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a280200101d0b205220486a210102402052204c6a280200450d002052280210101d0b2001215220012049470d070b2023450d002024101d0b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d002001280200101d0b200141146a21012009416c6a22090d000b0b201f450d002020101d0b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a280200101d0b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a280200101d0b2001215a20012054470d050b201a450d00201b101d0b02402017410047201941017371450d002018101d0b02402015410047201141017371450d002016101d0b0240200f410047201441017371450d002010101d0b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200941586a22090d000b0b200a450d00200b101d0b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d002001280200101d0b200141106a2101200941706a22090d000b0b2003450d002004101d0b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b6d01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c200341d8b1c400360208200320033602282003200341046a3602202003200341206a360218200341086a200010cf01000b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d01200028020020034104742008101e2205450d020c050b200341016a2104200028020021050c050b2008101f22050d030b200841081020000b1021000b41c8aec400102c000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b41047410cf031a200541086a200241086a29030037030020052002290300370300200041086a20043602000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b2000101d2005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b2001101d2005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021042001101d2004450d00024020042802002201450d0003402004101d2001210420012802002200210120000d000b0b2004101d0b0b9d0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10482103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a28020020044102742008101e2205450d020c030b200041186a28020021050c030b2008101f22050d010b200841041020000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c2006101e2205450d020c040b200041e8006a28020021050c040b2006101f22050d020b200641041020000b1021000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000ba68f0117097f017e5a7f037e047f017e117f017e177f017e1b7f027e137f037e497f027e017f017e117f047e117f017e1e7f23002203210420034180096b416071220324000240024002400240024002400240024002404110101f2205450d00200541063a00004120101f2206450d01200641063a001020064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d002005280204101d0b2005101d200141106a2802002207412c6c21052001280208220841586a210902400240024002400240024003402005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004107470d000b200320032f01a0033b01c005200b41046a280200200b41086a2802002205470d01200541016a22092005490d0e2005410174220a20092009200a491b220aad420486220c422088a70d0e200ca722074100480d0e2005450d04200b28020020054104742007101e2209450d050c0b0b4110101f2209450d0720094180023b010c200942828080802037020420092006360200200920032f01a0033b010e2001410c6a2802002007470d09200741016a22052007490d0d2007410174220a20052005200a491b2205ad422c7e220c422088a70d0d200ca7220a4100480d0d2007450d0120082007412c6c200a101e2208450d020c080b200b28020021090c0a0b200a101f22080d060b200a41041020000b2007101f22090d060b200741041020000b411041081020000b412041081020000b411041041020000b2001410c6a2005360200200141086a20083602000b200141106a200741016a220d36020020082007412c6c6a220520032f00b0043b0001200541073a0000200542818080801037000820052009360004200520032902c005370210200541036a200341b2046a2d00003a0000200541186a200341c8056a290200370200200541206a200341c0056a41106a290200370200200541286a200341c0056a41186a2802003602004100210e0c020b200b2009360200200b41046a200a360200200b41086a28020021050b200920054104746a22054180023b010c200542828080802037020420052006360200200520032f01c0053b010e200b41086a2205200528020041016a360200200341c0006a200b10442003280244417f6a210e200141106a280200210d200141086a28020021080b200d412c6c2105200841586a210902400340410021062005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004103470d000b200b41086a2802002205450d00200541286c2109200b28020041186a2105410021060340200620052d0000456a2106200541286a2105200941586a22090d000b0b200d412c6c2105200841586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b200d412c6c2105200841606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b02402005200a6a220fad220c421e88a70d00200c420286a72205417f4c0d0002400240024002400240024002402005450d00200510792208450d02200f0d010c030b41042108200f450d030b2008200f4102746a2110410021114101211241042113200141106a2114412c211541082116200141086a211741582118415421194128211a410b211b4118211c4103211d2008211e4100211f0c030b200541041020000b410021050c020b410021050c010b410121050b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e020001010b200141086a2802002121412c2123200141106a2802002220450d2f0c010b024002400240024002400240024002400240201f0e050001030405050b024020112006490d002014280200222020156c220a21052017280200222120186a220b210902400340410021072005450d01200520196a21052009201a6a210d200920156a22222109200d2d0000201d470d000b202220166a2802002205450d002005201a6c21092022280200201c6a2105410021070340200720052d0000456a21072005201a6a2105200920186a22090d000b0b201120076b220720114b0d060340200a450d03200a20196a210a200b201a6a2105200b20156a2209210b20052d0000201b470d000b200920166a28020020074d0d0720092802002007201c6c6a2802082109200341c0056a2007200110ad0320032802c405210520032802c0052012460d08201e200520096a3602000b201120126a2111201e20136a221e2010470d0c410021050c3b0b20212d0000202a470d34202128020c2205450d34202128020422702005202b6c6a2171410021720c1b0b412c101f2205450d07200541286a41002800c9a042360000200541206a41002900c1a042370000200541186a41002900b9a042370000200541106a41002900b1a042370000200541086a41002900a9a042370000200541002900a1a0423700000c2e0b20840121c10102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020b601208c01712205207c460d002005208d01470d01410021050c430b20b701208c01712205208d01460d0102402005207c470d000340208a012081016b208e014d0d0520810128020c450d092081012090016a2205280200450d0d2081012092016a2205280200450d112081012095016a21052081012094016a220921810120052802000d000b2009218101200528020421c2010c160b0340208a012081016b208e014d0d0520810128020c450d092081012090016a2205280200450d0d2081012092016a2205280200450d112081012095016a21052081012094016a220921810120052802000d000b20092181010c170b20b701208c01712205208d01460d0102402005207c470d000340208a012081016b208e014d0d0620810128020c450d0a2081012090016a2205280200450d0e2081012092016a2205280200450d122081012095016a21052081012094016a220921810120052802000d000b20092181010c120b0340208a012081016b208e014d0d0620810128020c450d0a2081012090016a2205280200450d0e2081012092016a2205280200450d132081012095016a21052081012094016a220921810120052802000d000b20092181010c1a0b20b901207c470d1a20830120b801460d1a0c3f0b20b901207c470d2a20830120b801460d29410321050c3f0b208101208a01460d412081012096016a2105034020810128020c450d1120052089016a21052081012089016a228101208a01470d000c420b0b0240208101208a01460d00208101208f016a2105034020810128020c450d1320052089016a21052081012089016a228101208a01470d000b208a012181010b20b901207c470d240c230b410121b701208101208a01460d2a2081012096016a2105034020810128020c450d1320052089016a21052081012089016a228101208a01470d000b208a012181012085010d2b0c3f0b0240208101208a01460d00208101208f016a2105034020810128020c450d1520052089016a21052081012089016a228101208a01470d000b208a012181010b20b901207c470d240c230b208101208f016a21052081012089016a218101200528020421c2010c0d0b208101208f016a21052081012089016a2181010c0e0b208101208f016a21052081012089016a2181010c080b208101208f016a21052081012089016a2181010c100b2081012091016a218101200528020421c2010c090b2081012091016a2181010c0a0b2081012091016a2181010c040b2081012091016a2181010c0c0b2081012093016a218101200528020421c2010c050b2081012093016a2181010c060b2081012093016a2181010b200528020421c2010c060b2081012093016a2181010c070b2005208b016a218101200528020021c2010b410121b60120c101218401410121b701200320c20136027c20080d1f0c2d0b20052097016a2181010b410021b701410121b60120c1012184012003200528020422c20136027c20080d1a0c2b0b2005208b016a218101200528020021c2010b410121b701410021b60120c101218401200320c20136027c20080d1a0c290b20052097016a2181010b410021b60120c101218401410021b7012003200528020422c20136027c20080d170c270b0340208201208801460d29200341286a20820110ae032003280228228301450d292082012087016a218201208301208301200328022c208d01746a22b801470d250c000b0b20bf01220520e2016a21bf01200528020021bb02200341e0006a21bc02200328026421bd020c100b024020c2022d0000220520c402460d000240200520d002460d00200520c802470d2720c20228020c2205450d2720c20228020422d202200520d1026c6a21d302410a21720c210b20c20228020421d702200341e0006a21d802200328026421d9020c110b20c20228020c2205450d2520c20228020422da02200520c5026c6a21db02410c21720c210b412c101f2205450d04200541286a410028009da042360000200541206a4100290095a042370000200541186a410029008da042370000200541106a4100290085a042370000200541086a41002900fd9f42370000200541002900f59f423700000c2a0b411e101f2205450d04200541166a41002900e3a042370000200541106a41002900dda042370000200541086a41002900d5a042370000200541002900cda042370000429e808080e003210c0c2a0b200341c8056a290300210c2008101d20050d2a41002108412c21232020450d2e0b2021202020236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c411a216d4201216e41f0adc400216f4101211f0c040b412c41011020000b412c41011020000b411e41011020000b4100211f410121050c2e0b410121050c2d0b410321720c0e0b410421720c0e0b410521720c0e0b410621720c0e0b410721720c0e0b410821720c0e0b410921720c0e0b410b21720c0f0b410021050c110b410121050c100b410221050c0f0b410221050c0e0b410221050c0d0b410221050c0c0b410421050c0b0b410421050c0a0b410421050c090b410421050c080b410421050c070b410421050c060b410421050c050b410421050c040b410421050c030b410421050c020b410421050c010b208301450d0320830128020021c201410121b601410221b70120c101218401208301208b016a218301410121b901200320c20136027c2008450d01410221050b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e05000102030f0f0b208501450d3a410121050c370b410221b60141002184014100218501200320c10122c20136027c2008450d37410221050c360b200f20c2014d0d05200820c201208d01746a2802002209450d0b20bb0120ba01470d0320ba01207c6a220520ba01490d4a20ba01207c74220a20052005200a491b22bb01ad20800186220c20980188a70d4a200ca72205207f480d4a20ba01450d0120bd0120ba01208d01742005101e22bc010d020c090b208301208b016a2105208301450d0320830128020021c201410121b901410221b701410021b60120c1012184012005218301200320c20136027c20080d180c350b2005101f22bc01450d070b20bc0121bd0120bc0121be0120bc0121bf010b20bf0120ba01208d01746a20c201360200200341c0056a200328027c22c301200341c8006a10b003200341c0056a2097016a22c40128020021c50120032802c40521c00120032802c00522c601207c460d0220c00128020822052099014c0d4520c0012d000c210b024002402005450d0020c00128020021072005101f220a450d06200a2007200510ce031a0c010b4101210a0b20c001209a016a2d000021072003200936029c012003200328027c360298012003207f36029001200320073a008d012003200b3a008c01200320053602880120032005360284012003200a3602800102400240200328027022c701208601460d00200328027421c8010c010b209b01101f22c701450d07410021c80120c70141003b010620c701410036020020c7012097016a200341c0056a209c0110ce031a20034100360274200320c7013602700b20ba01207c6a21ba010c090b410121b901410221b70120052183012085010d120c330b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c405200341e0aec4003602c0052003200341fc006a3602a003200341b0046a200341c0056a102820032902b404228001422088a7210920032802b00421c001208001a721c5010c010b200341c0056a208f016a28020021090b20032802702003280274200341f8006a28020010b203024020bb01450d0020bc01101d0b0240207d450d00207d412c6c217c207e21050340200510452005412c6a2105207c41546a227c0d000b0b0240200341d4006a280200450d00207e101d0b200020c00136020420004101360200200041086a2009ad42208620c501ad843702002008450d39200f450d392008101d200424000f0b200541011020000b200541041020000b41940341041020000b4102211f410121050c3c0b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0d000102060708090b0c0f101112120b207020256a22732802002274450d4d2070202c6a2175410021760c410b20c7012097016a210a20c7012f01062207208d01742109417f21050240024002400240024003402009450d012005207c6a2105207f209901207c200a280200220b20c3014b1b200b20c301461b220b450d04200920b3016a2109200a208b016a210a200b207c460d000b20c8010d010c020b2007210520c801450d010b20c8012099016a21c80120c7012005208d01746a209b016a28020021c701410121720c380b200341f0006a2097016a22092009280200207c6a360200200329039801210c20032903900121c90120032903880121ca0120032903800121cb0120c7012f01062209209e014f0d0120c7012097016a220a2005207c6a220b208d01746a200a2005208d01746a220a200920056b208d017410cf031a200a20c30136020020c7012092016a2209200b209f01746a20092005209f01746a220920c701209d016a220a2f010020056b209f017410cf031a200920a0016a200c370200200920c901370210200920ca01370208200920cb01370200200a200a2f0100207c6a3b010020c601450d220c480b20c7012005209f01746a220520a9016a200329039801370200200520aa016a220929020021c901200920032903900137020020052093016a20032903880137020020052092016a2205290200210c200520032903800137020020c90120b5018320800185500d46200c20b40183500d46200ca7101d0c460b209b01101f2209450d1b2009207f3b01062009207f36020020092097016a200341c0056a209c0110ce03210b200341c0056a20a0016a22cc0120c70120a1016a290200370300200341c0056a2096016a22cd0120c70120a2016a29020037030020c40120c70120a3016a290200370300200320c7012902f4013703c00520c70128022021ce01200b20c70120a4016a20c701209d016a22072f010020a5016a220a208d017410ce03210b20092092016a20c70120a6016a200a209f017410ce03210d2007209d013b01002009200a3b0106200341b0046a20a0016a22cf0120cc01290300370300200341b0046a2096016a22d00120cd01290300370300200341b0046a2097016a22d10120c401290300370300200320032903c0053703b004024002402005209d014b0d0020c7012097016a220a2005207c6a220b208d01746a200a2005208d01746a220720c701209d016a220a2f010020056b208d017410cf031a200720c30136020020c7012092016a2207200b209f01746a20072005209f01746a220b200a2f010020056b209f017410cf031a200b20a0016a200c370200200b20c901370210200b20ca01370208200b20cb013702000c010b200b200520b0016a221f208d01746a200b200520a5016a2207208d01746a2205200a20ab017120076b208d017410cf031a200520c301360200200d201f209f01746a200d2007209f01746a22052009209d016a220a2f010020076b209f017410cf031a200520a0016a200c370200200520c901370210200520ca01370208200520cb013702000b200a200a2f0100207c6a3b0100200341a0036a20a0016a22d20120cf01290300370300200341a0036a2096016a22d30120d001290300370300200341a0036a2097016a22d40120d101290300370300200320032903b0043703a00320034190026a20a0016a22d50120d20129030037030020034190026a2096016a22d60120d30129030037030020034190026a2097016a22d70120d401290300370300200320032903a0033703900220c70128020022d801450d0120c7012f010421d901200921da010c260b20d20120d50129030037030020d30120d60129030037030020d40120d70129030037030020032003290390023703a00320d90120ab0171210720d8012f0106220520ac014d0d0220a701101f220b450d1b200b207f3b0106200b207f360200200b2097016a200341c0056a20a80110ce03210920d8012090016a280200212220cc0120d80120a1016a29020037030020cd0120d80120a2016a29020037030020c40120d80120a3016a290200370300200320d80120ae016a2902003703c005200920d80120a4016a20d801209d016a221f2f0100220a20a5016a2205208d017410ce032178200b2092016a20d80120a6016a2005209f017410ce032179200b209b016a20d80120af016a200a20b0016a220d208d017410ce032120201f209d013b0100200b20053b01060240200d450d00410021052020210903402009280200220a20053b0104200a200b3602002009208b016a2109200d2005207c6a2205470d000b0b20cf0120cc0129030037030020d00120cd0129030037030020d10120c401290300370300200320032903c0053703b00420cc0120cf0129030037030020cd0120d00129030037030020c40120d101290300370300200320032903b0043703c0050240024020d90120ab01712209209d014b0d0020d8012097016a22052007207c6a220d208d0174220a6a20052007208d017422206a2205201f2f0100227820076b2279208d017410cf031a200520ce0136020020d8012092016a2205200d209f01746a20052007209f01746a22052079209f017410cf031a200520a0016a20d20129030037020020052096016a20d30129030037020020052097016a20d401290300370200200520032903a003370200201f2078207c6a22053b010020d801209b016a221f20206a2097016a201f200a6a221f200520ab0171220a200d6b208d017410cf031a201f20da013602002009200a4f0d0120d80120206a20ad016a21050340200528020022092007207c6a22073b0104200920d8013602002005208b016a2105200a2007470d000c020b0b2078200720b0016a220a208d0174221f6a2078200720a5016a2205208d01746a2209200b209d016a220d2f010020056b208d017410cf031a200920ce013602002079200a209f01746a20792005209f01746a2209200d2f010020056b209f017410cf031a200920a0016a20d20129030037020020092096016a20d30129030037020020092097016a20d401290300370200200920032903a003370200200d200d2f0100207c6a22093b010020202007208d017422ce016a20b1016a2020201f6a220d200920ab01712207200a6b208d017410cf031a200d20da01360200200a20074b0d00200b20ce016a20b2016a210903402009280200220a2005207c6a22053b0104200a200b3602002009208b016a210920072005470d000b0b20d50120cc0129030037030020d60120cd0129030037030020d70120c401290300370300200320032903c00537039002024020d8012802002205450d0020d8012f010421d901200521d801202221ce01200b21da01410221720c370b202221ce0120a701101f22050d010c1c0b2009210b20a701101f2205450d1b0b2005207f3b01062005207f36020020052097016a200341c0056a20a80110ce0321072005200328027022093602940320032003280274207c6a3602742009207f3b01042003200536027020092005360200200520052f0106220a209f01746a220920a9016a20d501290300370200200920aa016a20d60129030037020020092093016a20d70129030037020020092092016a2003290390023702002007200a208d01746a20ce013602002005209b016a200a207c6a2209208d01746a200b360200200520093b0106200b20093b0104200b200536020020c6010d430c1c0b20d8012097016a22092007207c6a220a208d0174220b6a20092007208d0174220d6a2209200520076b221f208d017410cf031a200920ce0136020020d8012092016a2209200a209f01746a20092007209f01746a2209201f209f017410cf031a200920a0016a20d20129030037020020092096016a20d30129030037020020092097016a20d401290300370200200920032903a00337020020d801209d016a2005207c6a22053b010020d801209b016a2209200d6a2097016a2009200b6a2209200520ab0171220b200a6b208d017410cf031a200920da013602002007200b4f0d4120d801200a2099016a2205208d01746a20ad016a210903402009280200220a2005207c6a22053b0104200a20d8013602002009208b016a2109200b2005470d000c420b0b20830120b801460d23208301450d4b20830128020021c201410121b601410221b70120c101218401208301208b016a218301410121b901200320c20136027c20080d2b0c490b208201208801460d4a200341206a20820110ae032003280220228301450d4a2082012087016a2182012083012003280224208d01746a21b8010c210b024020830120b801460d00208301208b016a2105208301450d0220830128020021c201410121b901410221b701410021b60120c1012184012005218301200320c20136027c20080d2c0c480b410121b90120b801218301410621720c340b410221b701208201208801460d03200341106a20820110ae032082012087016a21820120032802102205450d2320052003280214208d01746a21b80120052183010c210b410121b901410221b70120052183012085010d250c470b410121b90120b801218301410821720c330b410221b701208201208801470d010b2088012182012085010d210c440b200341186a20820110ae032082012087016a21820120032802182205450d1f20052283012005200328021c208d01746a22b801470d260c1d0b20bc02280200220b20dd016a210a200b2f0106220d20df01742109417f210502400240024003402009450d01200520e5016a210520e60120e30120e501200a280200220720bb024b1b200720bb02461b2207450d03200920e7016a2109200a20e2016a210a200720e501460d000b20bd020d010c080b200d210520bd02450d070b20bd0220e3016a21bd02200b200520df01746a20e4016a21bc02410921720c310b200b20e9016a200520e801746a2220450d0520202802182109202028021c210520ea01200e36020020ec0120ed013a000020ef0120f0013a000020f101200536020020f30120f4013a000020f501200e36020020f70120f8013a000020f901200936020020fb0120fc013a000020fe0120ff013a000020810220e6013a00002083022084023b01002086022087023a00002088022002360200208a0220f4013a0000208b02200e360200208d0220f8013a0000200341c0056a20e9016a2278200e360200208f0220ed013a00002091022092023a0000209402200536020020dc0120f4013a00002003200e3602c405200320f8013a00c0052020280208220d20db016a2205ad220c20960288a70d53200c20950286a7220920e3014c0d53202020dd016a2122024002400240024002402009450d002009101f2207450d0d2022280200220d450d020c010b41082107200d450d010b4100210b410021090340024020092005470d00200520e5016a220a2005490d59200520e50174221f200a200a201f491b220aad20950286220c20980288a70d59200ca7221f20e601480d59024002402005450d002007200520e20174201f101e22070d010c0b0b201f101f2207450d0a0b200a21050b2007200b6a220a2097023a0000200a20e2016a2009360200200a20ba026a200341a0036a20df016a2d00003a0000200a20e5016a20032f01a0033b0000200b20db016a210b200920e5016a220a2109200d200a470d000b2005200a6b2097024f0d020c010b4100210a200541006b2097024f0d010b200a2097026a2209200a490d55200520e50174220b20092009200b491b2209ad20950286220c20980288a70d55200ca7220b20e601480d55024002402005450d002007200520e20174200b101e22070d010c0e0b200b101f2207450d0d0b200921050b200341b0046a200341c0056a10b3032007200a20e201746a220920032903b004370300200920dd016a200341b0046a20dd016a220b290300370300200341b0046a20dc0110b30320092099026a200b290300370300200920032903b004370310200341b0046a20910210b3032009209a026a200b29030037030020092090026a20032903b004370300200341b0046a208f0210b3032009209b026a200b2903003703002009208e026a20032903b004370300200341b0046a208d0210b3032009209c026a200b2903003703002009208c026a20032903b004370300200341b0046a208a0210b3032009209d026a200b29030037030020092089026a20032903b004370300200341b0046a20860210b3032009209e026a200b29030037030020092085026a20032903b004370300200341b0046a20830210b3032009209f026a200b29030037030020092082026a20032903b004370300200341b0046a20810210b303200920a0026a200b29030037030020092080026a20032903b004370300200341b0046a20fe0110b303200920a1026a200b290300370300200920fd016a20032903b004370300200341b0046a20fb0110b303200920a2026a200b290300370300200920fa016a20032903b004370300200341b0046a20f70110b303200920a3026a200b290300370300200920f6016a20032903b004370300200341b0046a20f30110b303200920a4026a200b290300370300200920f2016a20032903b004370300200341b0046a20ef0110b303200920a5026a200b290300370300200920ee016a20032903b004370300200341b0046a20ec0110b303200920a6026a200b290300370300200920eb016a20032903b00437030002400240024002402005200a2097026a2209470d00200520e5016a22092005490d58200520e50174220b20092009200b491b221fad20950286220c20980288a70d58200ca7220920e601480d582005450d012007200520e201742009101e22070d020c100b2005211f0c020b2009101f2207450d0e0b200521090b2007200920e201746a220520ff013a0000200520dd016a20a702290000370000200520032900b004370001200341b0046a20034180016a20a80210ce031a20db01101f2209450d06200920ff013a0000200341a0036a200341b0046a20a80210ce031a2022280200220520e3014c0d53024002402005450d002020280200210b2005101f220d450d0b200d200b200510ce03210b2005101f220d450d0c200d200b200510ce031a200b101d2005ad210c0c010b4101210d41014101200510ce031a2005ad210c410021050b200341b0046a200341a0036a20a80210ce031a202031000d21c901200341a0036a200341b0046a20a80210ce031a200341b0046a200341a0036a20a80210ce031a20034190026a200341b0046a20a80210ce031a20db01101f220b450d07200a20db016a210a20be0220a9027121be0220bf0220aa028322bf02200c8420c90120ac02868420ad0284210c200b20ff013a0000200b101d200341a0036a20034190026a20a80210ce031a200341b0046a200341a0036a20a80210ce031a024020092d000020ae02470d00200928020820af0271450d002009280204101d0b2009101d20034190026a200341b0046a20a80210ce031a200341b0046a20034190026a20a80210ce031a20b00220be02360200200341a0036a209a026a200a36020020b202201f360200200341a0036a2090026a200736020020b30220e601360200200341a0036a2093026a20950237020020b402200c370200200341a0036a20dd016a20053602002003200d3602a403200320e5013602a003200341b0046a200341a0036a104e20034180016a200341b0046a20a80210ce031a202020e501360210202020e101360214024020032d00c00520ae02470d0020de0128020020af0271450d0020032802c405101d0b024020dc012d000020ae02470d00200341c0056a2099026a28020020af0271450d00209402280200101d0b02402091022d000020ae02470d00200341c0056a209a026a28020020af0271450d00200341c0056a20b1026a280200101d0b0240208f022d000020ae02470d00200341c0056a209b026a28020020af0271450d002078280200101d0b0240208d022d000020ae02470d00200341c0056a209c026a28020020af0271450d00208b02280200101d0b0240208a022d000020ae02470d00200341c0056a209d026a28020020af0271450d00208802280200101d0b02402086022d000020ae02470d00200341c0056a209e026a28020020af0271450d0020b502280200101d0b02402083022d000020ae02470d00200341c0056a209f026a28020020af0271450d0020b602280200101d0b02402081022d000020ae02470d00200341c0056a20a0026a28020020af0271450d0020b702280200101d0b024020fe012d000020ae02470d00200341c0056a20a1026a28020020af0271450d0020b802280200101d0b024020fb012d000020ae02470d00200341c0056a20a2026a28020020af0271450d0020f901280200101d0b024020f7012d000020ae02470d00200341c0056a20a3026a28020020af0271450d0020f501280200101d0b024020f3012d000020ae02470d00200341c0056a20a4026a28020020af0271450d0020f101280200101d0b024020ef012d000020ae02470d00200341c0056a20a5026a28020020af0271450d0020b902280200101d0b024020ec012d000020ae02470d00200341c0056a20a6026a28020020af0271450d0020ea01280200101d0b20bf0220ab028421bf0220e10120e5016a21e10120bf0120e001470d130c430b20d20228020c0d3520d20228021021d402200341e0006a21d502200328026421d6020c320b20d802280200220b20c8026a210a200b2f0106220d20c602742109417f21050240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220720d7024b1b200720d702461b2207450d04200920cd026a2109200a20c7026a210a200720cb02460d000b20d9020d010c410b200d210520d902450d400b20d90220c9026a21d902200b200520c602746a20ca026a21d802410b21720c2f0b20da022802182205450d3220da0228021022dc02200520c602746a21dd02410221050c310b200b20cf026a200520ce02746a2205450d3d2005280210450d0c20c20220c7026a20052802143602000c3d0b201f41081020000b4192a5c200418001103a000b411041081020000b411041081020000b200941081020000b200541011020000b200541011020000b200b41081020000b200941081020000b41940341041020000b41c40341041020000b41c40341041020000b4192a6c2004135103a000b4102211f0c020b4102211f0c020b4103211f0c020b410121050c3d0b410121050c3c0b410121050c3b0b410121720c0e0b410221720c0f0b410321720c100b410421720c100b410521720c100b410721720c110b410021050c210b410021050c200b410121050c1f0b410121050c1e0b410121050c1d0b410221050c1c0b410221050c1b0b410221050c1a0b410321050c190b410421050c180b410421050c170b410421050c160b410421050c150b410421050c140b410421050c130b410421050c120b410421050c110b410421050c100b410421050c0f0b410421050c0e0b410421050c0d0b410021050c010b410121050b0340024002400240024002400240024002400240024002400240024002400240024002400240024020050e03000102020b207620744f0d020240024002400240024020752802002076202d7422206a22052d0000202a470d0020032005202d6a2205360290022008450d08200f200528020022054d0d0420082005202e746a2802002209450d00202f200e360200203020313a0000203220333a000020342009360200203520363a00002037200e360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200e360200204720393a00002048200e360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200e3602c40520732802002222207620286a221f490d0a2073207636020020752802002105200341b0046a202b6a220d2027360200200341b0046a204d6a227820753602002050200520206a2207204d6a220b3602002003201f3602b004200341b0046a202c6a22792005201f202d74227a6a227b3602002026200341c0056a36020020032022201f6b22743602b404200b2105024020072d0000220a2051460d00410021050340200720056a21090240200a206c712052470d002009204f6a280200205371450d002009202d6a280200101d0b2005450d0320502009204a6a3602002005204d6a21052009204d6a2d0000220a2051470d000b200720056a204d6a21050b2005207b470d020c030b410121050c150b2009204d6a2205207b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a280200101d0b200b2005470d000b0b024002400240024002402074450d00201f20702802142205470d0120272220200341c0056a22096b202d7622050d020c040b2075202610b403205028020022052079280200220b470d140c150b20202005202d7422056b210a207528020020056a2105200341c0056a22092027460d01034020262009204d6a360200200341a0036a200910b30320032d00a0032051460d13200520032903a0033703002005204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240200a450d002005204d6a2105200a206b6a210a20262802002209200d280200470d010c030b0b200d2802002220202628020022096b202d762205450d020b02400240024002402078280200220b202d6a2207280200220a20226b20054f0d00202220056a227b2022490d39200a2028742222207b207b2022491b2222ad206886220c206988a70d39200ca7227b203f480d39200a450d01200b280200200a202d74207b101e220a0d020c0d0b200b280200210a0c020b207b101f220a450d0b0b200b200a360200200720223602000b200a201f20056a2207202d746a200a207a6a2074202d7410cf031a200320073602b0042007200b280208220a460d01207620056a202d74200a202d7422056b210a200b28020020056a210520092020460d00034020262009204d6a360200200341a0036a200910b30320032d00a0032051460d12200520032903a0033703002005204f6a200341a0036a204f6a290300370300200b204f6a2209200928020020286a360200200a450d022005204d6a2105200a206b6a210a20262802002209200d280200470d000b0b200320513a00a003205028020022052079280200220b470d110c120b200341a0036a204f6a2205203f360200200320673703a003200341a0036a202610b40320032802a003222220052802002209202d7422076a210b20032802a403217b2022210502402009450d00024002400240024020782802002220202d6a2274280200220520032802b404220d20032802b00422096a221f6b2007202d75220a4f0d00201f200a6a227a201f490d382005202874221f207a207a201f491b227aad206886220c206988a70d38200ca7221f203f480d382005450d0120202802002005202d74201f101e22050d020c0d0b202028020021050c020b201f101f2205450d0b0b202020053602002074207a3602000b20052009200a6a220a202d74221f6a20052009202d746a200d202d7410cf031a2003200a3602b00420222105200a20202802082209460d0020202802002205201f6a217420052009202d746a210a2022210903402007450d0e200341a0036a202e6a22052009206a6a2d00003a0000200320092f00013b01a00320092d0000220d2051460d0d2009202d6a290200210c2009202c6a280200211f200a200d3a0000200a202c6a201f360200200a202d6a200c37020020032f01a003210d200a206a6a20052d00003a0000200a20286a200d3b00002020204f6a2205200528020020286a3602002007206b6a21072009204d6a22052109200a204d6a220a2074470d000b0b2005200b460d0e0c0d0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a102820032802b0042205450d1c20032902b4042180012000200536020420004101360200200041086a2080013702002008450d28200f450d282008101d0c280b20d502280200220b20c8026a210a200b2f0106220d20c602742109417f210502400240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220720d4024b1b200720d402461b2207450d03200920cd026a2109200a20c7026a210a200720cb02460d000b20d6020d010c160b200d210520d602450d150b20d60220c9026a21d602200b200520c602746a20ca026a21d502410121050c120b200b20cf026a200520ce02746a2205450d132005280210450d0720d20220c0026a20052802143602000c130b20dc02222020c7026a21dc022020280200210b200341e0006a21052003280264211f024003402005280200220720c8026a210a20072f0106222220c602742109417f210502400240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220d200b4b1b200d200b461b220d450d03200920cd026a2109200a20c7026a210a200d20cb02460d000b201f0d010c040b20222105201f450d030b201f20c9026a211f2007200520c602746a20ca026a21050c010b0b200720cf026a200520ce02746a2205450d002005280210450d03202020052802143602000b20dc0220dd02470d070c110b41e0adc40020762074104b000b41a99fc20041cc00103a000b4192a6c2004135103a000b41b0aec400102c000b207b41081020000b201f41081020000b4192a6c2004135103a000b410221050c080b2009204d6a2205200b470d010c020b200b2205200b460d010b03400240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a280200101d0b2005204d6a2205200b470d000b0b207b450d002022101d0b205028020022052079280200220b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a280200101d0b200b2005470d000b0b024020032802b4042205450d00024020032802b004220b20782802002207204f6a220a2802002209460d00200728020022072009202d746a2007200b202d746a2005202d7410cf031a0b200a200520096a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c405101d0b0240204e2d00002052470d00200341c0056a202b6a280200205371450d002077280200101d0b0240204b2d00002052470d002054280200205371450d002055280200101d0b024020492d00002052470d002056280200205371450d002048280200101d0b024020472d00002052470d002057280200205371450d002046280200101d0b024020452d00002052470d002058280200205371450d002044280200101d0b024020422d00002052470d002059280200205371450d00205a280200101d0b024020402d00002052470d00205b280200205371450d00205c280200101d0b0240203e2d00002052470d00205d280200205371450d00205e280200101d0b0240203c2d00002052470d00205f280200205371450d002060280200101d0b0240203b2d00002052470d002061280200205371450d00203a280200101d0b024020382d00002052470d002062280200205371450d002037280200101d0b024020352d00002052470d002063280200205371450d002034280200101d0b024020322d00002052470d002064280200205371450d002065280200101d0b024020302d00002052470d002066280200205371450d00202f280200101d0b410f21050b200520766a2276207328020022744f0d0a410021050c000b0b20da0220c5026a22da0220db02460d0b410c2172410421050c090b20d20220d1026a22d20220d302460d0a410a2172410421050c080b20c601450d010b20c501450d0120c001101d4102211f0c020b4102211f0c020b4102211f0c020b410121050c160b410121050c150b410121050c140b2070202b6a22702071460d0d41002172410421050c000b0b41a99fc20041cc00103a000b20c20220c1026a22c20220c302460d024104211f410121050c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360207d412c6c2105207e41586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b207d412c6c2105207e41606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b411021db01200341c0056a41106a22dc01200341c8006a41106a280200360200410821dd01200341c0056a41086a22de01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a104720ba01450d00410221df0120bf0120ba014102746a21e0012005200a6a21e101410421e201417f21e30141940321e401410121e501410021e601417c21e701410521e801413421e901200341a4076a21ea0141e00121eb01200341c0056a41e0016a21ec01411321ed0141d00121ee01200341c0056a41d0016a21ef0141d70021f00120034184076a21f10141c00121f201200341c0056a41c0016a21f301412d21f401200341f4066a21f50141b00121f601200341c0056a41b0016a21f701411221f801200341e4066a21f90141a00121fa01200341c0056a41a0016a21fb01410b21fc0141900121fd01200341c0056a4190016a21fe01410621ff01418001218002200341c0056a4180016a21810241f000218202200341c0056a41f0006a21830241840821840241e000218502200341c0056a41e0006a218602413721870220034194066a21880241d000218902200341c0056a41d0006a218a0220034184066a218b0241c000218c02200341c0056a41c0006a218d024130218e02200341c0056a41306a218f024120219002200341c0056a41206a21910241d6002192024114219302200341c0056a41146a2194024204219502421c219602410f219702422021980241182199024128219a024138219b0241c800219c0241d800219d0241e800219e0241f800219f0241880121a00241980121a10241a80121a20241b80121a30241c80121a40241d80121a50241e80121a602200341b7046a21a702418c0121a80241807e21a902428080808080804021aa024280808080808c0121ab02422821ac024280808080800c21ad02410921ae0241ffffffff0321af02200341cc036a21b002412421b102200341a0036a41246a21b202200341bc036a21b302200341ac036a21b402200341a4066a21b502200341b4066a21b602200341c4066a21b702200341d4066a21b80220034194076a21b902410321ba024103211f0c020b024020bb01450d0020be01101d0b200341c0056a20034180016a418c0110ce031a200341b0046a200341c0056a1049411021c002200341b0046a41106a2802002205450d00412c21c10220032802b80422c2022005412c6c6a21c302410a21c402411c21c502410221c602410421c702410821c802417f21c90241940321ca02410121cb02410021cc02417c21cd02410521ce02413421cf02410921d002411421d1024104211f0c020b200341bc046a29020021800120032802b004210520032902b40421980120032802602003280264200328026810b203200020c0026a208001370200200041086a20980137020020002005360204200041003602002008450d06200f450d062008101d200424000f0b410121050c0c0b410121050c0b0b42ac808080c005210c0b2008101d0b2000200536020420004101360200200041086a200c3702000b200141086a280200217c0240200141106a2802002203450d002003412c6c2105207c21030340200310452003412c6a2103200541546a22050d000b0b2001410c6a280200450d00207c101d0b200424000f0b202120236a22212024470d010b200341c8006a41106a2205200141106a280200360200200341c8006a41086a227c200141086a290200370300200320012902003703482005280200227d20236c2105207c280200227e41586a217c0240024003402005450d01200541546a2105207c41286a2109207c20236a227f217c20092d00004108470d000b200341386a207f104420032802382109200328023c21050c010b410021090b2005410020091b210a207d412c6c2105207e41586a217c200941f8b3c20020091b2181010240024003402005450d01200541546a2105207c41286a2109207c412c6a227f217c20092d0000410a470d000b200341306a207f104420032802302109200328023421050c010b410021090b2005410020091b210b207d412c6c2105207e41586a217c200941f8b3c20020091b2182010240024003404100217f2005450d01200541546a2105207c41286a2109207c412c6a228301217c20092d00004109470d000b20830128020021840141012185010c010b41002185010b2003420037027441f0c0c100218601200341f0c0c100360270411c218701208201200b411c6c6a2188014114218901208101200a41146c6a218a014104218b0141ff01218c014101217c4102218d0141cf00218e01410c218f01412021900141282191014134219201413c21930141d00021940141c8002195014110219601410821970142022180014220219801417f219901410d219a01419403219b01418c03219c014106219d01410b219e014105219f01411821a001418c0221a10141840221a20141fc0121a301412421a401417921a50141940221a60141c40321a70141bc0321a80141cc0021a90141c40021aa0141ffff0321ab01410a21ac0141980321ad0141f40121ae0141b00321af01417a21b001416c21b10141fc0221b201417c21b30142808080807021b40142ffffffff0f21b501410021b601410021b701410021b801410021b901410021ba01410021bb01410421bc01410421bd01410421be01410421bf010c010b4101211f0c010b4102211f0c010b410121050c010b410121050c000b0b102e000b1021000bcdb6020f2b7f017ece017f027e257f017e7b7f017e0c7f017e0d7f017e347f017e237f230041d0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5b2004410174220c200b200b200c491b220c4100480d5b2004450d2d20022802002004200c101e220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d00012108200241046a280200200241086a2802002204470d0d200441016a22062004490d5a2004410174220d20062006200d491b220d4100480d5a2004450d1c20022802002004200d101e2206450d1d0c540b2001410c6a280200210e200141086a280200210f200141046a2802002110200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1d200228020020042005101e220b450d1e0c510b2001410c6a2802002111200141086a2802002112200141046a2802002113200241046a280200200241086a2802002204470d0d200441016a220b2004490d5820044101742205200b200b2005491b22054100480d582004450d1e200228020020042005101e220b450d1f0c4e0b200141146a2802002114200141106a28020021152001410c6a2802002116200141086a2802002117200141056a2d00002118200141046a2d00002119200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d1f200228020020042005101e220b450d200c4b0b2001410c6a280200211a200141086a280200211b200141046a280200211c200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d20200228020020042005101e220b450d210c480b2001410c6a280200211d200141086a280200211e200141046a280200211f200241046a280200200241086a2802002204470d0d200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d21200228020020042005101e220b450d220c450b2001410c6a2802002106200141086a2802002120200141046a2802002121200241046a280200200241086a2802002204470d0d200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d22200228020020042005101e220b450d230c420b2001410c6a2802002106200141086a2802002122200141046a2802002123200241046a280200200241086a2802002204470d0d200441016a220b2004490d5320044101742205200b200b2005491b22054100480d532004450d23200228020020042005101e220b450d240c3f0b2001410c6a2802002106200141086a2802002124200141046a2802002125200241046a280200200241086a2802002204470d0e200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d26200228020020042005101e220b450d270c3c0b2001410c6a2802002126200141086a2802002127200141046a2802002128200241046a280200200241086a2802002204470d0e200441016a220b2004490d5120044101742205200b200b2005491b22054100480d512004450d27200228020020042005101e220b450d280c390b200141286a2802002129200141246a280200212a200141206a280200212b2001411c6a2802002108200141186a280200212c200141146a280200212d2001410c6a290200212e200141086a2802002109200141046a280200212f200241046a280200200241086a2802002204470d0e200441016a220b2004490d4f20044101742205200b200b2005491b22054100480d4f2004450d28200228020020042005101e220b450d290c360b2001410c6a2802002130200141086a2802002131200141046a2802002132200241046a280200200241086a2802002204470d0e200441016a220b2004490d4f20044101742205200b200b2005491b22054100480d4f2004450d29200228020020042005101e220b450d2a0c330b2001410c6a2802002133200141086a2802002134200141046a2802002135200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d2a200228020020042005101e220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d4d200b4101742206200520052006491b22064100480d4d200b450d2b2002280200200b2006101e2205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b2002280200210b0c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200d101f22060d370b200d41011020000b2005101f220b0d330b200541011020000b2005101f220b0d2f0b200541011020000b2005101f220b0d2b0b200541011020000b2005101f220b0d270b200541011020000b2005101f220b0d230b200541011020000b2005101f220b0d1f0b200541011020000b2005101f220b0d1b0b200541011020000b200c101f220b0d290b200c41011020000b2005101f220b0d150b200541011020000b2005101f220b0d110b200541011020000b2005101f220b0d0d0b200541011020000b2005101f220b0d090b200541011020000b2005101f220b0d050b200541011020000b2006101f22050d010b200641011020000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210d410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d24024002402006450d00200d20062005101e220d0d010c040b2005101f220d450d030b200521060b200d200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a210a200241086a2107200241046a2137200b210503400240024002400240203728020020072802002204470d00200441016a22082004490d2720044101742209200820082009491b22094100480d272004450d01200228020020042009101e22080d020c060b200228020021080c020b2009101f2208450d040b2002200836020020372009360200200728020021040b2007200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b200a4d0d00200228020021050c040b2004200b6a22072004490d2220054101742204200720072004491b22044100480d22024002402005450d00200228020020052004101e2205450d010c040b2004101f22050d030b200441011020000b200541011020000b200941011020000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200d200b10ce031a4101213702402006450d00200d101d0b4101210d410521040c1c0b2002200b360200200241046a2005360200200241086a28020021040b410121eb01410821ec01200241086a200441016a360200200b20046a410a3a0000410021ed01200341246a22ee0141003602002003420137021c200320023602182035203341186c6a21ef01410721f00141ff0021f10141807f21f201410021f301410021f401203321f5010240024041004100460d004116214d0c010b4115214d411121040c1b0b411121040c1a0b2002200b360200200241046a2005360200200241086a28020021040b410121de01410821df01200241086a200441016a360200200b20046a41063a0000410021e001200341cc006a22e10141003602002003420137024420032002360240203220304104746a21e201410721e30141ff0021e40141807f21e501410021e601410021e701203021e8010240024041004100460d004112214d0c010b4111214d411121040c190b411121040c180b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a0000202e422088a72107410121da014100210b4100210541002104202ea722db0121060240024002400340024020052004470d00200441016a220b2004490d1c200441017422dc01200b200b20dc01491b220b4100480d1c024002402004450d0020da012004200b101e22da010d010c040b200b101f22da01450d030b200b21040b20da0120056a200641807f72200641ff0071200641077622dc011b3a0000200541016a210520dc01210620dc010d000b200420056b20db014f0d02200520db016a220b2005490d1a20044101742206200b200b2006491b220b4100480d1a024002402004450d0020da012004200b101e22da01450d010c030b200b101f22da010d020b200b41011020000b200b41011020000b200b21040b20da0120056a202f20db0110ce031a02402009450d00202f101d200b21040b20db0120056a21dc01024002400240024002400340024020dc012004470d00200441016a220b2004490d1e20044101742205200b200b2005491b220b4100480d1e024002402004450d0020da012004200b101e22da010d010c040b200b101f22da01450d030b200b21040b20da0120dc016a200741807f72200741ff0071200741077622051b3a000020dc0141016a21dc012005210720050d000b024002400240202d450d002008210503400240024002400240200b20dc01470d00200b41016a2204200b490d24200b4101742206200420042006491b22044100480d24200b450d0120da01200b2004101e22da010d020c090b200b21040c020b2004101f22da01450d070b200b21dc012004210b0b20da0120dc016a200541807f72200541ff0071200541077622061b3a000020dc0141016a21dc012006210520060d000b200420dc016b20084f0d0620dc0120086a220b20dc01490d1f20044101742205200b200b2005491b220b4100480d1f2004450d0120da012004200b101e22da01450d020c050b200b2104410121dd010c060b200b101f22da010d030b200b41011020000b200b41011020000b200441011020000b200b21040b20da0120dc016a202d200810ce031a20dc0120086a21dc01410021dd01202c450d00202d101d0b202b20294104746a21c1022029210b0240024003400240024002400240200420dc01470d00200441016a22052004490d1e20044101742206200520052006491b222f4100480d1e2004450d0120da012004202f101e22da010d020c050b2004212f0c020b202f101f22da01450d030b200421dc01202f21040b20da0120dc016a200b41807f72200b41ff0071200b41077622051b3a000020dc0141016a21dc012005210b20050d000b02402029450d00411021c202410821c302410c21c402417f21c502410621c602410121c702410021c802410721c90241ff0021ca0241807f21cb02410221cc02410321cd0241c00021ce0241ff0121cf02410421d002410521d102202b21db01411d214d0c020b202b21db01410421040c180b202f41011020000b411121040c160b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a0000200341c0006a410c6a220a4100360200200342013702442003200236024020282026410c6c6a21094101210741002105410021042026210b024002400240024002400340024020042005470d00200541016a22062005490d1d20054101742208200620062008491b22064100480d1d024002402005450d00200720052006101e22070d010c040b2006101f2207450d030b200341c0006a41086a200636020020032007360244200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402026450d002026410c6c41746a210b202821040340200441046a28020022054102460d02200320042802002005200441086a280200200341c0006a105120032d00002205411a470d042004410c6a2104200b41746a220b4174470d000c030b0b202821090c010b2004410c6a21090b20282026410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402027450d002028101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d232004410174220d20072007200d491b220d4100480d232004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d1f200b4101742204200620062004491b22044100480d1f200b450d022005280200200b2004101e220b450d030c070b2005280200210b0c070b20032f000120032d0003411074722107200341086a290300212e200328020421082004410c6a210402400340200b450d01200b41746a210b200428020421062004410c6a210420064102470d000b0b02402027450d002028101d0b0240200341c0006a41086a280200450d002003280244101d0b200020073b0001200020053a0000200041036a20074110763a0000200041086a202e370000200041046a20083600004100219c03410121c6014101210c4101219d030c040b2004101f220b0d040b200441011020000b200641011020000b200d41011020000b410d21040c160b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213d410121374101210d41012138410121394101213a4101213b4101213c410621040c140b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202520064104746a21c8014100210b410021c901410021ca01410121cb0120062104024002400340024020c90120ca01470d00200b20c90141016a22052005200b491b22ca014100480d18024020c901450d0020cb0120c90120ca01101e22cb010d010c030b20ca01101f22cb01450d020b20cb0120c9016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20c90141016a21c9012005210420050d000b02402006450d00411021cc01410521cd01410121ce01410021cf01410421d001410221d101410721d20141ff0021d30141807f21d401417f21d501413f21d60141c00021d701202521d8014110214d0c020b202521d901410321040c140b20ca0141011020000b411121040c120b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002023200641146c6a21b7014100210b410021b801410021b901410121ba0120062104024002400340024020b80120b901470d00200b20b80141016a22052005200b491b22b9014100480d16024020b801450d0020ba0120b80120b901101e22ba010d010c030b20b901101f22ba01450d020b20ba0120b8016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20b80141016a21b8012005210420050d000b02402006450d00411421bb01410421bc01410121bd01411021be01410721bf0141ff0021c00141807f21c101410021c201410221c301202321c401410f214d0c020b202321c501410221040c120b20b90141011020000b411121040c100b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202120064102746a21ab014100210b410021ac01410021ad01410121ae01200621040240024002400340024020ac0120ad01470d00200b20ac0141016a22052005200b491b22ad014100480d15024020ac01450d0020ae0120ac0120ad01101e22ae010d010c030b20ad01101f22ae01450d020b20ae0120ac016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ac0141016a21ac012005210420050d000b2006450d01410121af01410421b001410721b10141ff0021b20141807f21b301410021b401410221b501202121b601410e214d0c020b20ad0141011020000b410121040c0f0b411121040c0e0b2002200b360200200241046a2005360200200241086a28020021040b41012188014108218901200241086a200441016a360200200b20046a41023a00004100218a01200341cc006a228b0141003602002003420137024420032002360240201f201d41286c6a218c014107218d0141ff00218e0141807f218f0141002190014100219101201d2192010240024041004100460d00410c214d0c010b410b214d411121040c0d0b411121040c0c0b2002200b360200200241046a2005360200200241086a28020021040b4101216841082169200241086a200441016a360200200b20046a41093a00004100216a200341cc006a226b41003602002003420137024420032002360240201c201a411c6c6a216c4107216d41ff00216e41807f216f4100217041002171201a21720240024041004100460d004107214d0c010b4106214d411121040c0b0b411121040c0a0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a00000240024002400240024002404104101f225c450d00205c41eec2b5ab0636000002400240024002400240024002400240024020194101460d00024020194102460d0020194103470d024100215d4101215e2017215f20162160201521614101216241012163410121644101101f2265450d1b410021040c180b2003410036023020034201370328200341306a21094101210741002105410021042017210b0340024020042005470d00200541016a22062005490d1a20054101742208200620062008491b22064100480d1a024002402005450d00200720052006101e22070d010c0b0b2006101f2207450d0a0b2003200636022c20032007360228200621050b2009200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201620144104746a21d2022014450d03201621d3022017450d04410421d402201620144104746a22d50241706a21d602410021d702410121d802411021d902417f21da02410821db02410721dc0241ff0021dd0241807f21de02411a21df02201721e002410021e102201621e2024105214d0c0c0b4100215e20034100360230200342013703282003410c6a2014360200200341086a20153602002003201636020420032017360200200341c0006a2003200341286a105220032d004022e302411a470d01200341286a41086a2802002161200328022c21602003280228215f41012162410021634100215d41012118410121644101101f22650d090c190b4101215f410021044100210b20152105034002400240024002402004200b470d00200441016a220b2004490d1b20044101742206200b200b2006491b22604100480d1b2004450d01205f20042060101e225f0d020c0b0b200421600c020b2060101f225f450d090b2004210b206021040b205f200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b2060200b6b20154f0d0c200b20156a2204200b490d1620604101742205200420042005491b22044100480d162060450d03205f20602004101e225f450d040c0b0b20032d0043411074210420032f0041210b200341c0006a41086a29030021f003200328024421f1030240200328022c450d002003280228101d0b200b20047221f203410e21040c140b201621d3020b20d30220d202460d06410f21040c120b2004101f225f0d070b200441011020000b200641011020000b206041011020000b410441011020000b410021040c0c0b411021040c0b0b411121040c0a0b200421600b205f200b6a2017201510ce031a200b20156a21614101215e02402016450d002017101d0b41002163410121624101215d41002118410121644101101f2265450d0b410021040c080b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a0000200341c0006a410c6a220a4100360200200342013702442003200236024020132011410c6c6a21094101210741002105410021042011210b0240024002400240024002400340024020042005470d00200541016a22062005490d1020054101742208200620062008491b22064100480d10024002402005450d00200720052006101e22070d010c040b2006101f2207450d030b200341c0006a41086a200636020020032007360244200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402011450d002011410c6c41746a21052013210b0340200b41046a28020022074102460d02200b41086a2802002108200b280200210a0240024002400240200341c0006a41086a2228280200200341c0006a410c6a22262802002204470d00200441016a22062004490d1920044101742227200620062027491b22274100480d192004450d01200328024420042027101e22060d020c0d0b200328024421060c020b2027101f2206450d0b0b20282027360200200320063602440b2026200441016a360200200620046a41f0003a00002003200a20072008200341c0006a105120032d00002206411a470d04200b410c6a210b200541746a22054174470d000c030b0b201321090c010b200b410c6a21090b20132011410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402012450d002013101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d162004410174220d20072007200d491b220d4100480d162004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d12200b4101742204200620062004491b22044100480d12200b450d022005280200200b2004101e220b450d030c080b2005280200210b0c080b20032f000120032d0003411074722107200341086a290300212e20032802042108200b410c6a2104024003402005450d01200541746a21052004280204210b2004410c6a2104200b4102470d000b0b02402012450d002013101d0b0240200341c0006a41086a280200450d002003280244101d0b200020073b0001200020063a0000200041036a20074110763a0000200041086a202e370000200041046a20083600004100219d03410121c6014101210c0c050b2004101f220b0d050b200441011020000b200641011020000b200d41011020000b202741011020000b410c21040c080b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213e410121374101210d41012138410121394101213a4101213b4101213c4101213d410721040c060b2002200b360200200241046a2005360200200241086a28020021040b4101214241082143200241086a200441016a360200200b20046a410b3a000041002144200341cc006a2245410036020020034201370244200320023602402010200e411c6c6a21464107214741ff00214841807f21494100214a4100214b200e214c0240024041004100460d004101214d0c010b4100214d411121040c050b411121040c040b20022006360200200241046a200d360200200241086a28020021040b200241086a220d200441016a360200200620046a20083a000002400240024002400240200241046a2802002206200d28020022046b200b4f0d002004200b6a22082004490d0920064101742204200820082004491b22044100480d092006450d01200228020020062004101e2206450d020c030b200228020021060c030b2004101f22060d010b200441011020000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b10ce031a410021364101213702402007450d002005101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f4101214041012141410821040c020b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021c601200b20046a41003a0000200341146a2005360200200341106a20063602002003200736020c20032008360208200320093602042003200a360200200341c0006a200320021053200320032900413703282003200341c0006a41086a29000037002f02400240024020032d00402204411a470d00410021c701410121374101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f4101214041012141410121360c010b20002003290328370001200020043a0000200041086a200329002f3700000c010b410921040c010b410b21040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e12000102030405060708090a1c1d1e1f232429290b206520183a0000410121044101210b20612105034002400240024002402004200b470d00200420646a220b2004490de70220042064742206200b200b2006491b22664100480de7022004450d01206520042066101e22650d020c2b0b200421660c020b2066101f2265450d290b2004210b206621040b2065200b6a200541807f72200541ff0071200541077622061b3a0000200b20646a210b2006210520060d000b2066200b6b20614f0d15200b20616a2204200b490de20220664101742205200420042005491b22044100480de2022066450d13206520662004101e2265450d160c140b02402020450d002021101d0b200241086a2105200241046a210720ac01210b03400240024002400240200728020020052802002204470d00200441016a22062004490de70220044101742208200620062008491b22084100480de7022004450d01200228020020042008101e22060d020c280b200228020021060c020b2008101f2206450d260b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20ac014f0d00200420ac016a22052004490de302200b4101742204200520052004491b22044100480de302200b450d0a2002280200200b2004101e220b450d0e0c0b0b2002280200210b0c0b0b20c50120b701460d27034020c501410c6a2802004104460d28024020c50141046a280200450d0020c501280200101d0b20c50141146a22c50120b701470d000c280b0b20d90120c801460d27034020d901410d6a2d00004105460d28024020d90141046a280200450d0020d901280200101d0b20d90141106a22d90120c801470d000c280b0b202b20294104746a210b02400340200b20db01460d0120db01280200210420db0141106a21db0120044108470d000b0b0240202a450d00202b101d0b200241086a2105200241046a210720dc01210b03400240024002400240200728020020052802002204470d00200441016a22062004490de30220044101742208200620062008491b22084100480de3022004450d01200228020020042008101e22060d020c260b200228020021060c020b2008101f2206450d240b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20dc014f0d00200420dc016a22052004490ddf02200b4101742204200520052004491b22044100480ddf02200b450d0c2002280200200b2004101e220b450d0f0c0d0b2002280200210b0c0d0b410121380c5a0b4101213e410721040cdb020b4101213f0c060b410121c701410921040cd9020b2000411a3a0000024020012d00002204410e4b0d000240024002400240024002400240024002400240024002400240024020040e0f0009080703050a0b0d0e0c02060401000b2036450dd902200141086a280200450dd902200141046a280200101d200341d0006a24000f0b2037450dd8020240200141086a280200450d00200141046a280200101d0b0240200141146a2802002202450d00200141186a280200450d002002101d0b200141246a280200450dd802200141206a280200101d200341d0006a24000f0b2039450dd702410c21eb022001410c6a2802002204450d43411821ec02410421ed02200141046a28020022ee02200441186c6a21ef02411421f002411021f102410921f202410821f30241ffffffff0321f402417021f5024121214d0cab020b203f450dd602200141086a280200450dd602200141046a280200101d200341d0006a24000f0b200d450dd502200141046a2d000022044102460d2120044101460d2020040d222001410c6a280200450dd502200141086a280200101d200341d0006a24000f0b203e450dd402200141086a280200450dd402200141046a280200101d200341d0006a24000f0b2038450dd302410c21f6022001410c6a2802002204450d41411c21f702410421f802200141046a28020022f9022004411c6c6a21fa02410821fb02411421fc02411021fd02410921fe0241ffffffff0321ff0241702180034122214d0ca9020b2040450dd20202402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241286a2102200441586a22040d000b0b200141086a280200450dd202200141046a280200101d200341d0006a24000f0b2041450dd10202402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d002002280200101d0b200241106a2102200441706a22040d000b0b200141086a280200450dd102200141046a280200101d200341d0006a24000f0b20c701450dd0020240200141086a280200450d00200141046a280200101d0b200141146a280200450dd002200141106a280200101d200341d0006a24000f0b203d450dcf02200141086a280200450dcf02200141046a280200101d200341d0006a24000f0b203c450dce022001410c6a2802002204450d3e4104218103200141046a28020022820320044104746a21830341102184034109218503410821860341ffffffff0321870341702188034123214d0ca6020b203a450dcd02410c2189032001410c6a2802002204450d3f411c218a034104218b03200141046a280200228c032004411c6c6a218d034108218e034114218f034110219003410921910341ffffffff0321920341702193034124214d0ca7020b203b450dcc0202402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d002002280200101d0b200241146a21022004416c6a22040d000b0b200141086a280200450dcc02200141046a280200101d200341d0006a24000f0b200110450ccb020b02402031450d002032101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490dde022004410174220d20072007200d491b220d4100480dde022004450d0120052802002004200d101e22070d020c220b200528020021070c020b200d101f2207450d200b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490dda02200b4101742204200620062004491b22044100480dda02200b450d0e2005280200200b2004101e220b450d110c0f0b2005280200210b0c0f0b2004101f220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ac016a360200200b20046a20ae0120ac0110ce031a4100213f41012137024020ad01450d0020ae01101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e0b410121400c5f0b200441011020000b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420dc016a360200200b20046a20da0120dc0110ce031a0240202f450d0020da01101d0b4101210d41002137202d450ddb0120dd01450ddc01202c450ddd01202d101d0cda010b200441011020000b2004101f2265450d020b200421660b2065200b6a205f206110ce031a02402060450d00205f101d0b200b20616a216702400240024020194102460d00024020194101460d0020190d02205d20164572450d030c2c0b205e450d2b2014450d2a2014410c6c210b201621040340024020042802002205450d00200441046a280200450d002005101d0b2004410c6a2104200b41746a220b0d000c2b0b0b2062450d2a2014450d29410421e402201620144104746a21e502411021e602410c21e702410821e802417421e902201621ea024120214d0c92020b2063201645720d290b2017101d0c280b200441011020000b2004101f220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213c410121374101210d41012138410121394101213a4101213b0cc3020b200441011020000b4101219d03410c21040cc5020b4101219c03410d21040cc4020b4101210b0c450b200041086a20f003370200200041046a20f103360200200020f20341087420e30272360200205c101d0c4a0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b101d0b2002410c6a2102200441746a22040d000b0b200141106a280200450db4022001410c6a280200101d200341d0006a24000f0b200141146a2802002204450d50410c21f3032001410c6a28020022f40320044104746a21f503411021f603410821f703410421f803417421f9034125214d0c8f020b2001410c6a280200450db202200141086a280200101d200341d0006a24000f0b411021fa03410c21fb03417421fc03410421fd03411e214d0c80020b2015450d5a2016101d0c5a0b200841011020000b200841011020000b206641011020000b200d41011020000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240204d0e280100031a3c280504071e3f09080b0c0d0e100f37391312152552535455265f60292c2e30325d6769690b200328024421040c010b204a20426a2204204a490dcd02204a204274220b20042004200b491b220b2044480dcd0202400240204a450d002003280244204a200b101e22040d010c87010b200b101f2204450d86010b200341c0006a20436a200b360200200320043602442045280200214b0b2045204b20426a3602002004204b6a204c204972204c204871204c20477622041b3a000002402004450d002004214c200341c0006a20436a280200224a2045280200224b470dad014100214d0ce3010b200e450d15411c214e4118214f41142150410821514107215241ff00215341807f2154200341cc006a21554101215641002157411a2158201021594102214d0ce4010b2059204e6a215a2059280204220a450d152059204f6a2802002108205920506a2802002126205920516a290200212e2059280200210b2059280210210903400240024002400240200341c0006a20516a220528020020552802002204470d00200420566a22062004490dd00220042056742207200620062007491b22072057480dd0022004450d01200328024420042007101e22060d020c720b200328024421060c020b2007101f2206450d700b2005200736020020032006360244205528020021040b2055200420566a360200200620046a200b205472200b205371200b20527622041b3a00002004210b20040d000b2003202e37022c2003200a3602282003200341286a200341c0006a101b20032d0000225b2058470d372008210b03400240024002400240200528020020552802002204470d00200420566a22062004490dd00220042056742207200620062007491b22072057480dd0022004450d01200328024420042007101e22060d020c740b200328024421060c020b2007101f2206450d720b2005200736020020032006360244205528020021040b2055200420566a360200200620046a200b205472200b205371200b20527622041b3a00002004210b20040d000b02400240024002402005280200220b205528020022046b20084f0d00200420086a22062004490dcf02200b2056742204200620062004491b22042057480dcf02200b450d012003280244200b2004101e220b0d020c96010b2003280244210b0c020b2004101f220b450d94010b200520043602002003200b360244205528020021040b2055200420086a360200200b20046a2009200810ce031a02402026450d002009101d0b205a2159205a2046470dac010c170b200328024421040c010b207020686a22042070490dca022070206874220b20042004200b491b220b206a480dca02024002402070450d0020032802442070200b101e22040d010c84010b200b101f2204450d83010b200341c0006a20696a200b36020020032004360244206b28020021710b206b207120686a360200200420716a2072206f722072206e712072206d7622041b3a000002402004450d0020042172200341c0006a20696a2802002270206b2802002271470dae014106214d0ce8010b201a450d15411c21734118217441142175410821764107217741ff00217841807f2179200341cc006a217a4101217b4100217c411a217d4102217e4104217f201c2180014108214d0ce9010b20800120736a2181012080012802042208450d1520800120746a280200210720800120756a28020021820120800120766a290200212e208001280210218301208001280200210b03400240024002400240200341c0006a20766a228401280200207a2802002204470d002004207b6a22052004490dcd022004207b742206200520052006491b2206207c480dcd022004450d01200328024420042006101e22050d020c6f0b200328024421050c020b2006101f2205450d6d0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b2003202e37022c200320083602282003200341286a200341c0006a101b20032d0000228501207d470d362083012007207e746a2186012007210b03400240024002400240208401280200207a2802002204470d002004207b6a22052004490dcd022004207b742206200520052006491b2206207c480dcd022004450d01200328024420042006101e22050d020c710b200328024421050c020b2006101f2205450d6f0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b2007450dbe02208301218701410021040c9b020b200328024421040c010b2090012088016a2204209001490dc60220900120880174220b20042004200b491b220b208a01480dc60202400240209001450d002003280244209001200b101e22040d010c81010b200b101f2204450d80010b200341c0006a2089016a200b36020020032004360244208b012802002191010b208b012091012088016a36020020042091016a209201208f0172209201208e0171209201208d017622041b3a000002402004450d002004219201200341c0006a2089016a280200229001208b01280200229101470dad01410b214d0ceb010b201d450d1441082193014128219401410421950141242196014120219701411c219801411a2199014119219a014114219b014110219c014101219d01200341cc006a219e014100219f0141f00021a001410221a101410321a201417f21a301413f21a40141c00021a50141ff0121a601410721a70141ff0021a80141807f21a901201f21aa01410d214d0cec010b20032093016a220620aa0122042093016a2802003602002003200429020037030020042094016a21aa0120042d00182205209501460d1420042096016a280000212620042097016a280000212820042098016a280000210b20042099016a2d000021112004209a016a2c000021272004209b016a28020021092004209c016a2802002107200428020c2108200341186a2093016a2204200628020036020020032003290300370318200341286a2093016a220a2004280200360200200320032903183703282003200341286a200341c0006a105420032d00002204209901470d42200a20093602002003200736022c200320083602282003200341286a200341c0006a105420032d00002204209901470d4302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402005209d01460d000240200520a101460d00200520a201470d02200341c0006a2093016a220b280200209e012802002204470d052004209d016a22052004490dde022004209d01742206200520052006491b2206209f01480dde022004450d0d200328024420042006101e22050d0e0cae010b200341c0006a2093016a2207280200209e012802002204470d022004209d016a22052004490ddd022004209d01742206200520052006491b2206209f01480ddd022004450d06200328024420042006101e22050d070caa010b200341c0006a2093016a2205280200209e012802002204470d022004209d016a22072004490ddc022004209d01742208200720072008491b2208209f01480ddc022004450d08200328024420042008101e22070d090caa010b200341c0006a2093016a2206280200209e012802002204470d032004209d016a22052004490ddb022004209d01742207200520052007491b2207209f01480ddb022004450d0d200328024420042007101e22050d0e0cac010b200328024421050c050b200328024421070c070b200328024421050c090b200328024421050c0b0b2006101f2205450da3010b2007200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a20a1013a00002003200b20282026200341c0006a105120032d00002204209901460d0c0c650b2008101f2207450da1010b2005200836020020032007360244209e0128020021040b209e012004209d016a360200200720046a209d013a000002402005280200209e012802002204470d002004209d016a22072004490dd2022004209d01742208200720072008491b2208209f01480dd2022004450d07200328024420042008101e22070d080ca1010b200328024421070c080b2006101f2205450da0010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a20a2013a00000240200b280200209e012802002204470d002004209d016a22052004490dcf022004209d01742206200520052006491b2206209f01480dcf022004450d08200328024420042006101e22050d090ca1010b200328024421050c090b2007101f2205450d9e010b2006200736020020032005360244209e0128020021040b209e012004209d016a360200200520046a209f013a0000034002400240024002402006280200209e012802002204470d002004209d016a22052004490dd0022004209d01742207200520052007491b2207209f01480dd0022004450d01200328024420042007101e22050d020c86010b200328024421050c020b2007101f2205450d84010b2006200736020020032005360244209e0128020021040b209e012004209d016a360200200520046a200b20a90172200b20a80171200b20a7017622041b3a00002004210b20040d000c040b0b2008101f2207450d99010b2005200836020020032007360244209e0128020021040b209e012004209d016a360200200720046a20a0013a00002003200b20282026200341c0006a105120032d00002204209901470d5a0b20aa01208c01470daf010c180b2006101f2205450d98010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a202720a30173220420a4017120a501722004202720a3014a1b3a00000240024002400240200b280200209e012802002204470d002004209d016a22052004490dc8022004209d01742206200520052006491b2206209f01480dc8022004450d01200328024420042006101e22050d020c9b010b200328024421050c020b2006101f2205450d99010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a201120a60171209f01473a000020aa01208c01470dad010c150b20ac0120af0174210b20b60120b0016a210620b60128020021040340024020ac0120ad01470d0020ac0120af016a220520ac01490dc502200b20052005200b491b22ad0120b401480dc502024020ac01450d0020ae0120ac0120ad01101e22ae010d010c630b20ad01101f22ae01450d620b20ae0120ac016a200420b30172200420b20171200420b1017622051b3a0000200b20b5016a210b20ac0120af016a21ac012005210420050d000b200621b601200620ab01470dad01410121040cc1020b20c40120bb016a21c50120c40128020c220920bc01460dc70120c401280204210a20c401280200210820b80120bd0174210520c40120be016a280200210b20c401280208220721040340024020b80120b901470d0020b80120bd016a220620b801490dc4022005200620062005491b22b90120c201480dc402024020b801450d0020ba0120b80120b901101e22ba010d010c630b20b901101f22ba01450d620b20ba0120b8016a200420c10172200420c00171200420bf017622061b3a0000200520c3016a210520b80120bd016a21b8012006210420060d000b02400240024020b90120b8016b20074f0d0020b80120076a220420b801490dc50220b90120bd01742205200420042005491b220420c201480dc50220b901450d0120ba0120b9012004101e22ba010d020c85010b20b90121040c010b2004101f22ba01450d83010b20ba0120b8016a2008200710ce031a200720046b20b8016a21050240200a450d002008101d0b024002402005450d00200720b8016a2105200421b9010c010b200420bd016a22052004490dc302200420bd01742206200520052006491b22b90120c201480dc302024002402004450d0020ba01200420b901101e22ba010d010c8a010b20b901101f22ba01450d89010b200421050b20ba0120056a20093a0000200520bd016a21b801200520bd017420c3016a21040340024020b80120b901470d0020b80120bd016a220520b801490dc4022004200520052004491b22b90120c201480dc402024020b801450d0020ba0120b80120b901101e22ba010d010c640b20b901101f22ba01450d630b20ba0120b8016a200b20c10172200b20c00171200b20bf017622051b3a0000200420c3016a210420b80120bd016a21b8012005210b20050d000b20c50121c40120c50120b701470dad010c080b20d80120cc016a21d90120d8012d000d222620cd01460dc70120d8012d000c210420d801280208210920d801280204212820d801280200210a024020ca0120c901470d0020c90120ce016a220b20c901490dc20220c90120ce01742205200b200b2005491b22ca0120cf01480dc202024020c901450d0020cb0120c90120ca01101e22cb010d010c84010b20ca01101f22cb01450d83010b20cb0120c9016a20043a000020c90120ce016a210420c90120ce0174220b20d0016a2108200b20d1016a21052009210b0340200821070240200420ca01470d00200420ce016a22062004490dc3022005200620062005491b22ca0120cf01480dc30202402004450d0020cb01200420ca01101e22cb010d010c640b20ca01101f22cb01450d630b20cb0120046a200b20d40172200b20d30171200b20d2017622061b3a0000200720d1016a2108200520d1016a2105200420ce016a21042006210b20060d000b0240024002402009450d004100210b024003402004200b6a2105200a200b6a2c0000220620d001460d010240200520ca01470d00200520ce016a22082005490dc7022007200820082007491b22ca0120cf01480dc70202402005450d0020cb01200520ca01101e22cb010d010c6d0b20ca01101f22cb01450d6c0b20cb0120046a200b6a200620d50173220520d6017120d701722005200620d5014a1b3a0000200720d1016a21072009200b20ce016a220b470d000b2004200b6a21050b2028450d020c010b200421052028450d010b200a101d0b024002400240024002400240202620d001470d0020ca012005470d02200520ce016a22042005490dc702200520ce0174220b20042004200b491b22ca0120cf01480dc7022005450d0120cb01200520ca01101e22cb010d020c90010b024020ca012005470d00200520ce016a22042005490dc702200520ce0174220b20042004200b491b220420cf01480dc7022005450d0320cb0120052004101e22cb010d040c91010b20ca0121040c030b20ca01101f22cb01450d8e010b20cb0120056a20cf013a00000c020b2004101f22cb01450d8d010b20cb0120056a20ce013a000002400240024002402004200520ce016a2205470d00200420ce016a220b2004490dc602200420ce01742205200b200b2005491b22ca0120cf01480dc6022004450d0120cb01200420ca01101e22cb010d020c91010b200421ca010c020b20ca01101f22cb01450d8f010b200421050b20cb0120056a202620d2017120d301733a00000b200520ce016a21c90120d90121d80120d90120c801470dad010c080b200328024421040c010b20e60120de016a220420e601490dbf0220e60120de0174220b20042004200b491b220b20e001480dbf020240024020e601450d00200328024420e601200b101e22040d010c7b0b200b101f2204450d7a0b200341c0006a20df016a200b3602002003200436024420e10128020021e7010b20e10120e70120de016a360200200420e7016a20e80120e5017220e80120e4017120e80120e3017622041b3a000002402004450d00200421e801200341c0006a20df016a28020022e60120e10128020022e701470dac014111214d0cec010b2030450d102030410474210a411021e9012032210403402004410d6a2d000022094102460d24200441086a28020021ea01200441046a2802002126200428020021282004410c6a2c000021060240024002400240200341c0006a41086a2207280200200341c0006a410c6a2205280200220b470d00200b41016a2208200b490dc302200b4101742227200820082027491b22274100480dc302200b450d012003280244200b2027101e22080d020c8a010b200328024421080c020b2027101f2208450d88010b20072027360200200320083602442005280200210b0b2005200b41016a3602002008200b6a2006417f73220b413f7141c00072200b2006417f4a1b3a0000024002400240024020072802002005280200220b470d00200b41016a2206200b490dc302200b4101742208200620062008491b22084100480dc302200b450d012003280244200b2008101e22060d020c8b010b200328024421060c020b2008101f2206450d89010b20072008360200200320063602442005280200210b0b2005200b41016a3602002006200b6a20094100473a0000200341286a41086a20ea013602002003202636022c20032028360228200441106a210b2003200341286a200341c0006a101b20032d000022ea01411a470d27200b2104200a41706a220a0d000ccc010b0b200328021c21040c010b20f30120eb016a220420f301490dbc0220f30120eb0174220b20042004200b491b220b20ed01480dbc020240024020f301450d00200328021c20f301200b101e22040d010c790b200b101f2204450d780b200341186a20ec016a200b3602002003200436021c20ee0128020021f4010b20ee0120f40120eb016a360200200420f4016a20f50120f2017220f50120f1017120f50120f0017622041b3a000002402004450d00200421f501200341186a20ec016a28020022f30120ee0128020022f401470dac014115214d0cef010b2033450d0e410121f601200341017221f701411821f801411421f901411021fa01410c21fb01200341286a410c6a21fc01420121fd01422021fe01410321ff01410721800241ff0021810241807f21820241002183024108218402200341286a41086a2185024104218602410921870241ffffffff0321880241ac012189024170218a024102218b02200341026a218c02411a218d024178218e02417c218f0241ff01219002417f219102413f21920241c00021930220352194024117214d0cf0010b20940220f8016a219502209402280200229602450d0e20940220f9016a28020021970220940220fa016a28020021980220940228020c219902209402290204212e4100219a0220fc014100360200200320fd0137022c209602202e20fe0188a7229b0220ff01746a219c022003200341186a360228202ea7219d024100219e0241004100460d8c02410121040c8d020b02402022450d002023101d0b200241086a2105200241046a210720b801210b03400240024002400240200728020020052802002204470d00200441016a22062004490dbe0220044101742208200620062008491b22084100480dbe022004450d01200228020020042008101e22060d020c7a0b200228020021060c020b2008101f2206450d780b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20b8014f0d00200420b8016a22052004490dba02200b4101742204200520052004491b22044100480dba02200b450d2f2002280200200b2004101e220b450d320c300b2002280200210b0c300b02402024450d002025101d0b200241086a2105200241046a210720c901210b03400240024002400240200728020020052802002204470d00200441016a22062004490dbd0220044101742208200620062008491b22084100480dbd022004450d01200228020020042008101e22060d020c7a0b200228020021060c020b2008101f2206450d780b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20c9014f0d00200420c9016a22052004490db902200b4101742204200520052004491b22044100480db902200b450d2a2002280200200b2004101e220b450d2d0c2b0b2002280200210b0c2b0b2010215a0b205a2046460d01411c21a602411421a702410c21a802410821a902410421aa02411021ab02410921ac0241ffffffff0321ad02417021ae024103214d0ccf010b205a2802042205450d00205a20a7026a2802002106205a20a9026a2802002107205a28021021080240205a20a8026a2802002204450d00200420aa0274210b200521040340024020042d000020ac02470d00200420a9026a28020020ad0271450d00200420aa026a280200101d0b200420ab026a2104200b20ae026a220b0d000b0b02402007450d002005101d0b205a20a6026a215a02402006450d002008101d0b205a2046470d96010b0240200f450d002010101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490db8022004410174220d20072007200d491b220d4100480db8022004450d0120052802002004200d101e22070d020c770b200528020021070c020b200d101f2207450d750b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490db402200b4101742204200620062004491b22044100480db402200b450d2e2005280200200b2004101e220b450d320c2f0b2005280200210b0c2f0b201c2181010b208101206c460da902411c21af02411421b002410c21b102410821b202410421b302411021b402410921b50241ffffffff0321b602417021b7024109214d0cd3010b2081012802042205450da80220810120b0026a280200210620810120b2026a28020021072081012802102108024020810120b1026a2802002204450d00200420b30274210b200521040340024020042d000020b502470d00200420b2026a28020020b60271450d00200420b3026a280200101d0b200420b4026a2104200b20b7026a220b0d000b0b02402007450d002005101d0b20810120af026a21810102402006450d002008101d0b208101206c470d96010ca8020b201f21aa010b20aa01208c01460d00034020aa0141186a2d00004104460d0120aa0141106a280200210420aa01410c6a280200210b024020aa0141046a280200450d0020aa01280200101d0b02402004450d00200b101d0b20aa0141286a22aa01208c01470d000b0b0240201e450d00201f101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490db3022004410174220d20072007200d491b220d4100480db3022004450d0120052802002004200d101e22070d020c720b200528020021070c020b200d101f2207450d700b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b200541046a280200220b200541086a28020022046b20374f0d05200420376a22062004490dae02200b4101742204200620062004491b22044100480dae02200b450d352005280200200b2004101e220b450d3a0c360b203222b80220e201470d130cbc010b20352195020b20950220ef01460d9d02411821b902411421ba02411021bb02410421bc02410921bd02410821be0241ffffffff0321bf02417021c0024118214d0ce1010b209502280200220b450d9c0220950220ba026a280200210420950220bb026a280200210620950228020c21050240209502280204450d00200b101d0b02402004450d00200420bc0274210b200521040340024020042d000020bd02470d00200420be026a28020020bf0271450d00200420bc026a280200101d0b200420bb026a2104200b20c0026a220b0d000b0b20950220b9026a21950202402006450d002005101d0b20950220ef01470d9b010c9c020b20db01220520c2026a21db012005280200220620c302460db101200520c3026a280200210b2005280204210402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200620c5026a220620c6024b0d00200520c4026a2802002108024002400240024020060e0700050203010607000b202f20dc01470d0b202f20c7026a2205202f490dda02202f20c702742206200520052006491b220620c802480dda02202f450d1b20da01202f2006101e22da010d1c0cb3010b202f20dc01470d06202f20c7026a2205202f490dd902202f20c702742206200520052006491b220720c802480dd902202f450d0e20da01202f2007101e22da010d0f0caf010b202f20dc01470d06202f20c7026a2205202f490dd802202f20c702742206200520052006491b220720c802480dd802202f450d1020da01202f2007101e22da010d110caf010b202f20dc01470d06202f20c7026a2205202f490dd702202f20c702742206200520052006491b220720c802480dd702202f450d1220da01202f2007101e22da010d130caf010b202f20dc01470d06202f20c7026a2205202f490dd602202f20c702742206200520052006491b220620c802480dd602202f450d1420da01202f2006101e22da010d150cab010b202f20dc01470d07202f20c7026a2205202f490dd502202f20c702742206200520052006491b220620c802480dd502202f450d1920da01202f2006101e22da010d1a0caf010b202f20dc01470d07202f20c7026a2205202f490dd402202f20c702742206200520052006491b220620c802480dd402202f450d1b20da01202f2006101e22da010d1c0caf010b202f20dc01470d07202f20c7026a2205202f490dd302202f20c702742206200520052006491b220620c802480dd302202f450d1d20da01202f2006101e22da010d1e0caf010b202f21070c090b202f21070c0b0b202f21070c0d0b202f21060c0f0b202f21060c110b202f21060c130b202f21060c150b202f21060c170b2007101f22da01450da0010b202f21dc010b20da0120dc016a20d1023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dcd02200720c702742206200520052006491b220620c802480dcd022007450d0120da0120072006101e22da010d020c760b200721060c020b2006101f22da01450d740b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dcd02200620c702742205200420042005491b220420c802480dcd022006450d0120da0120062004101e22da010d020c770b200621040c020b2004101f22da01450d750b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dd002200420c702742206200520052006491b220620c802480dd0022004450d0120da0120042006101e22da010d020c93010b200421060c020b2006101f22da01450d91010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc902200620c70274220b20042004200b491b222f20c802480dc9022006450d1720da012006202f101e22da010d180ca6010b2006212f0c180b2007101f22da01450d9e010b202f21dc010b20da0120dc016a20cd023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dca02200720c702742206200520052006491b220620c802480dca022007450d0120da0120072006101e22da010d020c750b200721060c020b2006101f22da01450d730b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dca02200620c702742205200420042005491b220420c802480dca022006450d0120da0120062004101e22da010d020c760b200621040c020b2004101f22da01450d740b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dcd02200420c702742206200520052006491b220620c802480dcd022004450d0120da0120042006101e22da010d020c91010b200421060c020b2006101f22da01450d8f010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc602200620c70274220b20042004200b491b222f20c802480dc6022006450d1720da012006202f101e22da010d180ca4010b2006212f0c180b2007101f22da01450d9c010b202f21dc010b20da0120dc016a20d0023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dc702200720c702742206200520052006491b220620c802480dc7022007450d0120da0120072006101e22da010d020c740b200721060c020b2006101f22da01450d720b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dc702200620c702742205200420042005491b220420c802480dc7022006450d0120da0120062004101e22da010d020c750b200621040c020b2004101f22da01450d730b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dca02200420c702742206200520052006491b220620c802480dca022004450d0120da0120042006101e22da010d020c8f010b200421060c020b2006101f22da01450d8d010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc302200620c70274220b20042004200b491b222f20c802480dc3022006450d1720da012006202f101e22da010d180ca2010b2006212f0c180b2006101f22da01450d96010b202f21dc010b20da0120dc016a20c8023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dc402200620c7027422dc012005200520dc01491b220520c802480dc4022006450d0120da0120062005101e22da010d020c6b0b200621050c020b2005101f22da01450d690b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dc402200520c702742206200420042006491b222f20c802480dc4022005450d0120da012005202f101e22da010d020c6c0b2005212f0c020b202f101f22da01450d6a0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c0d0b0b2006101f22da01450d97010b202f21dc010b20da0120dc016a20c7023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dc102200620c7027422dc012005200520dc01491b220520c802480dc1022006450d0120da0120062005101e22da010d020c700b200621050c020b2005101f22da01450d6e0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dc102200520c702742206200420042006491b222f20c802480dc1022005450d0120da012005202f101e22da010d020c710b2005212f0c020b202f101f22da01450d6f0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c0a0b0b2006101f22da01450d95010b202f21dc010b20da0120dc016a20cc023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dbe02200620c7027422dc012005200520dc01491b220520c802480dbe022006450d0120da0120062005101e22da010d020c6f0b200621050c020b2005101f22da01450d6d0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dbe02200520c702742206200420042006491b222f20c802480dbe022005450d0120da012005202f101e22da010d020c700b2005212f0c020b202f101f22da01450d6e0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c070b0b2006101f22da01450d93010b202f21dc010b20da0120dc016a20c6023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dbb02200620c7027422dc012005200520dc01491b220520c802480dbb022006450d0120da0120062005101e22da010d020c6e0b200621050c020b2005101f22da01450d6c0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dbb02200520c702742206200420042006491b222f20c802480dbb022005450d0120da012005202f101e22da010d020c6f0b2005212f0c020b202f101f22da01450d6d0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c040b0b2006101f22da01450d91010b202f21dc010b20da0120dc016a20c9023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490db802200620c7027422dc012005200520dc01491b220520c802480db8022006450d0120da0120062005101e22da010d020c6d0b200621050c020b2005101f22da01450d6b0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490db802200520c702742206200420042006491b222f20c802480db8022005450d0120da012005202f101e22da010d020c6e0b2005212f0c020b202f101f22da01450d6c0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000b0b20db0120c102470da9010c090b202f101f22da01450d8e010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da7010c060b202f101f22da01450d8c010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da6010c030b202f101f22da01450d8a010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da2010b20c10221db010cb0010b2005280200210b0c310b20e202210502400340200520d4026a28020022080d0120e10220d8026a21e10220d502200520d9026a2205470d000cbd010b0b200520d9026a21e20220e10220d8026a212620e00220da026a21e002200520db026a290200212e2005280200210a200341286a20db026a22092802002104200328022c210b034002400240024002402004200b470d00200b20d8026a2206200b490dab02200b20d802742207200620062007491b220720d702480dab02200b450d012003280228200b2007101e22060d020c780b200328022821060c020b2007101f2206450d760b2003200736022c200320063602282007210b0b2009200420d8026a2207360200200620046a20e10220de027220e10220dd027120e10220dc027622061b3a000020072104200621e10220060d000b200320db026a202e370300200320083602042003200a360200200341c0006a2003200341286a105220032d004022e30220df02470d3f024020d6022005460d00202621e10220e0020d8b010b200541106a22d30220d202470dba010cb9010b20ea02220620e6026a21ea02024020062802042204450d000240200620e7026a280200220b450d00200b20e7026c210b0340024020042802002205450d00200420e4026a280200450d002005101d0b200420e7026a2104200b20e9026a220b0d000b0b200620e8026a280200450d00200620e4026a280200101d0b20ea0220e502470da2010b2015450d002016101d0b200341146a2067360200200341106a20663602002003206536020c20034284808080c0003702042003205c360200200341c0006a200320021053200320032900413703282003200341c0006a41086a29000037002f20032d00402204411a470d084100210d41012137410521040ca2020b024020ee0220ed026a280200450d0020ee02280200101d0b024020ee0220f0026a280200220b450d0020ee0228020c2104200b20ed0274210b0340024020042d000020f202470d00200420f3026a28020020f40271450d00200420ed026a280200101d0b200420f1026a2104200b20f5026a220b0d000b0b20ee0220ec026a2104024020ee0220f1026a280200450d0020ee0220eb026a280200101d0b200421ee02200420ef02470da0010b200141086a280200450d9302200141046a280200101d200341d0006a24000f0b024020f90220f6026a280200220b450d0020f9022802042104200b20f80274210b0340024020042d000020fe02470d00200420fb026a28020020ff0271450d00200420f8026a280200101d0b200420fd026a2104200b2080036a220b0d000b0b024020f90220fb026a280200450d0020f90220f8026a280200101d0b20f90220f7026a2104024020f90220fc026a280200450d0020f902280210101d0b200421f902200420fa02470d9f010b200141086a280200450d9102200141046a280200101d200341d0006a24000f0b0240208203280208220b450d002082032802002104200b20810374210b0340024020042d0000208503470d0020042086036a28020020870371450d0020042081036a280200101d0b20042084036a2104200b2088036a220b0d000b0b2082032084036a210402402082032081036a280200450d00208203280200101d0b20042182032004208303470d9e010b200141086a280200450d8f02200141046a280200101d200341d0006a24000f0b0240208c032089036a280200220b450d00208c032802042104200b208b0374210b0340024020042d0000209103470d002004208e036a28020020920371450d002004208b036a280200101d0b20042090036a2104200b2093036a220b0d000b0b0240208c03208e036a280200450d00208c03208b036a280200101d0b208c03208a036a21040240208c03208f036a280200450d00208c03280210101d0b2004218c032004208d03470d9d010b200141086a280200450d8d02200141046a280200101d200341d0006a24000f0b20002003290328370001200020043a0000200041086a200329002f3700000c210b200441106a22b80220e201460daa010b4110219403410d219503410221960341042197034109219803410821990341ffffffff03219a034170219b034113214d0cc8010b20b8022095036a2d0000209603460da60120b802280204210620b8022802002105024020b8022802082204450d00200420970374210b200521040340024020042d0000209803470d0020042099036a280200209a0371450d0020042097036a280200101d0b20042094036a2104200b209b036a220b0d000b0b20b8022094036a21b80202402006450d002005101d0b20b80220e201470d8601410a21040c96020b20032d0003219e0320032f0001219f03200341086a29030021a003200328020421a103200b20e201460d01411021a203200441106a21a303410d21a403410221a503410421a603410921a703410821a80341ffffffff0321a903417021aa034114214d0cc8010b20a30320a4036a2d000020a503460d0020a303280204210620a3032802002105024020a3032802082204450d00200420a60374210b200521040340024020042d000020a703470d00200420a8036a28020020a90371450d00200420a6036a280200101d0b200420a2036a2104200b20aa036a220b0d000b0b20a30320a2036a21a30302402006450d002005101d0b20a30320e201470d85010b209e0320e90174210402402031450d002032101d0b209f0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b0001200020ea013a0000200041036a20044110763a0000200041086a20a003370000200041046a20a1033600004100210b410121c6014101210c4101219d034101219c030c150b20032d000321ab0320032f000121ac03200341086a29030021ad03200328020421ae0302402026450d002009101d0b411021af03205a2046460d01411c21b003411421b103410c21b203410821b303410421b403411021b503410921b60341ffffffff0321b703417021b8034104214d0caf010b205a2802042205450d00205a20b1036a2802002106205a20b3036a2802002107205a28021021080240205a20b2036a2802002204450d00200420b40374210b200521040340024020042d000020b603470d00200420b3036a28020020b70371450d00200420b4036a280200101d0b200420b5036a2104200b20b8036a220b0d000b0b02402007450d002005101d0b205a20b0036a215a02402006450d002008101d0b205a2046470d750b20ab0320af037421040240200f450d002010101d0b20ac0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b00012000205b3a0000200041036a20044110763a0000200041086a20ad03370000200041046a20ae0336000041002105410121c6014101210c4101219d034101219c034101210b41012106410121070ce8010b20032d000321b90320032f000121ba03200341086a29030021bb03200328020421bc030240208201450d00208301101d0b411021bd03208101206c460d01411c21be03411421bf03410c21c003410821c103410421c203411021c303410921c40341ffffffff0321c503417021c603410a214d0cb4010b2081012802042205450d0020810120bf036a280200210620810120c1036a28020021072081012802102108024020810120c0036a2802002204450d00200420c20374210b200521040340024020042d000020c403470d00200420c1036a28020020c50371450d00200420c2036a280200101d0b200420c3036a2104200b20c6036a220b0d000b0b02402007450d002005101d0b20810120be036a21810102402006450d002008101d0b208101206c470d760b20b90320bd037421040240201b450d00201c101d0b20ba0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b000120002085013a0000200041036a20044110763a0000200041086a20bb03370000200041046a20bc0336000041002106410121c6014101210c4101219d034101219c034101210b0c100b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420c9016a360200200b20046a20cb0120c90110ce031a4100214141012137024020ca01450d0020cb01101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f410121400c170b200441011020000b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420b8016a360200200b20046a20ba0120b80110ce031a4100213b41012137024020b901450d0020ba01101d0b4101210d41012138410121394101213a0c81020b200441011020000b2004101f220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002138410121374101210d0b410121390cf6010b200441011020000b20032f000120032d0003411074722109200341086a290300212e200328020421062007450d152008101d20aa01208c01470d160c170b20032f000120032d0003209c01747221090c130b410121060b410121070cd3010b024020ca0320c9036a280200450d0020ca03280200101d0b024020ca0320cc036a280200220b450d0020ca0328020c2104200b20c90374210b0340024020042d000020ce03470d00200420cf036a28020020d00371450d00200420c9036a280200101d0b200420cd036a2104200b20d1036a220b0d000b0b20ca0320c8036a2104024020ca0320cd036a280200450d0020ca0320c7036a280200101d0b200421ca03200420cb03470d6f0cd5010b024020d50320d2036a280200220b450d0020d5032802042104200b20d40374210b0340024020042d000020da03470d00200420d7036a28020020db0371450d00200420d4036a280200101d0b200420d9036a2104200b20dc036a220b0d000b0b024020d50320d7036a280200450d0020d50320d4036a280200101d0b20d50320d3036a2104024020d50320d8036a280200450d0020d503280210101d0b200421d503200420d603470d6f0cd9010b024020de03280208220b450d0020de032802002104200b20dd0374210b0340024020042d000020e103470d00200420e2036a28020020e30371450d00200420dd036a280200101d0b200420e0036a2104200b20e4036a220b0d000b0b20de0320e0036a2104024020de0320dd036a280200450d0020de03280200101d0b200421de03200420df03470d6f0cde010b024020e80320e5036a280200220b450d0020e8032802042104200b20e70374210b0340024020042d000020ed03470d00200420ea036a28020020ee0371450d00200420e7036a280200101d0b200420ec036a2104200b20ef036a220b0d000b0b024020e80320ea036a280200450d0020e80320e7036a280200101d0b20e80320e6036a2104024020e80320eb036a280200450d0020e803280210101d0b200421e803200420e903470d6f0cdf010b41002108410121c6014101210c4101219d034101219c034101210b41012106410121074101210520012d00002204410e4d0dd0010ce0010b2004101f220b450d040b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002140410121374101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f0b410121410b41012136410821040cf2010b200441011020000b20f403220620f6036a21f403024020062802042204450d000240200620f3036a280200220b450d00200b20f3036c210b0340024020042802002205450d00200420f8036a280200450d002005101d0b200420f3036a2104200b20f9036a220b0d000b0b200620f7036a280200450d00200620f8036a280200101d0b20f40320f503470d730b200141106a280200450de2012001410c6a280200101d200341d0006a24000f0b20d302220420fa036a21d302024020042802042206450d00200428020821070240200420fb036a2802002204450d00200420fb036c210b200621040340024020042802002205450d00200420fd036a280200450d002005101d0b200420fb036a2104200b20fc036a220b0d000b0b2007450d002006101d0b20d30220d202470d6a411021040cee010b209502280200220b450dc30120950220ff036a28020021042095022080046a280200210620950228020c21050240209502280204450d00200b101d0b02402004450d00200420810474210b200521040340024020042d0000208204470d0020042083046a28020020840471450d0020042081046a280200101d0b20042080046a2104200b2085046a220b0d000b0b20950220fe036a21950202402006450d002005101d0b20950220ef01470d6a0cc3010b20032f000120032d0003411074722109200341086a290300212e2003280204210620aa01208c01470d030c040b20032f000120032d0003209c01747221090b2006290300212e200328020421060b20aa01208c01460d010b034020aa0141186a2d00004104460d0120aa0141106a280200210b20aa01410c6a2802002105024020aa0141046a280200450d0020aa01280200101d0b0240200b450d002005101d0b20aa0141286a22aa01208c01470d000b0b0240201e450d00201f101d0b0240200341c0006a41086a280200450d002003280244101d0b200020093b0001200020043a0000200041036a20094110763a0000200041086a202e370000200041046a20063600004100210c410121c601410b21040ce7010b20870422062089046a218704024020062802042204450d00024020062086046a280200220b450d00200b2086046c210b0340024020042802002205450d002004208b046a280200450d002005101d0b20042086046a2104200b208c046a220b0d000b0b2006208a046a280200450d002006208b046a280200101d0b208704208804470d6a0cd2010b20032d0043218d0420032f0041218e04200341c0006a20db026a29030021f003200328024421f1034104218f04201620144104746a41706a2005460d014110219004200541106a219104410c21920441742193044127214d0cb8010b20910422042090046a219104024020042802042206450d0020042802082107024020042092046a2802002204450d0020042092046c210b200621040340024020042802002205450d002004208f046a280200450d002005101d0b20042092046a2104200b2093046a220b0d000b0b2007450d002006101d0b20910420d202470d690b02402015450d002016101d0b20e302411a470d010b200341306a2802002161200328022c21602003280228215f41022118410021624101215e410021634100215d410121644101101f22650d680ce5010b208d0420d9027421040240200328022c450d002003280228101d0b208e0420047221f2030c740b20ad0141011020000b20b90141011020000b20b90141011020000b20ca0141011020000b200741011020000b200641011020000b200741011020000b200641011020000b20ca0141011020000b200541011020000b202f41011020000b200641011020000b200441011020000b200641011020000b200441011020000b200641011020000b200441011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200741011020000b200b41011020000b200b41011020000b200b41011020000b200b41011020000b200b41011020000b200841011020000b200841011020000b200d41011020000b200d41011020000b200441011020000b20ca0141011020000b200641011020000b200641011020000b200641011020000b20b90141011020000b200441011020000b202741011020000b200841011020000b20ca0141011020000b200441011020000b20ca0141011020000b200741011020000b200641011020000b200841011020000b200841011020000b200641011020000b200741011020000b200641011020000b200641011020000b200641011020000b200741011020000b200741011020000b200741011020000b200641011020000b200641011020000b200641011020000b200641011020000b202f41011020000b202f41011020000b202f41011020000b4101214d0c360b4102214d0c370b4103214d0c380b4104214d0c390b4105214d0c390b4107214d0c3a0b4109214d0c3c0b410a214d0c3d0b410c214d0c3e0b410d214d0c3f0b410d214d0c3f0b410e214d0c3f0b410f214d0c3f0b4110214d0c3f0b4112214d0c400b4113214d0c410b4114214d0c420b4116214d0c430b4118214d0c450b4119214d0c450b411a214d0c450b411b214d0c450b411c214d0c450b411d214d0c450b411d214d0c450b411d214d0c450b411d214d0c450b411e214d0c460b411f214d0c460b4120214d0c470b4121214d0c480b4122214d0c490b4123214d0c4a0b4124214d0c4b0b4125214d0c4c0b4126214d0c4c0b4127214d0c4c0b410021040c790b410221040c780b410321040c770b410421040c760b410421040c750b410521040c740b410521040c730b410521040c720b410521040c710b410a21040c700b410a21040c6f0b410a21040c6e0b410a21040c6d0b410e21040c6c0b411021040c6b0b410f21040c6a0b411021040c690b411121040c680b411121040c670b411121040c660b411121040c650b411121040c640b411121040c630b411121040c620b411121040c610b411121040c600b411121040c5f0b411121040c5e0b411121040c5d0b411121040c5c0b411121040c5b0b411121040c5a0b411121040c590b411121040c580b411121040c570b411121040c560b411121040c550b411121040c540b411121040c530b411121040c520b411121040c510b411121040c500b411121040c4f0b411121040c4e0b411121040c4d0b411121040c4c0b411121040c4b0b411121040c4a0b411121040c490b411121040c480b411121040c470b411121040c460b411121040c450b411121040c440b411121040c430b411121040c420b411121040c410b411121040c400b411121040c3f0b411121040c3e0b411121040c3d0b411121040c3c0b411121040c3b0b411121040c3a0b411121040c390b411121040c380b411121040c370b411121040c360b411121040c350b411121040c340b411121040c330b411121040c320b411121040c310b411121040c300b411121040c2f0b411121040c2e0b411121040c2d0b411121040c2c0b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b208701207f6a2107208701280200210b03400240024002400240208401280200207a2802002204470d002004207b6a22052004490d4b2004207b742206200520052006491b2206207c480d4b2004450d01200328024420042006101e22050d020c0d0b200328024421050c020b2006101f2205450d0b0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b20072187012007208601470d130c3c0b200328022c21040c010b209a0220f6016a2204209a02490d44209a0220f60174220b20042004200b491b220b208302480d4402400240209a02450d00200328022c209a02200b101e22040d010c0a0b200b101f2204450d090b208502200b3602002003200436022c20fc01280200219e020b20fc01209e0220f6016a3602002004209e026a209b0220820272209b0220810271209b022080027622041b3a000002402004450d002004219b02208502280200229a0220fc01280200229e02470d12410221040c170b209c02209602460d01209602219f02410321040c160b209f022084026a21a002209f02290200222e20fe0188a7220420900271208602460d13200420f8017420f801752107202ea7210b0340024002400240024020850228020020fc012802002204470d00200420f6016a22052004490d47200420f601742206200520052006491b2206208302480d472004450d01200328022c20042006101e22050d020c0a0b200328022c21050c020b2006101f2205450d080b20850220063602002003200536022c20fc0128020021040b20fc01200420f6016a360200200520046a200b20820272200b20810271200b2080027622041b3a00002004210b20040d000b024002400240024020850228020020fc012802002204470d00200420f6016a220b2004490d46200420f601742205200b200b2005491b2205208302480d462004450d01200328022c20042005101e220b0d020c0c0b200328022c210b0c020b2005101f220b450d0a0b20850220053602002003200b36022c20fc0128020021040b20fc01200420f6016a360200200b20046a20072091027322042092027120930272200420072091024a1b3a000020a002219f0220a002209c02470d11209c02209c0222a002470d140c030b20960221a002410421040c140b209c0220a002460d01410521040c130b20a0022d0004210420a0022084026a21a0022004208602470d0f0b0240209d02450d00209602101d0b2099022097022086027422046a2106024002400240024002400240024002400240209702450d0020990220f8016a210b2004208a026a21072099022104034020042d00002105208c02200420ff016a2d00003a00002003200420f6016a2f00003b01002005208902460d022003413c6a208b026a2208208c022d00003a0000200320032f01003b013c20042086026a290200212e200320fb016a200420fb016a28020036020020f70120032f013c3b000020f701208b026a20082d00003a0000200320053a00002003202e370204200341c0006a2003200341286a102d20032d004022a102208d02462205450d05200b20fa016a210b2007208a026a2107200420fa016a22042006470d000c040b0b20990222042006460d020c010b200420fa016a22042006460d010b03400240024020042d0000220b208702460d00200b208902470d010c030b20042084026a28020020880271450d0020042086026a280200101d0b200420fa016a22042006470d000b0b0240209802450d00209902101d0b2085022802002126200328022c2194022003280228210520fc01280200220a210b0340024002400240024020052084026a2208280200200520fb016a22062802002204470d00200420f6016a22072004490d48200420f601742209200720072009491b2209208302480d482004450d0120052086026a28020020042009101e22070d020c0d0b20052086026a28020021070c020b2009101f2207450d0b0b2008200936020020052086026a2007360200200628020021040b2006200420f6016a360200200720046a200b20820272200b20810271200b2080027622041b3a00002004210b20040d000b02402008280200220b200628020022046b200a4f0d002004200a6a22072004490d44200b20f601742204200720072004491b2204208302480d44200b450d0220052086026a280200200b2004101e220b0d030c0b0b20052086026a280200210b0c030b20032d004321a20220032f004121a302200341c0006a2084026a29030021a402200328024421a50202402007450d00034002400240200b208e026a22042d00002207208702460d002007208902470d010c030b200b28020020880271450d00200b208f026a280200101d0b200b20fa016a210b200420fa016a2006470d000b0b0240209802450d00209902101d0b0240208502280200450d00200328022c101d0b2005450d0320950221940220950220ef01470d0b0c340b2004101f220b450d080b2008200436020020052086026a200b360200200628020021040b20062004200a6a360200200b20046a209402200a10ce031a02402026450d00209402101d0b20950221940220950220ef01470d070c310b20950220ef01460d12411821fe03411421ff03411021800441042181044109218204410821830441ffffffff032184044170218504411f214d0c0a0b200641011020000b200641011020000b200b41011020000b200941011020000b200541011020000b200441011020000b4117214d0c010b4117214d0c010b411121040c330b411121040c320b411121040c310b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b20a20220fa0174210402402034450d002035101d0b20a30220047221040240200341186a41086a280200450d00200328021c101d0b200020043b0001200020a1023a0000200041036a20044110763a0000200041086a20a402370000200041046a20a50236000041002107410121c6014101210c4101219d034101219c034101210b410121060b410121050b4101210820012d00002204410e4b0d100b02400240024020040e0f000b0a0904060c0d11120f02070501000b200141086a280200450d1b200141046a280200101d200341d0006a24000f0b0240200141086a280200450d00200141046a280200101d0b0240200141146a2802002202450d00200141186a280200450d002002101d0b200141246a280200450d1a200141206a280200101d200341d0006a24000f0b2007450d19410c21c7032001410c6a2802002204450d00411821c803410421c903200141046a28020022ca03200441186c6a21cb03411421cc03411021cd03410921ce03410821cf0341ffffffff0321d003417021d1034119214d0c140b200141086a280200450d18200141046a280200101d200341d0006a24000f0b200141086a280200450d17200141046a280200101d200341d0006a24000f0b2008450d16200141046a2d000022044102460d0e20044101460d0d20040d102001410c6a280200450d16200141086a280200101d200341d0006a24000f0b209d03450d15200141086a280200450d15200141046a280200101d200341d0006a24000f0b2005450d14410c21d2032001410c6a2802002204450d00411c21d303410421d403200141046a28020022d5032004411c6c6a21d603410821d703411421d803411021d903410921da0341ffffffff0321db03417021dc03411a214d0c100b200141086a280200450d13200141046a280200101d200341d0006a24000f0b200c450d1202402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241286a2102200441586a22040d000b0b200141086a280200450d12200141046a280200101d200341d0006a24000f0b02402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d002002280200101d0b200241106a2102200441706a22040d000b0b200141086a280200450d11200141046a280200101d200341d0006a24000f0b20c601450d100240200141086a280200450d00200141046a280200101d0b200141146a280200450d10200141106a280200101d200341d0006a24000f0b209c03450d0f200141086a280200450d0f200141046a280200101d200341d0006a24000f0b200b450d0e2001410c6a2802002204450d00410421dd03200141046a28020022de0320044104746a21df03411021e003410921e103410821e20341ffffffff0321e303417021e403411b214d0c0b0b200141086a280200450d0d200141046a280200101d200341d0006a24000f0b2006450d0c410c21e5032001410c6a2802002204450d00411c21e603410421e703200141046a28020022e8032004411c6c6a21e903410821ea03411421eb03411021ec03410921ed0341ffffffff0321ee03417021ef03411c214d0c0a0b200141086a280200450d0b200141046a280200101d200341d0006a24000f0b02402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d002002280200101d0b200241146a21022004416c6a22040d000b0b200141086a280200450d0a200141046a280200101d200341d0006a24000f0b20011045200341d0006a24000f0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b101d0b2002410c6a2102200441746a22040d000b0b200141106a280200450d082001410c6a280200101d200341d0006a24000f0b200141146a2802002204450d00410c2186042001410c6a28020022870420044104746a21880441102189044108218a044104218b044174218c044126214d0c060b200141106a280200450d062001410c6a280200101d200341d0006a24000f0b2001410c6a280200450d05200141086a280200101d200341d0006a24000f0b411121040c110b411121040c100b411121040c0f0b411121040c0e0b411121040c0d0b200341d0006a24000f0b02402034450d002035101d0b200341186a41086a280200213d200328021c21092003280218220541046a2108200341246a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d122004410174220d20072007200d491b220d4100480d122004450d0120052802002004200d101e22070d020c070b200528020021070c020b200d101f2207450d050b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d11200b4101742204200620062004491b22044100480d11200b450d012005280200200b2004101e220b450d050c020b2005280200210b0c020b2004101f220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002139410121374101210d410121380b4101213a0c040b200441011020000b200d41011020000b0240208201450d00208301101d0b208101218001208101206c470d060b0240201b450d00201c101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d0d2004410174220d20072007200d491b220d4100480d0d2004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d0c200b4101742204200620062004491b22044100480d0c200b450d012005280200200b2004101e220b450d070c020b2005280200210b0c020b2004101f220b450d050b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213a410121374101210d41012138410121390b4101213b0b4101213c0b4101213d410621040c030b200441011020000b200d41011020000b4108214d411121040c000b0b1021000b1021000b410141011020000bdf0401077f200441046a210502400240024002400240024002400240200441086a2802002004410c6a2802002206470d00200641016a22072006490d0520064101742208200720072008491b22074100480d052006450d01200528020020062007101e2208450d020c030b200528020021080c030b2007101f22080d010b200741011020000b200441086a2007360200200441046a20083602002004410c6a28020021060b2004410c6a2207200641016a360200200820066a20024101463a0000200441086a2109200441046a210a03400240024002400240200928020020072802002206470d00200641016a22082006490d052006410174220b20082008200b491b220b4100480d052006450d0120052802002006200b101e22080d020c060b200528020021080c020b200b101f2208450d040b2009200b360200200a2008360200200728020021060b2007200641016a360200200820066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2101200441086a2108200441046a210b03400240024002400240200828020020012802002206470d00200641016a22072006490d0620064101742209200720072009491b22094100480d062006450d01200528020020062009101e22070d020c080b200528020021070c020b2009101f2207450d060b20082009360200200b2007360200200128020021060b2001200641016a360200200720066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411a3a00000f0b1021000b200b41011020000b200941011020000bfe07030f7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009101e22080d020c060b200228020021080c020b2009101f2208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b200141086a280200210a2001280204220b2107024002402001410c6a280200220c450d00200b21072005450d00200b200c410c6c6a220d41746a210e200241086a210341002107200b210f0340200f210802400340200828020022100d01200741016a2107200d2008410c6a2208470d000c040b0b2008410c6a210f200741016a21112005417f6a2105200841046a290200211203400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001101e22090d020c0a0b200228020021090c020b2001101f2209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2012422088a72213210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001101e22090d020c0b0b200228020021090c020b2001101f2209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20134f0d00200720136a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007101e22060d020c0b0b200228020021060c020b2007101f2206450d090b2002200636020020042007360200200328020021070b2003200720136a360200200620076a2010201310ce031a02402012a7450d002010101d0b0240200e2008460d002011210720050d010b0b2008410c6a21070b2007200b200c410c6c6a2202460d000340024020072802002206450d00200741046a280200450d002006101d0b2007410c6a22072002470d000b0b0240200a450d00200b101d0b2000411a3a00000f0b1021000b200941011020000b200141011020000b200141011020000b200741011020000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a101e22060d010c040b200a101f2206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d00200620052009101e2206450d010c030b2009101f22060d020b200941011020000b200a41011020000b200921050b200620076a2004200810ce031a02402003450d002004101d0b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a101e2206450d020c030b200820096a20076a21030c030b200a101f22060d010b200a41011020000b200a21050b200620086a20076a200c200910ce031a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d01200228020020072004101e220b0d020c060b2002280200210b0c020b2004101f220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d01200228020020092007101e2209450d020c050b200228020021090c050b2007101f22090d030b200741011020000b1021000b200441011020000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a2006200310ce031a02402005450d002006101d0b2000411a3a00000240200141106a280200450d00200c101d0b0bb70301087f2002410c6a2103200241046a2104200141086a28020022052106024002400240024003400240024002400240200241086a220728020020032802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120042802002008200a101e22090d020c060b200428020021090c020b200a101f2209450d040b2007200a36020020042009360200200328020021080b2003200841016a360200200920086a200641807f72200641ff0071200641077622081b3a00002008210620080d000b2001280204210920012802002106024002400240200241086a28020022032002410c6a28020022086b20054f0d00200820056a22072008490d0320034101742208200720072008491b22084100480d032003450d01200241046a28020020032008101e2203450d020c050b200241046a28020021030c050b2008101f22030d030b200841011020000b1021000b200a41011020000b200241086a2008360200200241046a20033602002002410c6a28020021080b2002410c6a200820056a360200200320086a2006200510ce031a02402009450d002006101d0b2000411a3a00000ba707010c7f230041c080016b2202240041002103200141086a2104200141046a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d08200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff01714104490d030b200241086a41004180800110cd031a2006450d03200141086a210a200141046a210b41002108410021074101210c410021040340200b280200220d200a28020022096b200620046b220341808001200341808001491b2203490d06200920036a22052009490d09200d2005490d0a200241086a200128020020096a200310ce031a200a20053602000240024002400240200720086b20034f0d00200820036a22092008490d0f20074101742205200920092005491b22054100480d0f2007450d01200c20072005101e220c0d020c100b200320086a21090c020b2005101f220c450d0e0b200521070b200c20086a200241086a200310ce031a200921082006200320046a22044b0d000c050b0b410f21030c010b200241013a00b880012002411c6a41013602002002410136029480012002420137020c20024190afc4003602082002200241b880016a360290800120022002419080016a360218200241a080016a200241086a1028410521030b2000200336020420004101360200200041086a20022902a08001370200200041106a200241a080016a41086a2802003602000c090b4101210c41002107410021090b2000200c36020420004100360200200041146a2009360200200041106a41003602002000410c6a2009360200200041086a2007360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241013602bc8001200242013702a4800120024190afc4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a1028200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a2900003700002007450d06200c101d200241c080016a24000f0b417f2009102a000b20092007102b000b20092005102a000b2005200d102b000b1021000b200541011020000b200241c080016a24000be007010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241013602242002420137022c20024190afc40036022820022002410f6a3602202002200241206a360238200241106a200241286a1028200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff017141034d0d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff017141034d0d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241013602242002420137022c20024190afc4003602282002200241106a3602202002200241206a3602382002200241286a1028410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241013602242002420137022c20024190afc4003602282002200241106a3602202002200241206a3602382002200241286a1028410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f2004102a000b20042003102b000b417f2006102a000b20062003102b000b417f200441016a102a000b200441016a2003102b000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d0000220641187441187522074100480d002005410371450d01200441016a22042002490d0f0c100b4280808080102108200641f6b1c2006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000bca07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a410041800810cd031a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a200310ce031a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e2009101e220d0d020c100b200320086a21050c020b2009101f220d450d0e0b2009210e0b200d20086a200241086a200310ce031a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d2005105720022802084101470d050240200e450d00200d101d0b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410136028c082002420137020c20024190afc400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a1028410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410136028c08200242013702ac0820024190afc4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a1028200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d101d200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f2009102a000b20092007102b000b20092005102a000b20052007102b000b1021000b200941011020000b200241c0086a24000bb70b05077f017e037f017e017f230041d0016b22022400200241b0016a41186a22034200370300200241b0016a41106a22044200370300200241b0016a41086a22054200370300200242003703b001200241b0016a2001280200220620012802042207412020074120491b220810ce031a2001200720086b3602042001200620086a360200024002402007411f4d0d0020024190016a41186a2207200329030037030020024190016a41106a2208200429030037030020024190016a41086a22062005290300370300200220022903b00137039001200241f0006a41186a2007290300370300200241f0006a41106a2008290300370300200241f0006a41086a20062903003703002002200229039001370370410121070c010b410021070b200241b0016a41186a2208200241f0006a41186a290300370300200241b0016a41106a2206200241f0006a41106a290300370300200241b0016a41086a2203200241f0006a41086a290300370300200220022903703703b001024002400240024002402007450d00200241306a41186a2008290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903b00137033020022001105a2002290300a7450d0120022903082109200241b0016a41186a22054200370300200241b0016a41106a220a4200370300200241b0016a41086a220b4200370300200242003703b001200241b0016a20012802002204200141046a22032802002207412020074120491b220810ce031a2003200720086b22063602002001200420086a22083602002007411f4d0d0220024190016a41186a2207200529030037030020024190016a41106a2204200a29030037030020024190016a41086a2205200b290300370300200220022903b00137039001200241d0006a41186a2007290300370300200241d0006a41106a2004290300370300200241d0006a41086a20052903003703002002200229039001370350200241b0016a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd031a200241b0016a2008200710ce031a2003200620076b3602002001200820076a3602002006411f4d0d0320024190016a41186a2207200241b0016a41186a220329030037030020024190016a41106a2208200241b0016a41106a220429030037030020024190016a41086a2206200241b0016a41086a2205290300370300200220022903b00137039001200241f0006a41186a220a2007290300370300200241f0006a41106a220b2008290300370300200241f0006a41086a220c20062903003703002002200229039001370370200241b0016a2001105b20022802b0012201450d0420022902b401210d2003200241306a41186a2903003703002004200241306a41106a2903003703002005200241306a41086a2903003703002006200241d0006a41086a2903003703002008200241d0006a41106a2903003703002007200241d0006a41186a290300370300200241106a41086a220e200c290300370300200241106a41106a220c200b290300370300200241106a41186a220b200a290300370300200220022903303703b0012002200229035037039001200220022903703703102000200d37020c2000200136020820002009370300200041146a20022903b0013702002000411c6a2005290300370200200041246a20042903003702002000412c6a2003290300370200200041346a2002290390013702002000413c6a2006290300370200200041c4006a2008290300370200200041cc006a2007290300370200200041ec006a200b290300370200200041e4006a200c290300370200200041dc006a200e290300370200200041d4006a2002290310370200200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000bbe0503057f027e037f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce031a02400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00082204ad210702400240200441037122034102460d00024020034101460d0020030d022004410276ad2107420121080c050b200241003a0008200241086a20052006410047220410ce031a20062004490d07200141046a200620046b3602002001200520046a3602002006450d0220023100084208862007844202882107420121080c040b200241003a0006200241003b0104200241046a200520064103200641034922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0120023301042002310006421086844208862007844202882107420121080c030b02400240200441027622044104460d0020040d0120024100360208200241086a200520064104200641044922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0220023502082107420121080c040b4200210820024200370308200241086a200520064108200641084922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0220022903082107420121080c030b200441046a220941084b0d0042002107200141046a210a410021030340200241003a0008200241086a20052006410047220410ce031a20062004490d05200a200620046b220b3602002001200520046a22053602002006450d0120023100082003410374413871ad86200784210742012108200b2106200341016a22042103200441ff01712009490d000c030b0b420021080b0b2000200737030820002008370300200241106a24000f0b20052004102a000b20042006102a000b20042006102a000bdd1805027f017e147f017e097f230041f0026b22022400200241186a200110b501024002400240024002400240024002400240024002402002280218450d00200228021c2203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d012005101f2206450d032003450d020c040b20004100360200200241f0026a24000f0b4108210620030d020b41002116410021120c020b200541081020000b200241ec016a2105200241d8016a41086a2107200241d8016a41047221082002419d016a2109200241d8016a41076a210a200241206a410172210b200241a0026a210c200241eb016a220d41056a210e4100210f4100211041002111200321120340200141046a22132802002114200241003a00d801200241d8016a200128020022152014410047221610ce031a024002400240024002400240024020142016490d002013201420166b22173602002001201520166a22163602002014450d0920022d00d801221441044b0d090240024002400240024002400240024002400240024020140e050004020301000b200241086a200110b5012002280208450d13200228020c2214417f4c0d172014450d04201410792215450d0b2015200128020020132802002216201420162014491b221610ce031a201328020022172016490d0c2013201720166b3602002001200128020020166a36020020162014460d050c090b200241003602d801200241d8016a201620174104201741044922151b221410ce031a2013201720146b3602002001201620146a36020020150d1220022802d8012116200241106a200110b5012002280210450d1220022802142214417f4c0d162014450d06201410792217450d0c2017200128020020132802002215201420152014491b221510ce031a201328020022182015490d0d2013201820156b3602002001200128020020156a36020020152014470d070c0e0b200241d8016a2017412020174120491b22146a41004100412020146b2014411f4b1b10cd031a200241d8016a2016201410ce031a2013201720146b3602002001201620146a3602002017411f4d0d11200241c8016a41086a200a41086a2800003602002002200a2900003703c8012002200d290000370390012002200e2900003700950120022f01d801211420022d00da01211620022800db0121152009411f6a200241d8016a411f6a290000370000200941186a200241d8016a41186a290000370000200941106a200241d8016a41106a290000370000200941086a2007290000370000200920022900d8013700002015410876211a20142016411074722116410121180c0e0b200242003703d801200241d8016a20162017410820174108491b221410ce031a2013201720146b22153602002001201620146a2216360200201741074d0d1020022903d8012104200241d8016a201541c000201541c000491b22146a4100410041c00020146b2014413f4b1b10cd031a200241d8016a2016201410ce031a2013201520146b3602002001201620146a3602002015413f4d0d10200241c8016a41086a200a41086a28000036020020024190016a41086a200d41086a29000037030020024190016a41106a200d41106a29000037030020024190016a41186a200d41186a29000037030020024190016a41206a200d41206a29000037030020024190016a41256a200d41256a2900003700002002200a2900003703c8012002200d2900003703900120022800db012215410876211a20022f01d80120022d00da01411074722116410221180c0d0b200241a8026a200110b90220022802a8022215450d0f20022902ac022104200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220043703c80120022008290200370390012015410876211a410021180c020b4101211541002014470d040b200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220082902003703900120022014ad22044220862004843703c8012015410876211a410421180b0c090b4101211741002014460d070b2014450d0a2017101d0c0a0b2014450d092015101d0c090b20162014102a000b201441011020000b20162017102a000b201441011020000b20152018102a000b2017450d032016411876211520022014ad22194220862019843702cc01200220173602c801410321180b200241e0026a41086a221b200241c8016a41086a280200360200200241a8026a41086a221420024190016a41086a290300370300200241a8026a41106a221320024190016a41106a290300370300200241a8026a41186a221720024190016a41186a290300370300200241a8026a41206a221c20024190016a41206a290300370300200241a8026a41286a221d20024190016a41286a290300370300200241a8026a41306a221e20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a80220024180016a41086a221f201b280200360200200241c8006a41086a221b2014290300370300200241c8006a41106a22202013290300370300200241c8006a41186a22212017290300370300200241c8006a41206a2222201c290300370300200241c8006a41286a221c201d290300370300200241c8006a41306a221d201e280200360200200220022903e00237038001200220022903a8023703482007200229038001370000200741086a201f28020036000020052002290348370000200541086a201b290300370000200541106a2020290300370000200541186a2021290300370000200541206a2022290300370000200541286a201c290300370000200541306a201d2802003600002002201a410874201541ff0171723602dc01200220183a00d801200220163b00d901200220164110763a00db01200c2004370300200241206a200241d8016a10b70220022d00202115200241a8026a411f6a2218200b411f6a2900003700002017200b41186a2900003703002013200b41106a2900003703002014200b41086a2900003703002002200b2900003703a80220154103460d03201141016a2116200241d8016a411f6a221b2018290000370000200241d8016a41186a22182017290300370300200241d8016a41106a2217201329030037030020072014290300370300200220022903a8023703d801024020112012470d00200f20162016200f491b2212ad42287e2219422088a70d052019a722144100480d0502402011450d00200620102014101e22060d010c070b2014101f2206450d060b200620106a221420153a0000201441206a201b290000370000201441196a2018290300370000201441116a2017290300370000201441096a2007290300370000201441016a20022903d801370000200f41026a210f201041286a21102016211120162003490d000b0b2000201236020420002006360200200041086a2016360200200241f0026a24000f0b200241e0026a41086a200241c8016a41086a280200360200200241a8026a41086a220520024190016a41086a290300370300200241a8026a41106a220120024190016a41106a290300370300200241a8026a41186a221420024190016a41186a290300370300200241a8026a41206a20024190016a41206a290300370300200241a8026a41286a20024190016a41286a290300370300200241a8026a41306a20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a802200241033a0020200241a8026a411f6a200b411f6a2900003700002014200b41186a2900003703002001200b41106a2900003703002005200b41086a2900003703002002200b2900003703a8020b2000410036020002402011450d00200621050340024020052d00002201450d00024020014101470d00200541086a280200450d01200541046a280200101d200541286a2105201041586a22100d020c030b200541106a280200450d002005410c6a280200101d0b200541286a2105201041586a22100d000b0b02402012450d002006101d0b200241f0026a24000f0b1021000b201441081020000b102e000b900d010a7f23004180026b2202240002400240024002402001411041f8b3c200410041001002417f460d00200241e0016a41186a22034200370300200241e0016a41106a4200370300200241e0016a41086a22044200370300200242003703e001410020014110200241e0016a41204100100222052005417f461b220541204922060d03200241c0016a41186a2003290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2004290300370300200220022903e0013703c001200241003a00e00120014110200241e0016a41012005412020061b2204100241016a41014b2205450d0320022d00e0012106200241186a200241c0016a41186a290300370300200241106a2003290300370300200241086a200241c0016a41086a290300370300200220022903c001370300200241003a00e00120014110200241e0016a4101200420056a2203100241016a41014b2204450d03200320046a210320022d00e0012204450d0120044101470d03200241f8016a4200370300200241e0016a41106a4200370300200241e8016a4200370300200242003703e00120014110200241e0016a4120200310022204417f460d032004411f4d0d03200241c0016a41186a2204200241e0016a41186a290300370300200241c0016a41106a2205200241e0016a41106a290300370300200241c0016a41086a2207200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22082004290300370300200241a0016a41106a22042005290300370300200241a0016a41086a22052007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903a00137038001200341206a2103410121050c020b200041023a002120024180026a24000f0b410021050b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a2903003703002002200229038001370360200241003a00e00120014110200241e0016a41012003100241016a41014b2207450d0041002104024020022d00e0012208450d0020084101470d01200241f8016a4200370300200241e0016a41106a4200370300200241e8016a4200370300200242003703e00120014110200241e0016a4120200320076a10022201417f460d012001411f4d0d01200241c0016a41186a2201200241e0016a41186a290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2204200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121040b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220720024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200241e0016a41186a220b2008290300370300200241e0016a41106a22082009290300370300200241e0016a41086a2209200a290300370300200241c0016a41086a220a2007290300370300200241c0016a41106a22072003290300370300200241c0016a41186a22032001290300370300200220022903403703e001200220022903203703c001200020053a0021200020063a0020200041c2006a20043a0000200020022903e0013700222000412a6a2009290300370000200041326a20082903003700002000413a6a200b290300370000200041c3006a20022903c001370000200041cb006a200a290300370000200041d3006a2007290300370000200041db006a200329030037000020024180026a24000f0b41df88c0004133103a000be90101047f230041b0016b220224000240024002402001411041f8b3c200410041001002417f460d002002421037020c20022001360208200241d8006a200241086a105e20022802582201450d02200241e0006a2802002103200228025c2104200241e8006a200241086a105f20022d006822054102460d01200241156a200241e8006a41017241c10010ce031a200020053a000c2000200336020820002004360204200020013602002000410d6a200241156a41c30010ce031a200241b0016a24000f0b200041023a000c200241b0016a24000f0b2004450d002001101d0b41df88c0004133103a000bdd0403027f017e0d7f230041d0006b22022400200241086a200110d50102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b102e000b200541011020000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001002220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e101e22060d010c060b200e101f2206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d002006101d0b200241d0006a24000f0b1021000b200e41011020000bd10901087f230041a0016b2202240041002103200241003a0080012001280200200128020420024180016a410120012802081002210420012001280208200441016a41014b22046a2205360208024002402004450d00024020022d0080012204450d0020044101470d0120024180016a41186a2206420037030020024180016a41106a2207420037030020024180016a41086a220842003703002002420037038001200141086a220341002001280200200141046a28020020024180016a41202005100222042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d01200241e0006a41186a22042006290300370300200241e0006a41106a22032007290300370300200241e0006a41086a220620082903003703002002200229038001370360200241c0006a41186a22072004290300370300200241c0006a41106a22042003290300370300200241c0006a41086a2203200629030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2004290300370300200241206a41086a200329030037030020022002290340370320410121030b200241186a200241206a41186a290300370300200241106a200241206a41106a290300370300200241086a200241206a41086a2903003703002002200229032037030041002106200241003a0080012001280200200141046a28020020024180016a4101200510022104200141086a22052005280200200441016a41014b22046a22053602002004450d01024020022d0080012204450d0020044101470d0220024180016a41186a2206420037030020024180016a41106a2207420037030020024180016a41086a220842003703002002420037038001200141086a220441002001280200200141046a28020020024180016a41202005100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d02200241e0006a41186a22012006290300370300200241e0006a41106a22042007290300370300200241e0006a41086a220520082903003703002002200229038001370360200241c0006a41186a22062001290300370300200241c0006a41106a22012004290300370300200241c0006a41086a2204200529030037030020022002290360370340200241206a41186a2006290300370300200241206a41106a2001290300370300200241206a41086a200429030037030020022002290340370320410121060b200241e0006a41186a2201200241206a41186a290300370300200241e0006a41106a2204200241206a41106a290300370300200241e0006a41086a2205200241206a41086a2903003703002002200229032037036020024180016a41186a2207200241186a29030037030020024180016a41106a2208200241106a29030037030020024180016a41086a2209200241086a2903003703002002200229030037038001200020033a0000200041216a20063a00002000200229038001370001200041096a2009290300370000200041116a2008290300370000200041196a2007290300370000200041226a20022903603700002000412a6a2005290300370000200041326a20042903003700002000413a6a2001290300370000200241a0016a24000f0b200041023a0000200241a0016a24000f0b200041023a0000200241a0016a24000b8b0202037f017e230041206b22022400024002402001411041f8b3c200410041001002417f460d002002411036020420022001360200200242003703102002410020014110200241106a41084100100222032003417f461b2203410820034108491b2204360208200341074d0d012002290310210520024100360210200241086a410020014110200241106a41042004100222012001417f461b22014104200141044922011b20046a36020020010d0120022802102101200241106a2002105e20022802102203450d01200020022902143703102000200336020c2000200136020820002005370300200241206a24000f0b2000410036020c200241206a24000f0b41df88c0004133103a000bc60401067f230041106b220224002002410036020820024201370300200120021062200141046a20021062200141086a20021062200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d03200228020020042005101e2203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d04200228020020042005101e2203450d050c060b200228020021030c080b200228020021030c050b2005101f22030d050b200541011020000b2005101f22030d010b200541011020000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002106202400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d01200228020020052007101e2204450d020c040b200228020021040c040b2007101f22040d020b200741011020000b1021000b2002200736020420022004360200200721050b200420036a2006200110ce031a200041102004200320016a100302402005450d002004101d0b200241106a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d05200128020020002004101e2203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d08200128020020032000101e2203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000101e22030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004101e22030d0a0c0e0b2004101f22030d110b200441011020000b200128020021030c050b200128020021030c070b2000101f22030d0b0b200041011020000b2000101f2203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b2004101f2203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000101e22020d020c070b200128020021020c020b2000101f2202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b1021000b200041011020000b200441011020000b200041011020000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000bcf0101047f200020014105746a210320002104024002400340200320046b41ff004d0d014101210520042002460d0220042002412010d003450d02200441206a22062002460d0220062002412010d003450d02200441c0006a22062002460d0220062002412010d003450d02200441e0006a22062002460d0220044180016a210420062002412010d0030d000c020b0b024020042003460d00200020014105746a210603404101210520022004460d0220042002412010d003450d022006200441206a2204470d000b0b41000f0b20050b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b41e8dac00041f403103a000bbc0d05057f027e017f017e047f230041b00a6b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042105200241146a2802002106200241246a2802002107200241346a2802002108200441186a200128022429033042004220420010d203200128022c2202420020022903082209427f200429031820042903204200521b7d220a200a200956200a507222031b37030841052102024020030d004120101f220b450d05200b4200370000200b41176a4200370000200b41106a4200370000200b41086a4200370000200b411f6a41003a0000024020012802282802082005200b412010102203417e460d0020030d07024002400240024002402006450d00200441086a200141246a28020029033042002008ad220c420010d2032001412c6a2802002203420020032903082209427f200429030820042903104200521b7d220a200a200956200a507222031b37030820030d052008450d0120084100480d102008101f220d450d1141012103200d2105024020084102490d00200d41002008417f6a220310cd0320036a2105200821030b200541003a00000c020b4100210d0c020b410021034101210d4200210c0b200141286a2802002802082007200d200310102205417e460d0120050d0c200d450d02200c2003ad42208684210a0b200128020028021821064120101f220e450d09200e200b290000370000200e41186a200b41186a290000370000200e41106a200b41106a290000370000200e41086a200b41086a290000370000200628020c0d0a2006410c6a417f360200200441f8096a41186a200641e4006a290000370300200441f8096a41106a200641dc006a290000370300200441f8096a41086a200641d4006a2900003703002004200629004c3703f80902400240200641106a220f280200220541f0c0c100460d00200641146a28020021070c010b418009101f2205450d0f41002107200541003b010620054100360200200541086a20044180016a41f80810ce031a200641146a4100360200200641106a20053602000b0240024002400240034020052f01062210410574210841002102410021030240034020082002460d01200441f8096a200520026a41086a412010d0032201450d03200241206a2102200341016a21032001417f4a0d000b2003417f6a21100b02402007450d002007417f6a2107200520104102746a4180096a28020021050c010b0b200441286a41186a200441f8096a41186a290300370300200441286a41106a200441f8096a41106a290300370300200441286a41086a200441f8096a41086a290300370300200420042903f809370328200641186a2102410021072010210341000d010c020b200641186a21024101450d010b20044198016a420037030020044194016a41f0c0c100360200200441003602a00120044100360290012004420037038801200441f0c0c1003602840120044100360280012005200341c8006c6a41e8026a210220044180016a10320c010b200441f8096a411c6a200441286a41086a2903003702002004419c0a6a200441286a41106a290300370200200441a40a6a200441286a41186a290300370200200420023602880a200420033602840a2004200f3602800a200420053602fc09200420073602f8092004200429032837028c0a20044180016a411c6a420037020020044180016a41106a200441f0006a41086a290300370300200441a5016a2004290048370000200441ad016a200441c8006a41086a290000370000200441b5016a200441c8006a41106a290000370000200441bd016a200441c8006a41186a290000370000200441c4016a200441e7006a2800003600002004420037038001200441023a00a401200441f0c0c100360298012004200429037037038801200441f8096a20044180016a103121020b200442a0808080800437024c2004200e3602482004200a3702fc092004200d3602f80920044180016a200241186a200441c8006a200441f8096a10f8010240200428028001450d002004280284012202450d0020044188016a280200450d002002101d0b2006410c6a2202200228020041016a360200200b101d410421020c020b200c500d00200d101d0b200b101d0b20002002360200200441b00a6a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b412041011020000b4198afc400102c000b412041011020000b10f901000b4198afc400102c000b1021000b200841011020000b41800941081020000bd50303017f027e017f230041c0006b220424000240024002402003450d0020022802000d00200228020421032004200128022429033042004220420010d203200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b37030802400240024020020d004120101f2202450d0420024200370000200241176a4200370000200241106a4200370000200241086a42003700002002411f6a41003a00000240200128022828020820032002412010102203417e460d0020030d06200441106a20012802002802182203410c6a200341cc006a2003410020032802001b2002412010f7012004280210450d02200441206a41086a200441106a41086a220328020036020020042004290310370320200441306a41086a2207200328020036020020042004290310370330200141186a210302402001411c6a280200450d002003280200101d0b20032004290330370200200341086a2007280200360200410021010c030b2002101d0b20004105360200200441c0006a24000f0b200141206a4100360200410121010b2002101d2000410036020020002001360204200441c0006a24000f0b41e8dac00041f403103a000b412041011020000b4198afc400102c000ba80d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903304200200241146a2802002202ad420010d203200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a2002101f2203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e10cd03200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b10cd031a20044180016a2003200510ce031a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d002003101d0b200441106a200141246a28020029033042002008ad420010d2032001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b2008101f2202450d0e2002210541002103024020084102490d00200241002008417f6a220310cd0320036a21050b200541003a0000200341016a21030c020b2002450d102003101d0c100b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b10ce031a2003410f4d0d0020044188016a290300210f200429038001211002402008450d002002101d0b2004200141246a2802002903304200200aad420010d2032001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a101f2202450d1041012103200221050240200a4102490d0020024100200a417f6a220310cd0320036a2105200a21030b200541003a00000c020b2008450d102002101d0c100b4100210a41012102410021030b02400240024002400240200141286a28020028020820092002200310102205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210e20012802182108200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d0141012103200e450d022008101d200a0d030c040b200a450d122002101d0c120b2005200b200c7d3703082005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b3703602001280200280218210720044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a8012004200e3602a401200420083602a001200441f0006a200720044180016a2010200f200441d0006a20022003200441a0016a1041200441f0006a41086a290300210c2004280274210e200428027021082005200429035820052903087c3703084101210320084101460d00200e450d0002402001411c6a2203280200450d00200141186a280200101d0b2003200c370200200141186a200e360200410021030b200a450d010b2002101d0b2000410036020020002003360204200441b0016a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b4198afc400102c000b200841011020000b4198afc400102c000b200a41011020000b20004105360200200441b0016a24000b961006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903304200200241146a2802002202ad420010d203200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a2002101f2203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e10cd03200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b10cd031a200441f8006a2003200510ce031a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d002003101d0b200441186a200141246a28020029033042002008ad420010d2032001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b2008101f2202450d0e2002210541002103024020084102490d00200241002008417f6a220310cd0320036a21050b200541003a0000200341016a21030c020b2002450d152003101d0c150b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b10ce031a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d002002101d0b200441086a200141246a2802002903304200200aad420010d2032001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a101f2202450d1041012103200221050240200a4102490d0020024100200a417f6a220310cd0320036a2105200a21030b200541003a00000c020b2008450d152002101d0c150b4100210a41012102410021030b02400240200141286a28020028020820092002200310102205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b2005200b200c7d3703082005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a20012802002802182010200f20044198016a200441386a20022003102f4101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200a0d130c140b200a450d142002101d0c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a220e200441c9016a290000370300200441f8006a41086a2208200441c1016a290000370300200420042900b901370378200441d8006a41086a22072008290300370300200441d8006a41106a2208200e290300370300200441d8006a41186a220e2003290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200441b8016a41186a200e290300370300200441b8016a41106a2008290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a28020020052003101e2205450d020c110b200141186a28020021050c110b2003101f22050d0f0b200341011020000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b4198afc400102c000b200841011020000b4198afc400102c000b200a41011020000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b2002101d0b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad420010d203200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b101e2203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b101f22030d060b200b41011020000b41e8dac00041f403103a000b41e8dac00041f403103a000b41dcdec00041fd00103a000b41d0cfc200102c000b1021000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a10cd031a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b0240200128022828020820052003200210102208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d002005101d0b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d002003101d0b20004105360200200441106a24000f0b4198afc400102c000b900101027f2001280200210402404120101f2205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b960101027f2001280200280218210402404120101f2205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b7703017f027e017f200128022c220441186a29030021052004290310210602404110101f2204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a280200101d0b20004104360200200742908080808002370200200141186a20043602000f0b411041011020000b6202017e027f200128022c290308210402404108101f2205450d002005200437000002402001411c6a2206280200450d00200141186a280200101d0b20004104360200200642888080808001370200200141186a20053602000f0b410841011020000bab03020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220b41086a210c200b2f0106220a41057421064100210d0240024003402006450d012007200c412010d003220e450d02200641606a2106200d41016a210d200c41206a210c200e417f4a0d000b200d417f6a210a0b2009450d022009417f6a2109200b200a4102746a4180096a21060c010b0b200b41e8026a200d41c8006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a280200280214110100200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a3602004110101f2206450d01200620103700002006200f37000802402001411c6a220c280200450d00200141186a280200101d0b20004104360200200c42908080808002370200200141186a2006360200200441106a24000f0b103f000b411041011020000b7703017f027e017f2001280200220441086a29030021052004290300210602404110101f2204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a280200101d0b20004104360200200742908080808002370200200141186a20043602000f0b411041011020000b930101027f2001280200210402404120101f2205450d002005200429003c370000200541186a200441d4006a290000370000200541106a200441cc006a290000370000200541086a200441c4006a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b6202017e027f2001280200290310210402404108101f2205450d002005200437000002402001411c6a2206280200450d00200141186a280200101d0b20004104360200200642888080808001370200200141186a20053602000f0b410841011020000bd70a04027f027e027f047e23004180036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903304200200241146a2802002202ad420010d203200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d052002101f2203450d062003210841002109024020024102490d00200341002002417f6a220910cd0320096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b02400240200128022828020820052003200910102205417e460d0020050d042003450d0c2004200936029c01200420033602980120044180026a20044198016a10b7012004280280022205410f470d010b2002450d0b2003101d0c0b0b200441a0016a20044180026a41047241dc0010ce031a20042005360238200441386a410472200441a0016a41dc0010ce031a02402002450d002003101d0b20044100360288022004420137038002200441386a20044180026a10b20120042802880221030240200428028402450d00200428028002101d0b4200210720044180026a41086a22024200370300200442003703800241eaf3c100411b20044180026a1001200441a0016a41086a2205200229030037030020042004290380023703a00102400240200441a0016a411041f8b3c200410041001002417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010022209417f460d072009410f4d0d0720044188026a2903002106200429038002210a0c010b4200210a420021060b2002420037030020044200370380024185f4c100411b20044180026a10012005200229030037030020042004290380023703a00102400240200441a0016a411041f8b3c200410041001002417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010022202417f460d082002410f4d0d0820044188026a290300210b20042903800221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad420010d203200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d10d103200242002002290308220620042903087d220720072006562007507222031b37030802402003450d00200441386a103c0c0b0b20012802002102200441a0016a200441386a41e00010ce031a20044198026a2002280218220241e4006a29000037030020044190026a200241dc006a29000037030020044180026a41086a200241d4006a2900003703002004200229004c37038002200441a0026a200441a0016a41e00010ce031a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4207862207422088a70d032007a722094100480d03024002402001450d00200241346a28020020014107742009101e2201450d010c0a0b2009101f22010d090b200941081020000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b41df88c0004133103a000b41df88c0004133103a000b4180dac300102c000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014107746a20044180026a41800110ce031a2003200328020041016a360200410421020c010b410521020b2000200236020020044180036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429033842002005ad420010d203200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41b0afc400102c000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429033842002005ad420010d203200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41b0afc400102c000ba60703037f037e057f230041f0006b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441106a200128022422032903204200200241146a2802002206ad2207420010d203200128022c2102427f2108024020042903184200520d00427f2004290310220820032903287c220920092008541b21080b200242002002290308220920087d220820082009562008507222031b37030841052102024020030d002004200141246a28020029033042002007420010d2032001412c6a2802002203420020032903082209427f200429030020042903084200521b7d220820082009562008507222031b37030820030d00024002402006450d0020064100480d052006101f2203450d074101210a2003210b024020064102490d00200341002006417f6a220a10cd03200a6a210b2006210a0b200b41003a00000c010b4100210a41012103420021070b0240024002400240200128022828020820052003200a10102206417e460d0020060d082003450d04200441d0006a41186a22052001280200280218220241e4006a290000370300200441d0006a41106a220b200241dc006a290000370300200441d0006a41086a220c200241d4006a2900003703002004200229004c370350200241306a220628020022012002412c6a280200470d03200141016a220d2001490d072001410174220e200d200d200e491b220dad42d8007e2208422088a70d072008a7220e4100480d072001450d01200241286a280200200141d8006c200e101e22010d020c0a0b2007500d032003101d0c030b200e101f2201450d080b2002412c6a200d360200200241286a2001360200200241306a28020021010b200241286a280200200141d8006c6a22022004290350370001200241053a0000200220042f004d3b002120022007200aad422086843700282002200336002420022004290320370330200241096a200c290300370000200241116a200b290300370000200241196a2005290300370000200241236a200441cf006a2d00003a0000200241d0006a200441c0006a290300370300200241c8006a200441206a41186a290300370300200241c0006a200441206a41106a290300370300200241386a200441206a41086a2903003703002006200628020041016a360200410421020b20002002360200200441f0006a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b1021000b4198afc400102c000b200641011020000b200e41081020000bba0603027f017e087f230041d0006b220424002004200136021c2004200041f8b3c20020011b360218200441106a200441186a10b50102400240024002400240024002402004280210450d000240024002400240024020042802142205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d002001101f2207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b102e000b200141081020000b200441306a4104722108410021094100210a410021002005210b0340200441306a200441186a107a200441c0006a41086a220c200841086a280200360200200420082902003703402004280230220d4104460d02200041016a2101200441206a41086a220e200c2802003602002004200429034037032002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c101e22070d010c070b200c101f2207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290320370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200420013602282004200b36022420042007360220200441086a200441206a1044200441306a20022004280208200428020c20031102002004410036024820044201370340200428023021004101101f21010240024020004105470d002001450d06200141013a0000200442818080801037024420042001360240420121060c010b2001450d06200141003a0000200442818080801037024420042001360240200141014102101e2101024020004104470d002001450d08200141003a0001200442828080802037024420042001360240420221060c010b2001450d08200141013a0001200442828080802037024420042001360240200441306a200441c0006a10d101200441c8006a3502002106200428024021010b2001ad422086200684210602402004280224450d002004280220101d0b200441d0006a240020060f0b200b450d002007101d0b41ffbac00041f000103a000b1021000b200c41081020000b410141011020000b410141011020000b410241011020000b410241011020000b0700200010c0030bcb0401057f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce031a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b220410ce031a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b220410ce031a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20052004102a000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a4180d9c00036020002402003450d002004450d002003101d0b200128020c2200450d010b200141106a280200450d002000101d0b02402001411c6a280200450d002001280218101d0b200128022822012001280200417f6a22003602000240024020000d002001280208100520012001280204417f6a22003602042000450d010b0f0b2001101d0f0b41908ec300102c000b0a0041a0d0c200102c000ba50201027f230041306b2202240020024106360214200241df8ac00036021020022001200241106a107e0240024002400240200228020022012002280208220341f8b3c200410041001002417f460d00200241286a4200370300200241206a4200370300200241186a42003703002002420037031020012003200241106a4120410010022203417f460d012003411f4d0d0120002002290310370000200041186a200241106a41186a290300370000200041106a200241106a41106a290300370000200041086a200241106a41086a2903003700002002280204450d030c020b20004200370000200041186a4200370000200041106a4200370000200041086a420037000020022802040d010c020b41df88c0004133103a000b2001101d0b200241306a24000bb30101037f024002400240024020022802042203417f4c0d00200228020021044101210202402003450d002003101f2202450d030b20022004200310ce03210520034101742204200341046a220220022004491b22044100480d01024002402003450d00200520032004101e2205450d010c050b2004101f22050d040b200441011020000b102e000b1021000b200341011020000b200020023602082000200436020420002005360200200520036a20013600000bcd0f02077f017e230041106b22022400200241003602082002420137030002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220341034b0d00024020030e0400040203000b200128020421014101101f2203450d1120024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d06200341206a22042003490d1c20054101742203200420042003491b22034100480d1c2005450d0c200228020020052003101e2204450d0d0c1f0b200141086a2802002103200128020421014101101f2204450d11200241086a22052005280200220541016a3602002002410136020420022004360200200420056a41013a00002002200336020c2002410c6a200210622003450d2020034105742106200241086a220728020021042002280204210503400240024002400240200520046b41204f0d00200441206a22032004490d2020054101742204200320032004491b22044100480d202005450d01200228020020052004101e22080d020c140b20022802002108200421030c020b2004101f2208450d120b200220043602042002200836020020072802002103200421050b2007200341206a2204360200200820036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a29000037000020032001290000370000200141206a2101200641606a22060d000c210b0b2001410c6a2802002103200141086a2802002108200128020421064101101f2201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41043a000020022802042205200428020022016b41044f0d02200141046a22042001490d1a20054101742201200420042001491b22014100480d1a2005450d06200228020020052001101e2204450d070c180b200141086a2802002103200128020421084101101f2201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41003a00002002200336020c2002410c6a2002106220022802042205200428020022016b20034f0d02200120036a22042001490d1920054101742201200420042001491b22014100480d192005450d07200228020020052001101e2204450d080c150b200141086a2802002103200128020421054101101f2201450d1120024101360204200241086a22042004280200220841016a36020020022001360200200120086a41033a00002005290300210920022802042205200428020022016b41084f0d03200141086a22042001490d1820054101742201200420042001491b22014100480d182005450d0a200228020020052001101e2204450d0b0c120b200228020021040c160b200228020021040c130b200228020021040c190b200228020021040c0f0b2001101f22040d110b200141011020000b2001101f22040d0d0b200141011020000b2003101f22040d120b200341011020000b2001101f22040d070b200141011020000b200441011020000b410141011020000b410141011020000b410141011020000b410141011020000b410141011020000b2002200136020420022004360200200241086a28020021010b200241086a2205200141086a360200200420016a20093700000240024002400240024020022802042204200528020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d01200228020020042001101e2204450d020c030b200228020021040c030b2001101f22040d010b200141011020000b2002200136020420022004360200200241086a28020021010b200241086a200141c0006a360200200420016a220141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a290000370000200141206a200341206a290000370000200141286a200341286a290000370000200141306a200341306a290000370000200141386a200341386a290000370000200120032900003700000c090b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a2008200310ce031a0c070b2002200136020420022004360200200241086a28020021010b200241086a2205200141046a360200200420016a20062800003600002002200336020c2002410c6a2002106202400240024020022802042204200528020022016b20034f0d00200120036a22052001490d0320044101742201200520052001491b22014100480d032004450d01200228020020042001101e2204450d020c040b200228020021040c040b2001101f22040d020b200141011020000b1021000b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a2008200310ce031a0c020b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a290000370000200320012900003700000b20002002290300370200200041086a200241086a280200360200200241106a24000be30203047f017e017f230041306b220124002001410636020c200141df8ac000360208200141106a41a68ec100200141086a108101410021020240024002400240200128021022032001280218220441f8b3c200410041001002417f460d002001410036020820032004200141086a41044100100241016a41044d0d01200128020821020b02402001280214450d002003101d0b024002402002450d002002ad4205862205422088a70d032005a722034100480d032003101f2206450d0441002104200621030340200141106a2004107d200341186a200141106a41186a290000370000200341106a200141106a41106a290000370000200341086a200141106a41086a29000037000020032001290010370000200341206a21032002200441016a2204470d000c020b0b410121060b200020023602082000200236020420002006360200200141306a24000f0b41df88c0004133103a000b1021000b200341011020000bc80101037f024002400240024020022802042203417f4c0d00200228020021044101210202402003450d002003101f2202450d030b20022004200310ce03210520034101742204200341036a220220022004491b22044100480d01024002402003450d00200520032004101e2205450d010c050b2004101f22050d040b200441011020000b102e000b1021000b200341011020000b200020023602082000200436020420002005360200200520036a220320012f00003b0000200341026a200141026a2d00003a00000bcf0703057f017e057f230041c0006b22012400200141206a41086a2202420037030020014200370320419590c000411d200141206a1001200141086a20022903003703002001200129032037030002400240024002400240024002402001411041f8b3c200410041001002417f460d002001421037021420012001360210200141206a200141106a105e20012802202202450d0102402001280224450d002002101d0b20002802002202450d06200041046a280200450d062002101d200141c0006a24000f0b024002400240024020002802002203450d00200041086a2802002104200028020421050c010b20014106360204200141df8ac000360200200141206a41a68ec1002001108101410021040240200128022022002001280228220241f8b3c200410041001002417f460d002001410036020020002002200141044100100241016a41044d0d05200128020021040b02402001280224450d002000101d0b02402004450d002004ad4205862206422088a70d022006a722004100480d022000101f2203450d0641002102200321000340200141206a2002107d200041186a200141206a41186a290000370000200041106a200141206a41106a290000370000200041086a200141206a41086a29000037000020002001290020370000200041206a21002004200241016a2202470d000b200421050c010b4101210341002104410021050b200141206a41086a2200420037030020014200370320419590c000411d200141206a1001200141086a200029030037030020012001290320370300200141003602282001420137032020012004360210200141106a200141206a106202402004450d00200441057421074100200028020022026b2108200128022021092001280224210a2003210003400240200a20086a411f4b0d00200241206a22042002490d03200a410174220b20042004200b491b22044100480d0302400240200a450d002009200a2004101e22090d010c060b2004101f2209450d050b2004210a0b200920026a22042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a290000370000200841606a2108200241206a2102200041206a2100200741606a22070d000b200141286a20023602002001200a3602242001200936022020014110200920021003200a450d070c060b2001280224210220014110200128022022092000280200100320020d050c060b1021000b200441011020000b41df88c0004133103a000b41df88c0004133103a000b200041011020000b2009101d0b2005450d002003101d0b200141c0006a24000b130020004107360204200041d8d1c2003602000b130020004109360204200041d893c0003602000b130020004101360204200041ccd5c2003602000b8e1605017f017e037f017e067f23004180066b22042400200441b8036a200141e80110ce031a200441a0026a200441b8036a10870102400240024020042802a0024101470d00200041086a20042902a4023702002000420137020020032802002200450d020c010b200441a0026a41086a290300210520044198016a200441a0026a41106a41880110ce031a20042005370308200441086a41086a20044198016a41880110ce03210620044198016a41086a22014200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200129030037030020042004290398013703b80341002101024002400240024002400240024002400240024002400240024002400240200441b8036a411041f8b3c200410041001002417f460d00200441003602a002200441b8036a4110200441a0026a41044100100241016a41044d0d0120042802a00221010b41042107200120026a41808080024b0d0d410021080240200441106a410020042903084201511b2201450d002001450d000240024002402001108801220520012903202209520d0041032107200120021089010d114113101f2207450d0d2007410f6a41002800c1ba40360000200741086a41002900baba40370000200741002900b2ba40370000200741134133101e2207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a29000037000020044198016a41086a220a420037030020044200370398012007413320044198016a1001200441b8036a41086a200a29030037030020042004290398013703b803200441b8036a411041f8b3c200410041001002417f460d01200442003703a002200441b8036a4110200441a0026a41084100100241016a41084d0d0820042903a00242017c21052007101d4113210a4113101f22070d020c0f0b4101410220092005541b21070c100b420121052007101d4113210a4113101f2207450d0d0b2007410f6a41002800c1ba40360000200741086a41002900baba40370000200741002900b2ba403700002007200a4133101e2207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a29000037000020044198016a41086a2201420037030020044200370398012007413320044198016a1001200441b8036a41086a200129030037030020042004290398013703b803200420053703a002200441b8036a4110200441a0026a410810032007101d0b024020032802002207450d00200341086a28020021012003280204210b4100210c0240419bb5c000411041f8b3c200410041001002417f460d00200441003602b803419bb5c0004110200441b8036a41044100100241016a41044d0d0520042802b803210c0b4114101f2208450d06200841106a41002800b4b640360000200841086a41002900acb640370000200841002900a4b640370000200841144128101e220a450d07200a200c36001420044198016a41086a220842003703002004420037039801200a411820044198016a1001200441b8036a41086a200829030037030020042004290398013703b803200441003602a802200442013703a002200420013602980120044198016a200441a0026a1062024002400240024020042802a402220d20042802a802220c6b20014f0d00200c20016a2208200c490d0c200d410174220e20082008200e491b220e4100480d0c200d450d0120042802a002200d200e101e22080d020c0d0b20042802a00221080c020b200e101f2208450d0b0b2004200e3602a402200420083602a002200e210d0b2008200c6a2007200110ce031a200441b8036a41102008200c20016a10030240200d450d002008101d0b200a101d41012108200b450d002007101d0b20042903082105200441b8036a200441306a41e80010ce031a200441a0026a200441b8036a41086a41e00010ce031a20044198016a41186a220a200641186a29030037030020044198016a41106a220c200641106a29030037030020044198016a41086a220d200641086a290300370300200420062903003703980141002101024020054201520d00200441c0056a41186a200a290300370300200441c0056a41106a200c290300370300200441c0056a41086a200d29030037030020042004290398013703c005410121010b20044198016a200441a0026a41e00010ce031a200441e0056a41186a2206200441c0056a41186a220a290300370300200441e0056a41106a220c200441c0056a41106a220d290300370300200441e0056a41086a220b200441c0056a41086a220e290300370300200420042903c0053703e005200441a0026a20044198016a41e00010ce031a200441a0056a41186a220f2006290300370300200441a0056a41106a2206200c290300370300200441a0056a41086a220c200b290300370300200420042903e0053703a005200441b8036a200441a0026a41e00010ce031a200a200f290300370300200d2006290300370300200e200c290300370300200420042903a0053703c0054102210602402001450d00200441e0056a41186a200441c0056a41186a290300370300200441e0056a41106a200441c0056a41106a290300370300200441e0056a41086a200441c0056a41086a290300370300200420042903c0053703e005410121060b200441a2016a200441e0056a41086a290300370100200441aa016a200441e0056a41106a290300370100200441b2016a200441f8056a290300370100200420063a009901200441003a009801200420042903e00537019a012004200441b8036a20044198016a108a012004280204210620042802002101200441003a00b803200420014100473a00b903200441b8036a108b0102400240419bb5c000411041f8b3c200410041001002417f460d00200441003602b803419bb5c0004110200441b8036a41044100100241016a41044d0d0320042802b80341016a210a0c010b4101210a0b20044198016a41086a220c4200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200c29030037030020042004290398013703b80302400240200441b8036a411041f8b3c200410041001002417f460d002004410036029801200441b8036a411020044198016a41044100100241016a41044d0d04200428029801210c0c010b4100210c0b2004200a3602b803419bb5c0004110200441b8036a4104100320044198016a41086a220a4200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200a29030037030020042004290398013703b8032004417f2002200c6a220a200a2002491b36029801200441b8036a411020044198016a410410030240024002402001450d0002402006411b470d00200141ebbec100460d02200141ebbec100411b10d003450d020b20002001360204200041086a200636020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b20004104360204200041013602002007452008720d100b200341046a280200450d0f2007101d0c0f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b412841011020000b1021000b200e41011020000b411341011020000b413341011020000b200a41011020000b413341011020000b2000410136020020002007360204200441386a108c0120032802002200450d010b200341046a280200450d002000101d20044180066a24000f0b20044180066a24000beb1607017f027e037f017e017f037e047f23004180046b2202240002400240200129037022034202520d00200241086a20014188016a41e00010ce031a420021030c010b20024186016a2001410b6a2d00003a0000200241e8006a41086a2001411c6a290200370300200241e8006a410d6a200141216a290000370000200220012f00093b018401200220012902143703682001410c6a280200210520012d0008210620012802102107200241c0016a200141e4006a290000370300200241b8016a200141dc006a290000370300200241b0016a200141d4006a290000370300200241a8016a200141cc006a290000370300200241a0016a200141c4006a29000037030020024188016a41106a2001413c6a29000037030020024188016a41086a200141346a2900003703002002200129002c3703880120012903002108200241c8016a41106a200141f0006a220941106a290300370300200241c8016a41086a200941086a290300370300200220092903003703c80120014180016a290300210a2001290378210b4200210c200241a8026a41086a22094200370300200242003703a802418cb9c000410d200241a8026a1001200241086a41086a2009290300370300200220022903a80237030842002104024002400240024002400240024002400240024002400240200241086a411041f8b3c200410041001002417f460d00200242003703a802200241086a4110200241a8026a41084100100241016a41084d0d0120022903a80221040b024020034201520d00200b500d022004200a200a2004541b22032003200a7d200b827d210c0b200241a8026a200c10af01200241fc016a41026a20022d00aa023a0000200241086a41086a2209200241bb026a290000370300200241086a410d6a220d200241c0026a290000370000200220022f01a8023b01fc01200220022900b30237030820022800ab02210e20022800af02210f200241e0016a410d6a200d290000370000200241e0016a41086a2009290300370300200220022903083703e001200241ec036a41026a220920024184016a41026a2d00003a0000200241a8026a41086a220d200241e8006a41086a290300370300200241a8026a410d6a2210200241e8006a410d6a290000370000200220022f0184013b01ec03200220022903683703a8020240024002400240024002400240200641ff01714101470d00200241f0036a200541067610b00120022802f003210920022802f8032005413f7122054d0d01200241e8036a41026a200920054105746a220541026a2d00003a0000200241d0036a200541136a290000370300200241d5036a200541186a290000370000200220052f00003b01e8032002200529000b3703c80320052800072107200528000321054101210620022802f4030d020c030b200241e8036a41026a20092d00003a0000200241c8036a41086a200d290300370300200241c8036a410d6a2010290000370000200220022f01ec033b01e803200220022903a8023703c8030c030b4100210620022802f403450d010b2009101d0b2006450d010b200241f0036a41026a200241e8036a41026a2d00003a0000200241a8026a41086a200241c8036a41086a290300370300200241a8026a410d6a200241c8036a410d6a290000370000200220022f01e8033b01f003200220022903c8033703a802410021090c010b410121094115210741d7c0c10021050b200241a4026a41026a2206200241f0036a41026a2d00003a0000200241086a41086a220d200241a8026a41086a2210290300370300200241086a41106a200241a8026a41106a290300370300200220022f01f0033b01a402200220022903a80237030802402009450d002000200536020420004101360200200041086a200736020020014188016a108c0120024180046a24000f0b20024193026a200d29030037000020024198026a200241086a410d6a290000370000200220022f01a4023b018002200220073600870220022005360083022002200229030837008b02200220062d00003a008202200220083703a802201020014188016a41e00010ce03210d200241af036a200f360000200241ab036a200e360000200241a0036a200241c8016a41106a29030037030020024198036a2201200241c8016a41086a290300370300200241aa036a200241fc016a41026a2d00003a0000200241b3036a20022903e001370000200241bb036a200241e0016a41086a290300370000200241c0036a200241e0016a410d6a290000370000200220022903c80137039003200220022f01fc013b01a8032002410036021020024201370308200241a8026a200241086a10b101200d200241086a10b2010240024002400240024002402002290390034201520d0020012903002203420c882204420120044201561b22044200510d08200241a0036a2903002004802104200228020c2205200241106a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d04200228020820052001101e2205450d050c0b0b0240200228020c200241106a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d02200228020820012009101e2205450d030c090b200228020821050c090b200228020821050c0a0b2009101f22050d060b200941011020000b2001101f22050d060b200141011020000b41df88c0004133103a000b41c8b0c400102c000b41a88ec300102c000b2002200936020c20022005360208200241106a28020021010b200241106a200141016a360200200520016a41003a00000c020b2002200136020c20022005360208200241106a28020021010b200241106a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b024002400240200228020c2206200241106a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d01200228020820062009101e2205450d020c040b200228020821050c040b2009101f22050d020b200941011020000b1021000b2002200936020c20022005360208200241106a2802002101200921060b200520016a2209200241a8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241086a41186a22094200370300200241086a41106a22074200370300200241086a41086a220e42003703002002420037030820052001200241086a1000200241c8036a41186a2009290300370300200241c8036a41106a2007290300370300200241c8036a41086a200e290300370300200220022903083703c803200241c8036a412020024188016a20024180026a100b450d01200241c8036a412020024188016a20024180026a100c45210120060d020c030b2005200120024188016a20024180026a100b450d002005200120024188016a20024180026a100c45210120060d010c020b410121012006450d010b2005101d0b02402001450d00200241c8036a41186a20024180026a41186a290300370300200241c8036a41106a20024180026a41106a290300370300200241c8036a41086a20024180026a41086a29030037030020022002290380023703c80320022903a8022104200241086a200d41e00010ce031a420121030c010b200041d998c00036020420004101360200200041086a411a360200200d108c0120024180046a24000f0b200041086a2003370300200041306a2004370300200041106a20022903c803370300200041186a200241c8036a41086a290300370300200041206a200241c8036a41106a290300370300200041286a200241c8036a41186a290300370300200041386a200241086a41e00010ce031a2000410036020020024180046a24000bb00202027f017e230041206b22012400024002404113101f2202450d002002410f6a41002800c1ba40360000200241086a41002900baba40370000200241002900b2ba40370000200241134133101e2202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141106a41086a220042003703002001420037031020024133200141106a1001200141086a200029030037030020012001290310370300024002402001411041f8b3c200410041001002417f460d002001420037031020014110200141106a41084100100241016a41084d0d01200129031021030b2002101d200141206a240020030f0b41df88c0004133103a000b411341011020000b413341011020000b9e0604017f017e037f047e230041c0006b2202240042002103200241186a41086a220442003703002002420037031841dfb9c000411b200241186a1001200241306a41086a220520042903003703002002200229031837033002400240024002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841fab9c000411b200241186a1001200520042903003703002002200229031837033002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b4200210a200241086a200320092001ad420010d203200241186a20002002290308220320087c2208200241086a41086a29030020077c2008200354ad7c410110f001024020022802184101470d00200228021c2104200241c0006a240020040f0b200241186a41106a2903002108200241186a41086a22042903002107200442003703002002420037031841aeb9c0004116200241186a1001200241306a41086a20042903003703002002200229031837033002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022204417f460d042004410f4d0d04200241206a29030021032002290318210a0c010b420021030b200241186a41086a220442003703002002420037031841aeb9c0004116200241186a1001200241306a41086a20042903003703002002200229031837033020024200200320087d200a200754ad7d2208200a20077d2207200a56200820035620082003511b22041b37032020024200200720041b370318200241306a4110200241186a41101003200241c0006a240041000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bf78a0109027f017e087f017e037f037e037f0b7e077f23004190086b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410d4b0d00024002400240024002400240024020040e0e004805090d0c0608040b030a0102000b20034188076a41086a200141106a2903003703002003200141086a2903002205370388072005a7417f6a220441064b0d49200241096a2800002106200241056a280000210720022d0001210820022d00002102024020040e070018161715191a000b20034190076a2802002109200328028c07210a200241ff0171450d2f41f1b4c0002104412a2108410021064101210b2009450d750c740b200341dc016a41026a2001410b6a2d00003a0000200341c0016a41086a200141c0006a290300370300200341c0016a41106a200141c8006a290300370300200320012f00093b01dc012003200141386a2903003703c0012001410c6a280200210c200141106a280200210d200141146a280200210b200141186a2903002105200141206a290300210e200141286a280200210a2001412c6a280200210f200141306a2802002110200141346a2802002111200141086a2d00002106200141d8006a2903002112200141d0006a2903002113200341fc016a41026a200241046a2d00003a0000200341e0016a41086a200241156a290000370300200341e0016a410d6a2002411a6a2900003700002003200241026a2f01003b01fc0120032002410d6a2900003703e0012006417f6a220741034b0d49200241096a2800002108200241056a280000210420022d0001210920022d00002102024020070e0400131112000b200920027241ff0171450d2541c9b4c0002104412821080c6e0b20034190036a41206a200141246a29020037030020034190036a41186a2001411c6a29020037030020034190036a41106a200141146a29020037030020034190036a41086a2001410c6a290200370300200320012902043703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341b8016a20034190036a20034188076a10c70220032802bc01210820032802b801210441002107410121064101210b410121094101210a4101210d4101210c410121104101211120012802002202410d4d0d7d0c7e0b200141086a28020021072001280204210b20022d00000d0a4101210620022d00014101470d0a200241096a280000210802402007450d00200b101d0b410021104101210b410121094101210a4101210d4101210c41012111410121074100210420012802002202410d4d0d7c0c7d0b20034190036a41206a200141246a29020037030020034190036a41186a2001411c6a29020037030020034190036a41106a200141146a29020037030020034190036a41086a2001410c6a290200370300200320012902043703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341286a20034190036a20034188076a10a603200328022c2108200328022821044100210c410121064101210b410121094101210a4101210d0c780b20034190036a200141086a41c80010ce031a20034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200320034190036a20034188076a10f40120032802042108200328020021040c190b20034190036a41386a200141c0006a29030037030020034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341186a20034190036a20034188076a108e02200328021c2108200328021821044100210a410121064101210b410121090c740b200141086a29030020022d000020022d000110c8022104412d21080c170b20034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341206a20034190036a20034188076a10cc0220032802242108200328022021044100210d410121064101210b410121094101210a0c730b20034180026a41046a22092001410e6a2f01003b0100200341a8066a41086a220a200141206a290300370300200341a8066a41106a220d200141286a2903003703002003200128010a360280022003200141186a2903003703a806200141106a2903002105200141086a2d0000210420012d0009210b200341b0056a41086a220c200241156a290000370300200341b0056a410d6a22102002411a6a29000037000020032002410d6a2900003703b00520022d0001210720022d0000210620044101460d0720044102460d0520044103470d42200720067241ff01710d062003200b3a009003200341f0026a41086a22024200370300200342003703f00241e9a4c1004119200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411020034190036a410110030c140b20034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341306a20034190036a20034188076a10e20220032802342108200328023021040c140b41f7b5c0002104412d21084101210620022d00000d1420022d000141ff01714102470d14200141086a29030021054200210e200341f0026a41086a22024200370300200342003703f00241878bc0004110200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411041f8b3c200410041001002417f470d4120024200370300200342003703f002418cb9c000410d200341f0026a100120034190036a41086a2002290300370300200320032903f00237039003024020034190036a411041f8b3c200410041001002417f460d00200342003703880720034190036a411020034188076a41084100100241016a41084d0d3e200329038807210e0b200e2005540d42200341f0026a41086a22024200370300200342003703f00241878bc0004110200341f0026a100120034190036a41086a2002290300370300200320032903f00237039003200320053703880720034190036a411020034188076a41081003410021040c140b20034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341106a20034190036a20034188076a10c901200328021421082003280210210441002109410121064101210b0c6d0b20034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341086a20034190036a20034188076a108b03200328020c2108200328020821044100210b410121060c6b0b41f1b4c0002104412a2108410021104101210602402007450d00200b101d0b4101210b410121094101210a4101210d4101210c0c6f0b200720067241ff0171450d0d0b41c9b4c0002104412821080c0e0b200241046a2d00002104200241026a2f01002111200241096a2800002108200241056a280000210f200341d7046a200a290300370000200341df046a200d2d00003a00002003200b3a00c004200320053700c70420032003280280023600c104200320032903a8063700cf04200320092f01003b00c504200341f0056a410d6a2010290000370000200341f0056a41086a200c290300370300200320032903b0053703f0050240200641ff01710d00200341c8026a410d6a2202200341f0056a410d6a290000370000200341c8026a41086a2206200341f0056a41086a290300370300200320032903f0053703c802200741ff01714101470d0020034190036a410d6a200229000037000020034190036a41086a22022006290300370300200320032903c8023703900320034188076a41106a20034190036a41106a220729030037030020034188076a41086a22062002290300370300200320032903900337038807200341d0056a410d6a220b20034188076a410d6a2209290000370000200341d0056a41086a220a200629030037030020032003290388073703d0052009200b2900003700002006200a290300370300200320032903d0053703880720034190036a41186a200341c0046a41186a2903003703002007200341c0046a41106a2903003703002002200341c0046a41086a290300370300200320032903c004370390034112101f2202450d3f200241106a41002f00cca8413b0000200241086a41002900c4a841370000200241002900bca841370000200241124132101e2202450d402002201120044110747222043b0012200220083600192002200f360015200220032903880737001d200241146a20044110763a0000200241256a20034188076a41086a2903003700002002412a6a20034195076a290000370000200341f0026a41086a22044200370300200342003703f00220024132200341f0026a1001200341a0026a41086a2004290300370300200320032903f0023703a0024120101f2204450d412004200329039003370000200441186a20034190036a41186a290300370000200441106a20034190036a41106a290300370000200441086a20034190036a41086a290300370000200341a0026a41102004412010032004101d2002101d410021040c0e0b20034188076a41106a20034190036a41106a29020037030020034188076a41086a20034190036a41086a290200370300200320032902900337038807412a210841f1b4c00021040c0d0b200341d0016a290300211220032903c801211420032802c0012115200341f0056a41086a2207200341e0016a41086a290300370300200341f0056a410d6a2216200341e0016a410d6a2900003700002003200341fe016a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d0e410121020c0f0b200341c0016a41086a290300211220032903c001211420032903d00121132003200a3a009f022003200e370097022003200537008f022003200b36008b022003200d360087022003200c360083022003200341dc016a41026a2d00003a008202200320032f01dc013b018002200341f0056a41086a2207200341e0016a41086a290300370300200341f0056a410d6a220b200341e0016a410d6a2900003700002003200341fc016a41026a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d10410121020c110b200341f0056a41086a2206200341e0016a41086a290300370300200341f0056a410d6a2207200341e0016a410d6a2900003700002003200341fe016a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d13410121020c140b20034190076a2802002104200328028c072107200820027241ff0171450d17410021064101210b02402004450d002007101d0b410121090c060b20034190076a2802002109200328028c07210a200241ff0171450d1741f1b4c0002104412a2108410021074101210b2009450d5c0c5b0b200820027241ff0171450d170c590b41f7b5c000410041f7b5c000200841ff01714102461b200241ff01711b2104412d21084101210b4101210a41012109410121070c5b0b20034194076a280200210620034190076a280200210a200328028c072107200820027241ff0171450d1702402006450d00200641186c21042007210203400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200441686a22040d000b0b410021094101210b200a450d012007101d0c010b20034188076a410c6a280200210620034190076a280200210d200328028c072107200820027241ff0171450d1702402006450d002006410c6c21042007210203400240200241046a280200450d002002280200101d0b2002410c6a2102200441746a22040d000b0b410121094100210b200d450d002007101d0b410121060b200328028807417f6a220241064b0d5441c9b4c000210441282108024020020e07005c1c551e1f1d000b20034190076a280200450d5b200328028c07101d0c5b0b200341f0026a41086a22024200370300200342003703f00241fabac1004119200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a0022003200537039003200341a0026a411020034190036a410810030b410021040b410121060b4101210b0c580b200341d0056a41086a2007290300370300200341d0056a410d6a2016290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341a8066a41026a2207200341c0046a41026a2d00003a000020034188076a41086a220920034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01a80620032003290390033703880720020d4420034183036a200929030037000020034188036a20034195076a290000370000200320032f01a8063b01f002200320083600f702200320043600f30220032003290388073700fb02200320072d00003a00f202200c41ff01714101470d0720034190036a200d41067610b0012003280290032104200328029803200d413f7122024d0d18200420024105746a22022f0000200241026a2d000041107472210720022d001f2109200228001b210a2002290013210e200229000b2105200228000721082002280003210b41012102200328029403450d420c410b200341d0056a41086a2007290300370300200341d0056a410d6a200b290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341a8066a41026a2207200341c0046a41026a2d00003a000020034188076a41086a220b20034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01a80620032003290390033703880720020d3b200341b3026a200b290300370000200341a0026a41186a220220034195076a290000370000200320032f01a8063b01a002200320083600a702200320043600a30220032003290388073700ab02200320072d00003a00a20220034190036a200341a0026a201310e902410121172003280290034101470d052003280298032108200328029403210420100d3c0c3d0b20032903d001211420032903c801211820032903c0012119200341f0026a41086a22024200370300200342003703f00241878ec2004118200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002410021020240200341a0026a411041f8b3c200410041001002417f460d002003421037028c072003200341a0026a3602880720034190036a20034188076a10a4032003290390034201520d2c200341a0036a290300211a200341a8036a290300211b200341b0036a290300211c200341b8036a290300211d200341c0036a290300211e200341c8036a290300211f200341d0036a2903002120200341d8036a2802002102200341dc036a290200212120032903980321222003200341e4036a2802003602dc03200320213702d403200320023602d003200320203703c8032003201f3703c0032003201e3703b8032003201d3703b0032003201c3703a8032003201b3703a0032003201a3703980320032022370390030b419f8ec20021044135210820022013a722064f0d4820034190036a410c6a200636020020034190036a41086a220241033a00002003410b3a00900320034190036a108b01200341f0026a41086a22044200370300200342003703f00241878ec2004118200341f0026a100120022004290300370300200320032903f002370390034104101f2202450d2d2002200636000020024104410c101e2202450d2e2002200bad422086200dad843700042002410c4118101e2202450d2f2002200537000c200241184130101e2202450d302002200e37001420022011ad4220862010ad843700242002200fad422086200aad8437001c2002413041e000101e2202450d31200220123e004820022013422088a73600442002201437003c200220183700342002201937002c20034190036a4110200241cc0010032002101d410021040c480b200341d0056a41086a2006290300370300200341d0056a410d6a2007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341c8026a41026a2206200341c0046a41026a2d00003a000020034188076a41086a220720034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01c80220032003290390033703880720020d44200341bb066a2007290300370000200341a8066a41186a20034195076a290000370000200320032f01c8023b01a806200320083600af06200320043600ab0620032003290388073700b306200320062d00003a00aa06200341f0026a41086a22024200370300200342003703f00241878ec2004118200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411041f8b3c200410041001002417f460d0b200342103702c4042003200341a0026a3602c00420034190036a200341c0046a10a4032003290390034201520d24200341a0036a290300210e200341a8036a2903002113200341b0036a2903002112200341b8036a2903002114200341c0036a2903002118200341c8036a2903002119200341d0036a290300211a200341d8036a2802002102200341dc036a2802002104200341e0036a2802002108200329039803211b2003200341e4036a28020022063602dc03200320083602d803200320043602d403200320023602d0032003201a3703c803200320193703c003200320183703b803200320143703b003200320123703a803200320133703a0032003200e370398032003201b37039003200320063602d407200320083602d007200320043602cc07200320023602c8072003201a3703c007200320193703b807200320183703b007200320143703a807200320123703a00720032013370398072003200e370390072003201b370388070c0c0b200c4108762107200d2104200f21090c3b0b20034190036a41306a290300210e20034190036a41286a2903002105200341f0026a41186a20034190036a41206a290300370300200341f0026a41106a20034190036a41186a290300370300200341f0026a41086a20034190036a41106a29030037030020032003290398033703f00220034190036a10a703200320034190036a3602c402200320034190036a3602bc0420034188076a41186a200229030037030020034188076a41106a2209200341a0026a41106a220429030037030020034188076a41086a220a200341a0026a41086a2208290300370300200320032903a00237038807200341c0046a20034188076a103320032802c804210720032902cc042113200341fc046a4100360200200341ec046a220b4200370200200341c0046a41206a41e8cfc200360200200341dc046a41f8b3c200360200200341d4046a22164200370200200341c0046a41106a41f0c0c100360200200341a4056a20022903003702002003419c056a200429030037020020034194056a2008290300370200200342083702f4042003428080808080013702e404200341003602cc04200320133702c404200320073602c004200320032903a00237028c052003200341bc046a360288052003200341c4026a36028405200320034190036a36028005200341c8026a200341c0046a20142012200341f0026a20034180026a200f2011102f20032d00c80222230d18200a2016290200370300200341a8066a41086a20034194076a280200360200200320032902cc04370388072003200329028c073703a80620034188086a200341a8066a10d502200341c0046a41286a2802002216200341c0046a41306a280200220441d8006c6a2108200b2802002115201621022004450d1620034191076a210720034190076a210b20162102034020022d00002104200341a8066a200241016a41d70010ce031a20044106460d16200b20043a00002003410b3a0088072007200341a8066a41d70010ce031a20034188076a108b01200241d8006a22022008470d000c180b0b41a39ac0004105200720034194076a28020010034101210b02402004450d002007101d0b410021094101210a0c060b4101210b2006412a200841ff017141014622021b21082002450d1002402009450d00200a101d0b410021074101210a41012109410121060c060b20034188076a41086a29030021054108101f2202450d242002200537000041999ac000410a2002410810032002101d410021044101210b4101210a4101210941012107410121060c470b4101210b2006412a200841ff017141014622021b21082002450d0f02402009450d00200a101d0b410021064101210a41012109410121070c040b0240200641186c2202450d00200720026a21042007210203402002280200200241086a2802002002410c6a280200200241146a2802001003200241186a22022004470d000b0b02402006450d00200641186c21042007210203400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200441686a22040d000b0b4101210b0240200a450d002007101d0b4100210a0c010b02402006410c6c2202450d00200720026a21042007210203402002280200200241086a28020010092002410c6a22022004470d000b0b02402006450d002006410c6c21042007210203400240200241046a280200450d002002280200101d0b2002410c6a2102200441746a22040d000b0b4101210a0240200d450d002007101d0b4100210b0b410121090b41012107410121060b410021040c410b200341103602d007200342013703c007200342013703b807200342013703b007200342013703a807200342013703a007200342013703980720034201370390072003420137038807200342808080808080c0003703c8070b20034190036a200341a8066a200510e90202402003280290034101470d00200328029803210820032802940321040c380b200341b0036a2903002114200341a8036a2903002118200341c0036a290300210e200341b8036a2903002105200341a0036a29030021132003290398032119200341d8006a2003290388074200200bad420010d2032013427f200329035820032903604200521b7d2212201356201250722204450d05412c210841a8d4c000210641012102200d0d060c290b20034190076a280200450d3f200328028c07101d0c3f0b200b450d3e024020034188076a410c6a2802002206450d00200328028c0721022006410c6c210603400240200241046a280200450d002002280200101d0b2002410c6a2102200641746a22060d000b0b20034190076a280200450d3e200328028c07101d0c3e0b2006450d3d20034190076a280200450d3d200328028c07101d0c3d0b2009450d3c024020034188076a410c6a2802002206450d00200328028c072102200641186c210603400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200641686a22060d000b0b20034190076a280200450d3c200328028c07101d0c3c0b410021022003280294030d280c290b20034190036a200c200b20034188076a10422003280290034101470d0320034198036a2802002108200328029403210641012102200d450d230b200c101d0c220b200741f1b4c00020021b2104410021074101210b20090d320c330b200741f1b4c00020021b2104410021064101210b20090d340c350b200341f0056a41186a220720034190036a410472220241186a280200360200200341f0056a41106a2209200241106a290200370300200341f0056a41086a220a200241086a290200370300200320022902003703f005200341c0046a41186a22024200370300200341c0046a41106a4200370300200341c0046a41086a22104200370300200342003703c004200c200b200341c0046a100020034180026a41026a221120032d00c2043a0000200341c8026a41086a220f200341d3046a290000370300200341c8026a410d6a22162002290000370000200320032f01c0043b018002200320032900cb043703c80220032800c304210620032800c7042108200341d0056a41026a20112d00003a00002010200f290300370300200341c0046a410d6a2016290000370000200320032f0180023b01d005200320032903c8023703c00420034190036a41186a200728020036020020034190036a41106a200929030037030020034190036a41086a200a290300370300200320032903f005370390034114101f2202450d18200241106a41002800c2f341360000200241086a41002900baf341370000200241002900b2f341370000200241144134101e2202450d19200220032f01d0053b00142002200836001b20022006360017200220032903c00437001f200241166a200341d0056a41026a2d00003a0000200241276a200341c0046a41086a2903003700002002412c6a200341c0046a410d6a290000370000200341f0026a41086a22074200370300200342003703f00220024134200341f0026a1001200341a0026a41086a2007290300370300200320032903f0023703a002200341a0026a20034190036a10612002101d0240200341a0036a280200450d00200328029c03101d0b200341b0056a41026a20034180026a41026a2d00003a000020034190036a41086a200341c8026a41086a29030037030020034190036a410d6a200341c8026a410d6a290000370000200320032f0180023b01b005200320032903c802370390034115101f2202450d1a2002410d6a4100290094f341370000200241086a410029008ff34137000020024100290087f341370000200241154135101e2202450d1b200220032f01b0053b00152002200836001c200220063600182002200329039003370020200241176a200341b2056a2d00003a0000200241286a20034190036a41086a2903003700002002412d6a20034190036a410d6a290000370000200341f0026a41086a22074200370300200342003703f00220024135200341f0026a1001200341a0026a41086a2007290300370300200320032903f0023703a002200341003602c804200342013703c0042003200b3602d005200341d0056a200341c0046a1062024020032802c404220a20032802c80422096b200b4f0d002009200b6a22072009490d1d200a4101742210200720072010491b22104100480d1d200a450d0520032802c004200a2010101e2207450d060c1e0b20032802c00421070c1e0b200241d8006a21020b20022008460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a280000101d0b200241d8006a22022008470d000b0b410021172015450d002016101d0b20034198016a20032903800320034188036a29030020032903f8022213420010d20320032903f00220137d10a503200341a8016a200341a0026a20032903980120034198016a41086a290300109f012009200e200341a8016a41086a29030022127d200520032903a801221354ad7d2012200e7d2013200554ad7d20132005582012200e582012200e5122021b22041b22143703002003200520137d201320057d20041b221837039007200320132005562012200e5620021b2202ad370388070240024020020d002018201410f3010c010b200a10f5010b200341f4046a2802002228200341fc046a28020022044107746a2116200341f8046a2802002129202821020240024002402004450d0020034191076a2104200341f0056a410272210820034188076a4104722127200341b1076a21252028210202400340200341b0056a41186a220b200241186a290300370300200341b0056a41106a2209200241106a290300370300200341b0056a41086a220a200241086a290300370300200320022903003703b005200241206a2802002107200341a8066a200241246a41dc0010ce031a2007410f460d01200341d0056a41186a2215200b290300370300200341d0056a41106a22242009290300370300200341d0056a41086a2226200a290300370300200320032903b0053703d00520032007360288072027200341a8066a41dc0010ce031a200820032903b005370000200841086a200a290300370000200841106a2009290300370000200841186a200b29030037000020034180023b01f00520034190016a20034188076a200341f0056a108a01200328029001210720034188076a41086a41043a000020252007453a0000200420032903d005370000200441086a2026290300370000200441106a2024290300370000200441186a20152903003700002003410b3a00880720034188076a108b0120024180016a22022016470d000b201622022016470d020c030b20024180016a21020b20022016460d010b20034188076a41206a210920034188076a410b6a210820034188076a41246a2127200341f0056a410d6a2107200341f0056a41086a210b0340200320022f01003b01a0062003200241026a2d00003a00a206200241036a280000210a200241076a28000021152007200241186a290000370000200b200241136a29000037030020032002410b6a2900003703f005200241206a280200210420034188076a200241246a41dc0010ce031a2004410f460d01200341d0056a41086a2224200b290300370300200341d0056a410d6a22262007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d005200341a8066a20034188076a41dc0010ce031a20092004360200200820032903d005370000200841086a20242903003700002008410d6a20262900003700002003201536008f072003200a36008b07200320032d009a063a008a07200320032f0198063b0188072027200341a8066a41dc0010ce031a2009103c20024180016a22022016470d000b0b02402029450d002028101d0b200341d0026a280200210841002104024020234101470d0020032802cc0221040b024020032802c0042202450d0020032802c404450d002002101d0b2017450d1c200341c0046a41186a280200210a200341d0046a280200210202400240200341c0046a41146a280200220b450d00200b210920022107034020072802800921072009417f6a22090d000b0340200220022f01064102746a4180096a2802002102200b417f6a220b0d000c020b0b200221070b200341a4076a20022f010636020020034188076a41186a410036020020034188076a41146a20023602002003200a3602a807200341003602980720034200370390072003200736028c07200341003602880720034188076a103b0240200341f0046a2802002207450d00200341c0046a41286a2802002102200741d8006c21070340024020022d00004105490d00200241286a280200450d00200241246a280200101d0b200241d8006a2102200741a87f6a22070d000b0b200341ec046a280200450d1c200341e8046a280200101d20100d1d0c1e0b2010101f22070d180b201041011020000b10f002000b41df88c0004133103a000b200341a4036a4101360200200341183602c404200341c0adc4003602c0042003420137029403200341c8adc400360290032003200341c0046a3602a00320034190036a4184d9c20010cf01000b20034190036a41146a41013602002003411836028c07200341c0adc400360288072003420137029403200341c8adc40036029003200320034188076a3602a00320034190036a41bca4c40010cf01000b200341a4036a4101360200200341183602c404200341c0adc4003602c0042003420137029403200341c8adc400360290032003200341c0046a3602a00320034190036a4184d9c30010cf01000b41b8d0c200102c000b41d0d0c200102c000b41df88c0004133103a000b411241011020000b413241011020000b412041011020000b41df88c0004133103a000b410841011020000b410441011020000b410c41011020000b411841011020000b413041011020000b41e00041011020000b411441011020000b413441011020000b411541011020000b413541011020000b1021000b200320103602c404200320073602c0042010210a0b200720096a200c200b10ce031a200341a0026a411020072009200b6a10030240200a450d002007101d0b2002101d0240200d450d00200c101d0b200341d0056a41026a220220034180026a41026a2d00003a0000200341c0046a41086a2207200341c8026a41086a290300370300200341c0046a410d6a220b200341c8026a410d6a290000370000200320032f0180023b01d005200320032903c8023703c00420034190036a41086a41023a0000200341a0036a20083602002003419c036a200636020020034199036a20032f01d0053b0000200341a4036a20032903c004370200200341ac036a2007290300370200200341b1036a200b29000037000020022d000021022003410b3a00900320034190036a410b6a20023a000020034190036a108b01410021020b200341386a201820144200201220041b2213420010d203201920137d10a503200341c8006a200341a8066a2003290338200341386a41086a290300109f01200341a0036a200e200341c8006a41086a29030022127d20052003290348221354ad7d2012200e7d2013200554ad7d20132005582012200e582012200e5122041b22071b22143703002003200520137d201320057d20071b221837039803200320132005562012200e5620041b2204ad370390030240024020040d002018201410f3014100210420020d010c100b20034190036a41086a10f501410021042002450d0f0b200621040c0e0b2010450d010b200f101d0b4101210241002107200641044d0d060c070b2004101d0b200b41d7c0c10020021b21042008411520021b21082002450d012008210b0b20034190036a200341f0026a201310e9024101211702402003280290034101470d002003280298032108200328029403210420110d020c030b20034190036a41306a290300211820034190036a41286a2903002113200341b0056a41186a221620034190036a41206a290300370300200341b0056a41106a20034190036a41186a290300370300200341b0056a41086a20034190036a41106a29030037030020032003290398033703b00520034190036a10a703200320034190036a3602bc04200320034190036a3602800220034188076a41186a200341f0026a41186a220229030037030020034188076a41106a2224200341f0026a41106a220829030037030020034188076a41086a2225200341f0026a41086a2226290300370300200320032903f00237038807200341c0046a20034188076a103320032802c804212720032902cc042119200341fc046a4100360200200341ec046a22284200370200200341c0046a41206a41e8cfc200360200200341dc046a41f8b3c200360200200341d4046a22294200370200200341c0046a41106a41f0c0c100360200200341a4056a20022903003702002003419c056a200829030037020020034194056a2026290300370200200342083702f4042003428080808080013702e404200341003602cc04200320193702c404200320273602c004200320032903f00237028c05200320034180026a360288052003200341bc046a36028405200320034190036a36028005200320093a00a7072003200a3600a3072003200e37009b0720032005370093072003200b36008f072003200436008b07200320073b018807200320074110763a008a07200341003602b006200342013703a806200341a0026a200341c0046a20034188076a20142012200341b0056a20102015200341a8066a1041024020032802a00222230d0020252029290200370300200341a8066a41086a20034194076a280200360200200320032902cc04370388072003200329028c073703a80620034188086a200341a8066a10d502200341c0046a41286a2802002209200341c0046a41306a280200220441d8006c6a21082028280200210a20092102024002402004450d0020034191076a210720034190076a210b200921020240034020022d00002104200341a8066a200241016a41d70010ce031a20044106460d01200b20043a00002003410b3a0088072007200341a8066a41d70010ce031a20034188076a108b01200241d8006a22022008470d000c030b0b200241d8006a21020b20022008460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a280000101d0b200241d8006a22022008470d000b0b41002117200a450d002009101d0b200341f0006a20032903c005201629030020032903b8052205420010d20320032903b00520057d10a50320034180016a200341f0026a2003290370200341f0006a41086a290300109f012024201820034180016a41086a290300220e7d2013200329038001220554ad7d200e20187d2005201354ad7d2005201358200e201858200e20185122021b22041b22123703002003201320057d200520137d20041b22143703900720032005201356200e20185620021b2202ad370388070240024020020d002014201210f3010c010b202510f5010b200341f4046a2802002228200341fc046a28020022044107746a2116200341f8046a2802002129202821020240024002402004450d0020034191076a2104200341f0056a410272210820034188076a4104722127200341b1076a21252028210202400340200341d0056a41186a220b200241186a290300370300200341d0056a41106a2209200241106a290300370300200341d0056a41086a220a200241086a290300370300200320022903003703d005200241206a2802002107200341a8066a200241246a41dc0010ce031a2007410f460d01200341c8026a41186a2215200b290300370300200341c8026a41106a22242009290300370300200341c8026a41086a2226200a290300370300200320032903d0053703c80220032007360288072027200341a8066a41dc0010ce031a200820032903d005370000200841086a200a290300370000200841106a2009290300370000200841186a200b29030037000020034180023b01f005200341e8006a20034188076a200341f0056a108a012003280268210720034188076a41086a41043a000020252007453a0000200420032903c802370000200441086a2026290300370000200441106a2024290300370000200441186a20152903003700002003410b3a00880720034188076a108b0120024180016a22022016470d000b201622022016470d020c030b20024180016a21020b20022016460d010b20034188076a41206a210920034188076a410b6a210820034188076a41246a2127200341f0056a410d6a2107200341f0056a41086a210b0340200320022f01003b01a0062003200241026a2d00003a00a206200241036a280000210a200241076a28000021152007200241186a290000370000200b200241136a29000037030020032002410b6a2900003703f005200241206a280200210420034188076a200241246a41dc0010ce031a2004410f460d01200341d0056a41086a2224200b290300370300200341d0056a410d6a22262007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d005200341a8066a20034188076a41dc0010ce031a20092004360200200820032903d005370000200841086a20242903003700002008410d6a20262900003700002003201536008f072003200a36008b07200320032d009a063a008a07200320032f0198063b0188072027200341a8066a41dc0010ce031a2009103c20024180016a22022016470d000b0b02402029450d002028101d0b200341a8026a280200210820032802a40221020240024002402023450d002002210420032802c00422020d010c020b2003200341ac026a280200360290072003200836028c0720032002360288074100210402402008450d002002101d0b20032802c0042202450d010b20032802c404450d002002101d0b2017450d00200341c0046a41186a280200210a200341d0046a280200210202400240200341c0046a41146a280200220b450d00200b210920022107034020072802800921072009417f6a22090d000b0340200220022f01064102746a4180096a2802002102200b417f6a220b0d000c020b0b200221070b200341a4076a20022f010636020020034188076a41186a410036020020034188076a41146a20023602002003200a3602a807200341003602980720034200370390072003200736028c07200341003602880720034188076a103b0240200341f0046a2802002207450d00200341c0046a41286a2802002102200741d8006c21070340024020022d00004105490d00200241286a280200450d00200241246a280200101d0b200241d8006a2102200741a87f6a22070d000b0b200341ec046a280200450d00200341e8046a280200101d20110d010c020b2011450d010b2010101d0b4100210241012107200641044b0d010b024020060e050505040002050b2011452007720d042010101d0c040b20100d010c030b2010452002720d020b200f101d0c010b200d450d00200c101d0b41002111410121064101210b410121094101210a4101210d4101210c410121100c0e0b20034188076a10b30141c9b4c0002104412821080c060b200a101d0b4101210a410121090b410121060c020b200a101d0b4101210a41012109410121070b024002400240200328028807417f6a220241064b0d0002400240024020020e0700060103040502000b2006450d0520034190076a280200450d05200328028c07101d0c050b2007450d0420034190076a280200450d04200328028c07101d0c040b200b450d03024020034188076a410c6a2802002206450d00200328028c0721022006410c6c210603400240200241046a280200450d002002280200101d0b2002410c6a2102200641746a22060d000b0b20034190076a280200450d03200328028c07101d0c030b20034188076a10b3010c020b2009450d0120034190076a280200450d01200328028c07101d0c010b200a450d00024020034188076a410c6a2802002206450d00200328028c072102200641186c210603400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200641686a22060d000b0b20034190076a280200450d00200328028c07101d0b4101210b410021060b410121090b4101210a0b4101210d0b4101210c0b410121100b410121110b4101210720012802002202410d4b0d010b024002400240024002400240024002400240024002400240024020020e0e0e050e0e0e03070206000e010e040e0b200c450d0d20012d00044101470d0d2001410c6a2201280200108c012001280200101d0c0d0b2010450d0c200141086a280200450d0c2001280204101d0c0c0b200a450d0b200141086a28020022024102460d0520024101470d0b200141106a280200450d0b2001410c6a280200101d0c0b0b200b450d0a200141086a2d00002202410e4b0d0820024106470d0a200141106a280200450d0a2001410c6a280200101d0c0a0b2011450d09200141086a2d000022024102490d0920024103460d0520024102470d06200141106a280200450d092001410c6a280200101d0c090b2006450d08200141086a10b3010c080b200d450d07200141086a2d00004101470d072001410c6a2201280200108c012001280200101d0c070b2009450d06200141086a2d000022024105460d0120024101470d062001410c6a2201280200108c012001280200101d0c060b200141106a280200450d052001410c6a280200101d0c050b2001410c6a2201280200108c012001280200101d0c040b200141346a280200450d03200141306a280200101d0c030b200141306a280200450d022001412c6a280200101d0c020b200141106a280200450d012001410c6a280200101d0c010b2007450d0020012802044101470d00200141086a2201280200108c012001280200101d0b200020083602042000200436020020034190086a24000bcf0e03067f017e0a7f23004180036b2201240002400240024002400240024002400240024002400240024002400240419bb5c000411041f8b3c200410041001002417f460d00200141003602a001419bb5c0004110200141a0016a41044100100241016a41044d0d0220012802a0012102410021030c010b410121030b41082104200141a0016a41086a22054200370300200142003703a00141a5bac000410d200141a0016a1001200141106a41086a2005290300370300200120012903a001370310024002400240200141106a411041f8b3c200410041001002417f460d00200142103702242001200141106a360220200141086a200141206a10d5012001280208450d07200128020c2206ad42f8007e2207422088a70d042007a72205417f4c0d042005450d012005101f2204450d052006450d020c060b4100210e4100210c0c070b4108210420060d040b4100210c4100210e2004450d040c050b41df88c0004133103a000b102e000b200541081020000b200141a0016a4101722108200141286a21094100210a410021054100210b2006210c02400340200141003a0090022001280220200128022420014190026a410120092802001002210d20092009280200200d41016a41014b220d6a220e360200200d450d014101210f024020012d009002220d4101460d00200d0d02200141003602a0012009410020012802202001280224200141a0016a4104200e1002220d200d417f461b220d4104200d4104491b20092802006a360200200d41034d0d0220012802a00121104100210f0b200141a0016a200141206a10d60120012d00a001210d20014190026a200841ef0010ce031a200d410d460d01200b41016a210e200141316a20014190026a41ef0010ce031a200141a0016a200141316a41ef0010ce031a0240200b200c470d00200a200e200e200a491b220cad42f8007e2207422088a70d072007a722114100480d070240200b450d00200420052011101e22040d010c060b2011101f2204450d050b200420056a220b200d3a0000200b41016a200141a0016a41ef0010ce031a200b41f4006a2010360200200b41f0006a200f360200200a41026a210a200541f8006a2105200e210b200e2006490d000c030b0b0240200b450d00200421010340200110d701200141f8006a2101200541887f6a22050d000b0b200c450d002004101d0b41df88c0004133103a000b200141a0016a200041f00010ce031a200c200e470d01200e41016a2205200e490d02200e4101742209200520052009491b220cad42f8007e2207422088a70d022007a722054100480d0202400240200e450d002004200e41f8006c2005101e2204450d010c030b2005101f22040d020b200541081020000b201141081020000b2004200e41f8006c220b6a200141a0016a41f00010ce03220541f4006a200236020020052003360270200141a0016a41086a22094200370300200142003703a00141a5bac000410d200141a0016a1001200141106a41086a2009290300370300200120012903a001370310200141003602a801200142013703a0012001200e41016a22063602900220014190026a200141a0016a106202402006450d00200b41f8006a210a2004210503400240024002400240024002400240024002400240200541f0006a2802004101470d00200141013a00900220012802a4012009280200220b470d01200b41016a220d200b490d0c200b410174220f200d200d200f491b220f4100480d0c200b450d0320012802a001200b200f101e220d0d040c0d0b200141003a00900220012802a4012009280200220b470d01200b41016a220d200b490d0b200b410174220f200d200d200f491b220f4100480d0b200b450d0520012802a001200b200f101e220d0d060c0d0b4101210f20012802a001210d0c030b4100210f20012802a001210d0c050b200f101f220d450d090b2001200f3602a4012001200d3602a0012009280200210b20012d009002210f0b2009200b41016a360200200d200b6a200f3a00000c030b200f101f220d450d070b2001200f3602a4012001200d3602a0012009280200210b20012d009002210f0b2009200b41016a360200200d200b6a200f3a0000200541f4006a280200210f024002400240024020012802a401220d2009280200220b6b41044f0d00200b41046a2210200b490d07200d410174220b20102010200b491b220b4100480d07200d450d0120012802a001200d200b101e220d0d020c0a0b20012802a001210d0c020b200b101f220d450d080b2001200b3602a4012001200d3602a0012009280200210b0b2009200b41046a360200200d200b6a200f3600000b2005200141a0016a10d801200541f8006a2105200a41887f6a220a0d000b0b20012802a4012105200141106a411020012802a001220b2009280200100302402005450d00200b101d0b02402006450d00200e41f8006c41f8006a2109200421050340200510d701200541f8006a2105200941887f6a22090d000b0b0240200c450d002004101d0b20014180036a24000f0b1021000b200f41011020000b200f41011020000b200b41011020000bef0301017f02400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e0e010e0e0e02030405060e070e080e0b20002802044101470d0d200041086a2200280200108c012000280200101d0f0b200041086a10b3010f0b200041086a2d00002201410e4b0d0a20014106470d0b200041106a280200450d0b2000410c6a280200101d0f0b200041086a2d000022014105460d0520014101470d0a2000410c6a2200280200108c012000280200101d0f0b200041086a28020022014102460d0520014101470d09200041106a280200450d092000410c6a280200101d0f0b200041086a2d00004101470d082000410c6a2200280200108c012000280200101d0f0b20002d00044101470d072000410c6a2200280200108c012000280200101d0f0b200041086a280200450d062000280204101d0f0b200041086a2d000022014102490d0520014103460d0220014102470d03200041106a280200450d052000410c6a280200101d0f0b2000410c6a2200280200108c012000280200101d0f0b200041106a280200450d032000410c6a280200101d0f0b200041346a280200450d02200041306a280200101d0f0b200041306a280200450d012000412c6a280200101d0f0b200041106a280200450d002000410c6a280200101d0f0b0bf7ce0135037f017e027f017e027f027e057f037e167f027e027f017e027f027e0d7f027e067f027e097f077e027f037e127f027e017f017e0e7f017e067f017e227f017e017f017e017f017e017f027e027f017e027f027e037f027e027f017e0c7f017e057f017e027f017e067f23004190096b22012400200141a0056a41086a22024200370300200142003703a00541838cc1004113200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8030240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141b8036a411041f8b3c200410041001002417f460d00200141003a009008200141b8036a411020014190086a41014100100241016a41014d0d0220012d0090082102200141b8036a411010092002450d00200141a0056a41086a22024200370300200142003703a005419590c000411d200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a105e20012802c0052203450d0420012902c405210420014190086a41101009200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a1081014100210502402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d0320012802c00521050b0240200128029408450d002002101d0b024002402005450d002005ad4205862207422088a70d212007a722024100480d212002101f2208450d084100210620082102034020014190086a2006107d200241186a20014190086a41186a290000370000200241106a20014190086a41106a290000370000200241086a20014190086a41086a2900003700002002200129009008370000200241206a21022005200641016a2206470d000c020b0b410121080b02400240024020052004422088a7470d00024020082003460d002005450d00410021092008210220032106034020022006412010d0030d02200241206a2102200641206a2106200941016a22092005490d000b0b2005450d012008101d2004a70d020c030b2001419c086a200536020020014198086a20053602002001200836029408200141013a00900820014190086a108e010b2004a7450d010b2003101d0b200141a0056a41086a22024200370300200142003703a00541cebac1004118200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b80342002104024002400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0120012903900821040b20024200370300200142003703a0054195a8c1004115200141a0056a100120062002290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0320012903900822074200520d0141ecd8c300102c000b42e80721070b200141a0056a41086a22024200370300200142003703a00541e9a4c1004119200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b803200020047d200782210a0240200141b8036a411041f8b3c200410041001002417f460d00200141003a009008200141b8036a411020014190086a41014100100241016a41014d0d0720012d0090082102200141b8036a41101009200241004721050c090b200a4200520d09410121050c080b41df88c0004133103a000b41df88c0004133103a000b41bcacc300102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241011020000b4200210b200141a0056a41086a22024200370300200142003703a005418390c100410d200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b803420021040240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0a20012903900821040b20024200370300200142003703a00541e6bac1004114200141a0056a100120062002290300370300200120012903a0053703b8030240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0b200129039008210b0b200141a0056a41086a22024200370300200142003703a0054181a8c1004114200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0d20012903900842017c21070c010b420121070b20014190086a41086a2007370300200141033a00900820014190086a108b0120024200370300200142003703a0054181a8c1004114200141a0056a100120062002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a4108100320024200370300200142003703a00541e6bac1004114200141a0056a100120062002290300370300200120012903a0053703b8032001200437039008200141b8036a411020014190086a41081003200141a8036a41fabac1004119108f0102400240024020012903a803a74101470d0020012903b0032107200141a0056a41086a22024200370300200142003703a0054195a8c1004115200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a410810030c010b200a500d010b200141a0056a41086a22024200370300200142003703a005418cb9c000410d200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b803420021070240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0e20012903900821070b20024200370300200142003703a00541cebac1004118200141a0056a100120062002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a410810030b2004200b7d2005109001200141a0056a41086a22024200370300200142003703a00541aaa8c1004112200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8034100210c02400240200141b8036a411041f8b3c200410041001002417f460d00200142103702c4052001200141b8036a3602c00520014190086a200141c0056a105e200128029008220d450d1120014198086a280200210c200128029408210e0c010b4101210d4100210e0b41002103200141003602900820014190086a108201200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a10810102402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d0e20012802c00521030b0240200128029408450d002002101d0b02402003200c4d0d0020014198086a2108200c21020340200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a10810141002105024020012802900822062008280200220941f8b3c200410041001002417f460d00200141003602c00520062009200141c0056a41044100100241016a41044d0d0420012802c00521050b0240200128029408450d002006101d0b200241016a21060240200520024d0d00200141063602c405200141df8ac0003602c00520014190086a2002200141c0056a107e200128029008220220082802001009200128029408450d002002101d0b2006210220032006470d000b0b200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a108101200128029808210620012802900821022001200c3602c00520022006200141c0056a410410030240200128029408450d002002101d0b0240200c4105742209450d0041002105200d21060340200141a8046a41186a2208200641186a290000370300200141a8046a41106a2203200641106a290000370300200141a8046a41086a220c200641086a290000370300200120062900003703a8044112101f2202450d07200241106a41002f00cca8413b0000200241086a41002900c4a841370000200241002900bca841370000200241124132101e2202450d08200220012903a8043700122002412a6a2008290300370000200241226a20032903003700002002411a6a200c290300370000200141a0056a41086a22084200370300200142003703a00520024132200141a0056a1001200141b8036a41086a2008290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d00200141e8036a41186a22084200370300200141e8036a41106a22034200370300200141e8036a41086a220c4200370300200142003703e803200141b8036a4110200141e8036a412041001002220f417f460d07200f411f4d0d07200141c8036a41186a220f2008290300370300200141c8036a41106a22082003290300370300200141c8036a41086a2203200c290300370300200120012903e8033703c8032002101d200141c0056a41186a200f290300370300200141c0056a41106a2008290300370300200141c0056a41086a2003290300370300200120012903c8033703c0050c010b2002101d200141c0056a41186a4200370300200141c0056a41106a4200370300200141c0056a41086a4200370300200142003703c0050b2001410636029408200141df8ac00036029008200141a0076a200520014190086a107e02400240024020012802a0072202200141a0076a41086a2208280200220341f8b3c200410041001002417f470d0020014190086a41186a420037030020014190086a41106a420037030020014190086a41086a4200370300200142003703900820012802a4070d010c020b20014188046a41186a220c420037030020014188046a41106a220f420037030020014188046a41086a2210420037030020014200370388042002200320014188046a4120410010022203417f460d082003411f4d0d0820014190086a41186a200c29030037030020014190086a41106a200f29030037030020014190086a41086a201029030037030020012001290388043703900820012802a407450d010b2002101d0b024020014190086a200141c0056a412010d003450d0041002102200141003602a007200141a0076a108201200141063602c406200141df8ac0003602c006200141a0076a41a68ec100200141c0066a108101024020012802a00722032008280200220c41f8b3c200410041001002417f460d00200141003602c0062003200c200141c0066a41044100100241016a41044d0d0620012802c00621020b024020012802a407450d002003101d0b200220054d0d00200141063602c406200141df8ac0003602c006200141a0076a2005200141c0066a107e2008280200210320012802a00721084120101f2202450d0b200220012903c005370000200241186a200141c0056a41186a290300370000200241106a200141c0056a41106a290300370000200241086a200141c0056a41086a290300370000200820032002412010032002101d20012802a407450d002008101d0b200541016a2105200641206a2106200941606a22090d000b0b200e450d00200d101d0b200141b8036a41086a22024200370300200142003703b80341fd9bc0004116200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c00602400240200141c0066a411041f8b3c200410041001002417f460d002001420037039008200141c0066a411020014190086a41084100100241016a41084d0d0820012903900822044200510d0f4200211120002004824200520d160c010b42002111200042e807824200520d150b41082108200141b8036a41086a22022011370300200120113703b80341939cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c0064100210f02400240200141c0066a411041f8b3c200410041001002417f460d00200142103702c4052001200141c0066a3602c00520014190086a200141c0056a1091012001280290082208450d112001280294082110418801210220014198086a280200220f4188016c2206450d010c120b41002110418801210241004188016c22060d110b200141003602c805200120083602c405200120083602c0052001200141a8046a3602cc05200f0d110c120b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b41df88c0004133103a000b412041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41f0dcc200102c000b41df88c0004133103a000b41df88c0004133103a000b200820066a210620014190086a2008280260109201200820026a21020240024020012802a0082205450d0020014198036a20012903900820014190086a41086a290300200141a8086a350200420010d20320014198036a41086a2903002107200129039803211220012802a408450d012005101d0c010b42002112420021070b200141013602c805200120063602c405200120023602c0052001200141a8046a3602cc0502402008450d002008ad4220862113024020022006460d00200f4188016c41f87e6a2106200141a0086a2109200141a8086a2103200141a4086a210c4201210b034020014190086a200241e0006a2802001092010240024020092802002205450d0020014188036a20012903900820014190086a41086a2903002003350200420010d20320014188036a41086a2903002104200129038803210a200c280200450d012005101d0c010b4200210a420021040b02402012200a56200720045620072004511b0d002002ad422086200b842113200a2112200421070b20024188016a2102200b42017c210b200641f87e6a22060d000b0b20134280808080105a0d030b200f450d010b200f4188016c21022008211403402014103c20144188016a2114200241f87e6a22020d000b0b2010450d012008101d0c010b0240024002400240200f2013a722024d0d00200820024188016c6a220229031021042008200f417f6a22054188016c6a22064180016a29030021072006290360210b200641e8006a290300210a200641f0006a2903002112200641f8006a2903002113200641c8006a2903002153200641d0006a2903002154200641d8006a2903002155200641286a2903002156200641306a2903002157200641386a2903002158200641186a2903002159200641c0006a290300215d200641206a290300215c2006290300215e20062903082171200220062903103703102002290308217220022071370308200229030021712002205e370300200241206a2206290200215e2006205c370200200241c0006a2206290200215c2006205d370200200241186a2206290300215d20062059370300200241386a2206290200215920062058370200200241306a2206290200215820062057370200200241286a2206290200215720062056370200200241d8006a2206290200215620062055370200200241d0006a2206290200215520062054370200200241c8006a2206290200215420062053370200200241f8006a2013370300200241f0006a2012370300200241e8006a200a370300200228026021092002200b37036020024180016a2007370200200141c0056a41d8006a2056370300200141c0056a41d0006a2055370300200141c0056a41c8006a2054370300200141c0056a41c0006a205c370300200141c0056a41386a2059370300200141c0056a41306a2058370300200141c0056a41286a2057370300200141c0056a41206a205e370300200141c0056a41186a205d370300200120043703d005200120723703c805200120713703c005200120053602980820012010360294082001200836029008200141b8036a41086a22024200370300200142003703b80341939cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c006200141103602ac042001200141c0066a3602a80420014190086a200141a8046a10930102402005450d00200f4188016c41f87e6a21062008210203402002103c20024188016a2102200641f87e6a22060d000b0b02402010450d002008101d0b4113101f2202450d01410021052002410f6a41002800f99b40360000200241086a41002900f29b40370000200241002900ea9b40370000200241134126101e2202450d0220022009360013200141b8036a41086a22064200370300200142003703b80320024117200141b8036a1001200141c0066a41086a2006290300370300200120012903b8033703c006024002400240200141c0066a411041f8b3c200410041001002417f460d002001200141c0066a3602a804200141103602ac042001420037039808200142003703900820014100200141c0066a411020014190086a41104100100222062006417f461b2206411020064110491b3602b0042006410f4d0d0220014198086a22062903002104200129039008210720014190086a200141a8046a105e2001280290082205450d02200628020021082001280294082103200141c0066a411010092002101d2005450d010c060b2002101d41000d050b200141c0056a103c0c050b41df88c0004133103a000b4188ddc2002002200f104b000b411341011020000b412641011020000b024020084105742206450d00200521020340200220072004109401200241206a2102200641606a22060d000b0b200141b8086a2004370300200141b0086a2007370300200141a8086a2008360200200141a4086a200336020020014190086a41106a20053602002001419c086a200936020020014190086a41086a41013a0000200141053a00900820014190086a108b01200141b8036a41086a22024200370300200142003703b80341869bc0004116200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c00602400240024002400240200141c0066a411041f8b3c200410041001002417f460d002001420037039008200141c0066a411020014190086a41084100100241016a41084d0d0220012903900821070c010b42e80721070b20014190086a200141c0056a41e00010ce031a42002104200141b8036a41086a22024200370300200142003703b80341a89cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c0060240200141c0066a411041f8b3c200410041001002417f460d00200142003703a804200141c0066a4110200141a8046a41084100100241016a41084d0d0220012903a80421040b200141a8046a200720007c20014190086a4100200410950120012802a8044101470d0320012802ac04200141a8046a41086a280200100a0c020b41df88c0004133103a000b41df88c0004133103a000b410221020c010b200141b8036a41086a22142011370300200120113703b80341bd9cc0004113200141b8036a1001200141c0066a41086a2014290300370300200120012903b8033703c006410021140240024002400240024002400240200141c0066a411041f8b3c200410041001002417f460d002001410036029008200141c0066a411020014190086a41044100100241016a41044d0d0120012802900821140b200141b8036a41086a22024200370300200142003703b80341d09cc0004119200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c006410021020240200141c0066a411041f8b3c200410041001002417f460d002001410036029008200141c0066a411020014190086a41044100100241016a41044d0d0220012802900821020b0240024002400240201420024f0d002001419c086a210920014198086a21060240034020014190086a201410960120062802002205410f470d01201441016a22142002490d000c020b0b2001290390082104200141a8046a200941ec0010ce031a200141a0076a200141a8046a41ec0010ce031a200141a0086a2206200536020020012004370398082001201436029008200141a4086a200141a0076a41ec0010ce032109024020042000520d00200141c0066a41086a220620014190086a41086a29030037030020012001290390083703c006200141c0056a200941ec0010ce031a200141a8046a41086a22092006290300370300200120012903c0063703a80420014190086a200141c0056a41ec0010ce031a418001101f2215450d07201520012903a80437030020152005360210201541086a2009290300370300201541146a20014190086a41ec0010ce031a201441016a221420024f0d0320014190086a41106a211620014190086a41146a21032001419c086a210c20014190086a41086a21054101211741012106034020014190086a2014109601024020052802002209410f470d00201441016a22142002490d010c040b2001290390082104200141a8046a200c41ec0010ce031a200141a0076a200141a8046a41ec0010ce031a201620093602002005200437030020012014360290082003200141a0076a41ec0010ce03210820042000520d05200141a0056a41086a220f200529030037030020012001290390083703a005200141c0056a200841ec0010ce031a200141b8036a41086a2210200f290300370300200120012903a0053703b80320014190086a200141c0056a41ec0010ce031a024020172006470d00201741016a22082017490d0e2017410174220f20082008200f491b2208ad4207862204422088a70d0e2004a7220f4100480d0e024002402017450d0020152017410774200f101e22150d010c0c0b200f101f2215450d0b0b200821170b201520064107746a220820012903b803370300200841086a2010290300370300200841106a2009360200200841146a20014190086a41ec0010ce031a200641016a2106201441016a22142002490d000c030b0b2006103c0b4100211741082115410021060b41072118201520064107746a21162006450d060c070b4101211741072118201541014107746a211641010d060c050b2016103c41072118201520064107746a211620060d050c040b41df88c0004133103a000b41df88c0004133103a000b41800141081020000b200f41081020000b0240201522142016460d00410021020c020b410121020c010b41082119200141a8046a41086a211a20014190086a41086a211b4104211c20014190086a410472211d410c211e200141a8046a410c6a211f411021204114212141ec0021224180012123410f21244116212541aeb9c00021264100212741f8b3c2002128417f21294202212a423e212b41fe00212c4102212d4200212e417e212f41ff002130423f2131420121324115213341a89cc0002134410521354103213641e8002137200141a8046a41e8006a213841e000213920014199086a213a4106213b4113213c41bd9cc000213d4101213e41f800213f42e80021404220214141172142412e2143411f214441987f2145411821464120214742e4cab5fbb6ccdcb0e3002148423821494160214a20014198056a214b41c000214c412c214d4124214e411c214f413421502015211441002151410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010206060b20014190086a41106a210620014190086a41146a21080340200141c0066a41086a2205201441086a290300370300200120142903003703c006201441106a280200210220014190086a201441146a41ec0010ce031a2002410f460d09200141a0056a41086a22092005290300370300200120012903c0063703a005200141c0056a20014190086a41ec0010ce031a2006200236020020014190086a41086a2009290300370300200120012903a005370390082008200141c0056a41ec0010ce031a2006103c20144180016a22142016470d000b410121020c560b02402017450d002015101d0b4117101f2202450d012002410f6a41002900f89c40370000200241086a41002900f19c40370000200241002900e99c4037000020024117412e101e2202450d0220022000370017200141b8036a41086a22064200370300200142003703b8032002411f200141b8036a1001200141c0066a41086a2006290300370300200120012903b8033703c00602400240200141c0066a411041f8b3c200410041001002417f460d00200142103702c4052001200141c0066a3602c00520014190086a200141c0056a109701200128029008220d450d052001290294082104200141c0066a411010092004422088a721062004a7210e0c010b4108210d410021064100210e0b2002101d200d200641e8006c22026a210902400240024002402002450d00200241987f6a210520014190086a41047221032001419c086a210c20014199086a210f20014198086a2110200d2102034020022802002106200141c0056a200241046a41dc0010ce031a20064110460d0220014190086a200141c0056a41dc0010ce031a0240024002402006410f470d0020050d010c020b200241e0006a2802002108200141a8046a20014190086a41dc0010ce031a20012006360290082003200141a8046a41dc0010ce031a200141003b01c005200141386a20014190086a200141c0056a108a0120012802382106200c2008360200200f2006453a0000201041063a0000200141053a00900820014190086a108b012005450d010b200241e8006a2102200541987f6a21050c010b0b200922022009470d020c030b200d22022009470d010c020b200241e8006a22022009460d010b20014190086a410472210503402002280200210620014190086a200241046a41e40010ce031a20064110460d01200141c0056a20014190086a41e40010ce031a20012006360290082005200141c0056a41e40010ce031a02402006410f460d0020014190086a103c0b200241e8006a22022009470d000b0b200e450d06200d101d410221020c550b20001098014108217342002174200141b8036a41086a22754200370300200142003703b8034117217641c59ec100217741c59ec1004117200141b8036a1001200141a0056a41086a22782075290300370300200120012903b8033703a0054100217941f8b3c200217a4110217b417f217c200141a0056a411041f8b3c200410041001002417f460d12200141a8046a410472217d4105217e20014190086a410572217f412021800120014190086a41206a21810120014190086a410472218201421021830120014190086a41086a218401410f21850141dc002186014118218701411521880141dfd9c0002189014220218a014128218b014106218c0141ff01218d01410c218e01200141a8046a410c6a218f01413021900120014190086a41306a219101412c21920120014190086a412c6a21930141072194014101219501411c219601413c2197014134219801412421990141e000219a01410d219b01418cb9c000219c014102219d014116219e0141869bc000219f01411e21a00141909fc10021a101411b21a201413b21a301413321a401412b21a501412321a60141f60021a70141d30021a80141cb0021a90141c30021aa0141db0021ab01415821ac01422821ad01413821ae01410121510c040b411741011020000b412e41011020000b41df88c0004133103a000b024020510e04000e0d0c0c0b201420206a2802002102201429020821042014280200210520014190086a201420216a202210ce031a201420236a211420022024460d44200141a0076a20014190086a202210ce031a201a2002360200200120043703a804201f200141a0076a202210ce031a200141c0056a200510990120012802c0052103024002400240200141c0056a20196a22522802002202450d00200220357421094200210b2003210242002153420021544200215542002156420021570340200141f8026a2002109a01200141f8026a20196a290300210720012903f8022104201d2002290000370000201d20196a200220196a290000370000201d20206a200220206a290000370000201d20466a200220466a2900003700002001200536029008200141e8026a2004200720014190086a109b0122062046742046752208201876200673203e6aad204986204987202e10d203200720537c2004200b7c220b200454ad7c2153202e200141e8026a20196a2903002204200820274822061b20557c202e20012903e802220720061b220a20547c2254200a54ad7c21552004202e20061b20577c2007202e20061b220420567c2256200454ad7c2157200220476a21022009204a6a22090d000b20012802c405450d020c010b420021564200215742002154420021554200210b4200215320012802c405450d010b2003101d0b200141c0056a200510990120012802c005210e02400240024020522802002202450d002002203574210c4200210a200e21024200211242002111420021584200211342002159034020014190086a20466a2208200220466a220f29000037030020014190086a20206a2203200220206a2210290000370300201b200220196a220d29000037030020012002290000370390082020101f2206450d0e200620196a20272900a49b403700002006202729009c9b40370000200620202047101e2206450d0d2006200536001020062047204c101e2206450d0c20062001290390083700142006204d6a20082903003700002006204e6a20032903003700002006204f6a201b290300370000200141b8036a20196a2209202e3703002001202e3703b80320062050200141b8036a1001200141c0066a20196a2009290300370300200120012903b8033703c006410021090240200141c0066a202020284100410010022029460d00200120273a00a005200141c0066a2020200141a0056a203e20271002203e6a203e4d0d0c20012d00a00521090b2006101d2008200f29000037030020032010290000370300201b200d2900003703002001200229000037039008200141c8026a200520014190086a20092046742206204475200973203e6a2020109c01200141c8026a20466a29030020127c20012903d8022204200a7c220a200454ad7c2112202e200141c8026a20196a2903002204200620467520274822061b20587c202e20012903c802220720061b225820117c2211205854ad7c21582004202e20061b20597c2007202e20061b220420137c2213200454ad7c2159200220476a2102200c204a6a220c0d000b20012802c405450d020c010b420021134200215942002111420021584200210a4200211220012802c405450d010b200e101d0b42002107200141b8036a20196a225a4200370300200142003703b80320262025200141b8036a1001200141c0066a20196a225b205a290300370300200120012903b8033703c00602400240200141c0066a202020282027202710022029460d002001202e370398082001202e37039008200141c0066a202020014190086a20202027100222022029460d05200220244d0d05201b290300210420012903900821070c010b420021040b024002400240200a200b7c220b202a88201220537c200b200a54ad7c220a202b86842212200b85200a202a882253200a8584500d002012205384500d004100210202400340200141b8026a200b200a2002201c6a202c7110d4032002202d6a210220012903b8022212200b85200141b8026a20196a2903002253200a8584500d012012205384202e520d000b0b200141a8026a200b200a2002202c7110d40320012903a802200141a8026a20196a290300842112420021532002450d012012420052ad2112034020014188026a200b200a20272002202f6a2206200620024b1b220220307110d40320014198026a2012203286225c203284225d20532032862012203188842253205d205310d203205c205d2001290398022001290388025620014198026a20196a290300221220014188026a20196a290300225e562012205e511b1b211220020d000c030b0b42002153200b200a84420052ad21120c010b2012420052ad21120b0240024002400240024002402007202a882004202b8684220b2007852004202a88220a20048584500d00200b200a84500d004100210202400340200141f8016a200720042002201c6a202c7110d4032002202d6a210220012903f801220b200785200141f8016a20196a290300220a20048584500d01200b200a84202e520d000b0b200141e8016a200720042002202c7110d40320012903e801200141e8016a20196a29030084210b4200210a2002450d01200b420052ad210b0340200141c8016a2007200420272002202f6a2206200620024b1b220220307110d403200141d8016a200b203286225c203284225d200a203286200b20318884220a205d200a10d203205c205d20012903d80120012903c80156200141d8016a20196a290300220b200141c8016a20196a290300225e56200b205e511b1b210b20020d000b201220538450450d020c030b4200210a2007200484420052ad210b201220538450450d010c020b200b420052ad210b2012205384500d010b205820557c201120547c2207201154ad7c2154205920577c201320567c2204201354ad7c2111204b2d00002202202d460d0102402002203e470d0003402053215320122155200b200a84202e510d0a200141a8016a200420112055205310d103200141b8016a20072054200b200a10d1034101215f20012903b801225620012903a801225754200141b8016a20196a2903002212200141a8016a20196a290300221354201220135122021b0d042057205654201320125420021b0d0220014198016a20562012200b200a10d20320014188016a205720132055205310d203200420012903880122127d2213201120014188016a20196a2903007d2004201254ad7d225684500d02205420014198016a20196a2903007d215720072001290398012204542102200720047d2112200b2104200a21112013210b2056210a2055210720532154201220572002ad7d22538450450d000c040b0b0340200141f8006a200720542012205310d103200b2255200a225684202e510d08200141f8006a20196a290300210b2001290378210a200141e8006a200420112055205610d1034101215f200a2001290368225754200b200141e8006a20196a290300221354200b20135122021b0d032057200a542013200b5420021b0d01200141d8006a200a200b2012205310d203200141c8006a205720132055205610d20320042001290348220b7d220a2011200141c8006a20196a2903007d2004200b54ad7d221384500d012054200141d8006a20196a2903007d2157200720012903582204542102200720047d210b2012210420532111200a2112201321532055210720562154200b20572002ad7d220a8450450d000c030b0b4100215f0c010b2004200756201120545620112054511b215f0b4200210a205a4200370300200142003703b80320342033200141b8036a1001205b205a290300370300200120012903b8033703c0060240200141c0066a202020282027202710022029460d002001202e37039008200141c0066a202020014190086a201920271002203e6a20194d0d07200129039008210a0b20014190086a200510990120012802900821602001280294082161201b2802002262450d432060206220357422636a2164205f203e732165206021020340200141e8036a20466a2266200220466a2206290000370300200141e8036a20206a2267200220206a2209290000370300200141e8036a20196a2268200220196a2208290000370300200120022900003703e80320082900002104200929000021072002290000210b20014188046a20466a2203200629000037030020014188046a20206a220c200737030020014188046a20196a220f20043703002001200b3703880420022900002104201d20466a22692006290000370000201d20206a226a2009290000370000201d20196a226b2008290000370000201d2004370000200120053602900841002106024020014190086a109b012046742046752209410048206573203e470d00200141c8036a20466a2003290300370300200141c8036a20206a200c290300370300200141c8036a20196a200f29030037030020012001290388043703c803410121062009216c0b200141c0056a20466a226d200141c8036a20466a2210290300370300200141c0056a20206a226e200141c8036a20206a220d2903003703002052200141c8036a20196a220e290300370300200120012903c8033703c005024020060d00200220476a21022063204a6a22630d010c450b0b200141c0066a20466a226f206d290300370300200141c0066a20206a2270206e290300370300205b2052290300370300200120012903c0053703c006200220476a2102206020622035746a21630340200141a0056a20466a2206206f290300370300200141a0056a20206a22092070290300370300200141a0056a20196a2208205b290300370300200120012903c0063703a00520014190086a20466a200629030037030020014190086a20206a2009290300370300201b2008290300370300200120483703b806200120012903a00537039008200141b8066a20014190086a200a206c204674204675201876206c73203e6aad2049862049877e20007c109d0120022064460d4403402066200220466a22062900003703002067200220206a22092900003703002068200220196a2208290000370300200120022900003703e80320032006290000370300200c2009290000370300200f20082900003703002001200229000037038804200120053602900820082900002104200929000021072002290000210b20692006290000370000206a2007370000206b2004370000201d200b37000041002106024020014190086a109b012046742046752209410048206573203e470d0020102003290300370300200d200c290300370300200e200f29030037030020012001290388043703c803410121062009216c0b206d2010290300370300206e200d2903003703002052200e290300370300200120012903c8033703c005024020060d002063200220476a2202470d010c460b0b206f206d2903003703002070206e290300370300205b2052290300370300200120012903c0053703c006200220476a21020c000b0b410321020c4f0b410221020c4e0b410121020c4d0b41df88c0004133103a000b41b8a7c400102c000b41b8a7c400102c000b41df88c0004133103a000b41df88c0004133103a000b41c00041011020000b412041011020000b411041011020000b0240024002400240024002400240024002400240024020c501450d0020c40120c20120ce01746a210220c40120c20120df016a20ce01746a2106034020c20120c7014f0d04200141c0056a20022802002205109e0120012903c00520d001520d02200141a8046a20cc0120d10110ce031a20012903c006220a20012903a804220b54200141c0066a20cb016a2903002207200141a8046a20cb016a29030022045420072004511b450d03200120cf013a00e80320df0120c2016a220520c7014f0d0520062002280200360200200220d2016a2102200620d2016a210620c70120c20120cf016a22c201470d000c110b0b20c40120c20120ce01746a2102034020c20120c7014f0d03200141c0056a20022802002205109e0120012903c00520d001520d01200141a8046a20cc0120d10110ce031a20012903c006220a20012903a804220b5a200141c0066a20cb016a2903002207200141a8046a20cb016a29030022045a20072004511b0d02200120cf013a00e803200220d2016a210220c70120c20120cf016a22c201470d000c0f0b0b20df0120de016a21df0120c50120cf016a21c50120c20120cf016a22c20120c701470d060c0e0b20c20120cf016a21c2012001200a200b7d3703c0062001200720047d200a200b54ad7d3703c80620d301101f2202450d02200220d4016a20cd012f00eaa8413b0000200220cb016a20cd012900e2a841370000200220cd012900daa841370000200220d30120d501101e2202450d0320022005360012200141b8036a20cb016a220620d601370300200120d6013703b803200220d701200141b8036a1001200141a0056a20cb016a2006290300370300200120012903b8033703a005200141a0056a20d40110092002101d20ca01200141a8046a20d4016a290300200141a8046a20d8016a290300109401200141186a20c901200b2004109f01200141a0076a20cb016a220220d90120022903002207200141186a20cb016a2903007c20012903a007220a20012903187c2212200a542202ad7c220a2002200a200754200a2007511b22021b370300200120d901201220021b3703a00720da01200437030020db01200b37030020014190086a20cb016a20ce013a000020dc01200536020020c80120c90129000037000020c80120cb016a20c90120cb016a29000037000020c80120d4016a20c90120d4016a29000037000020c80120d8016a20c90120d8016a290000370000200120dd013a00900820014190086a108b0120df0120de016a21df0120c50120cf016a21c50120c20120c701470d040c0d0b41c8aac30020c20120c701104b000b41d8aac300200520c701104b000b411241011020000b412441011020000b410321510c010b410321510c010b410321020c450b410321020c440b20c1012903002104410021020240024002400240024020bb01a7220620bd01460d002006450d014100210203402002200620bd0176220520026a2209200420b201200920b801746a290300541b2102200620056b220620bd014b0d000b0b200420b201200220b801746a22062903002207520d0120bb012002ad580d022006200620bc016a200220be017320bb01a76a20b8017410cf031a20b30120b7018320bb0120ba018620bf017c8421b30120bb0120c0017c21bb0120c10120bc016a22c10120b901470d030c060b410010a001000b200220042007566a10a001000b41b0aac300102c000b41022151410321020c430b20012083013702c4052001200141a0056a3602c00520014190086a200141c0056a10a1012001280290082202450d0c2001280294082109410f210602400240024002402084012802002205450d0020022903002000520d0020014188046a2087016a220820022080016a29000037030020014188046a207b6a220320022087016a29000037030020014188046a20736a220c2002207b6a29000037030020012002290008370388042005207c6a2206ad20ad017e2204208a0188a70d122004a72205207c4c0d12024002402005450d002005101f220f0d010c1c0b4108210f0b200f2002208b016a200510ce03210520840120063602002001200636029408200120053602900820752074370300200120743703b80320772076200141b8036a100120782075290300370300200120012903b8033703a0052001207b3602c4052001200141a0056a3602c00520014190086a200141c0056a10a20102402006450d002005101d0b200141c0066a2087016a220f2008290300370300200141c0066a207b6a22102003290300370300200141c0066a20736a220d200c29030037030020012001290388043703c006208701101f2206450d1b2006207b6a20792900ec9e41370000200620736a20792900e49e41370000200620792900dc9e41370000200620870120ae01101e2205450d1c200520012903c00637001820052090016a200f2903003700002005208b016a201029030037000020052080016a200d29030037000020752074370300200120743703b803200520ae01200141b8036a100120782075290300370300200120012903b8033703a00502400240200141a0056a207b207a207920791002207c460d0020012083013702ec032001200141a0056a3602e80320014190086a200141e8036a10a3012001280290082206208501460d1f200141c0056a20820120860110ce031a200141a0056a207b10090c010b410f21060b200141a8046a200141c0056a20860110ce031a2006208501470d012005101d410f21060b2009450d020c010b200141a0076a200141a8046a20860110ce031a2005101d200141c8036a2087016a2008290300370300200141c8036a207b6a2003290300370300200141c8036a20736a200c29030037030020012001290388043703c8032009450d010b2002101d0b2006208501460d00200120063602a804207d200141a0076a20860110ce031a200141c0066a2087016a220e200141c8036a2087016a290300370300200141c0066a207b6a2252200141c8036a207b6a290300370300200141c0066a20736a2265200141c8036a20736a290300370300200120012903c8033703c00620752074370300200120743703b803208901208801200141b8036a100120782075290300370300200120012903b8033703a00502400240024002400240200141a0056a207b207a207920791002207c460d0020012083013702c4052001200141a0056a3602c00520014190086a200141c0056a10a401200128029008226d450d162001290294082204208a0188a7226e208b016c2209450d020c010b420021044108216d4200208a0188a7226e208b016c2209450d010b4100210d41002110206d2106034020014190086a2087016a2205200e29030037030020014190086a207b6a220820522903003703002084012065290300370300200120012903c00637039008208101200629000037000020810120736a2203200620736a290000370000208101207b6a220c2006207b6a2900003700002081012087016a220f20062087016a29000037000020a201101f2202450d09200220766a20792800d390413600002002207b6a20792900cc9041370000200220736a20792900c49041370000200220792900bc9041370000200220a20120a301101e2202450d0a200220012903900837001b200220a4016a2005290300370000200220a5016a2008290300370000200220a6016a208401290300370000200220a30120a701101e2202450d0b200220810129000037003b200220a8016a200f290000370000200220a9016a200c290000370000200220aa016a200329000037000020752074370300200120743703b803200220ab01200141b8036a100120782075290300370300200120012903b8033703a005024002400240200141a0056a207b207a207920791002207c470d00410221052002101d4102208d0171209d01470d010c020b200120793a00c005200141a0056a207b200141c0056a209501207910022095016a2095014d0d0e20012d00c0052105200141a0056a207b10092002101d2005208d0171209d01460d010b200d2005209501716a210d20102005207c73209501716a21100b2006208b016a2106200920ac016a22090d000b206e20106b21022004a7450d020c010b410021104100210d206e41006b21022004a7450d010b206d101d0b2002200d6b210202400240024002400240024020012802a804208c01470d00200141a8046a20736a2d0000208d0171208c01470d00208f0128020021062091012002360200209301201036020020014190086a208b016a200d360200207f20012903c006370000207f20736a2065290300370000207f207b6a2052290300370000207f2087016a200e290300370000200120793a00940820012094013a00900820014190086a108b0120022010720d0120014190086a208e016a2006360200208401207e3a00002001207e3a00900820014190086a108b01200610a5010c010b200141e8036a2087016a200e290300370300200141e8036a207b6a2052290300370300200141e8036a20736a2065290300370300200120012903c0063703e8032091012002360200209301201036020020014190086a208b016a200d360200207f20012903c006370000207f20736a2065290300370000207f207b6a2052290300370000207f2087016a200e29030037000020012095013a00940820012094013a00900820014190086a108b01200d200220106a4d0d00209601101f2206450d1f20062087016a207928008c9f413600002006207b6a20792900849f41370000200620736a20792900fc9e41370000200620792900f49e413700002006209601209701101e2206450d20200620012903c00637001c20062098016a200e29030037000020062092016a205229030037000020062099016a20652903003700004200210420754200370300200142003703b8032006209701200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b10092006101d420021072010450d0220752074370300200120743703b80320a10120a001200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b207a207920791002207c460d012001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d1220012903900821070c020b200141a8046a103c0c020b420021070b200141c0056a200141a8046a209a0110ce031a20754200370300200142003703b803209c01209b01200141b8036a100120782075290300370300200120012903b8033703a0050240200141a0056a207b207a207920791002207c460d002001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d0d20012903900821040b20752074370300200120743703b803209f01209e01200141b8036a100120782075290300370300200120012903b8033703a00502400240200141a0056a207b207a207920791002207c460d002001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d0f200129039008210b0c010b42e807210b0b20014190086a200141c0056a209a0110ce031a200141a0056a200b20047c20014190086a209d0120950120022010721b200710950120012802a005209501470d0020012802a40522020d010b20752074370300200120743703b80320772076200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b207a207920791002207c470d330c010b2078280200210641ae9fc100410f100a20022006100a0b200141286a41878bc0004110108f01200129033021af0120012802282106200141a0056a41086a22024200370300200142003703a00541b895c0004115200141a0056a100120014190086a41086a2002290300370300200120012903a005370390080240024020014190086a411041f8b3c200410041001002417f460d00200141003a00c00520014190086a4110200141c0056a41014100100241016a41014d0d2420012d00c0050d010b4108101f2202450d2820024200370300200142818080801037029408200120023602900841978bc000411520014190086a10a6012002101d4108101f2202450d2920024200370300200142818080801037029408200120023602900841cd95c000411620014190086a10a6012002101d200141a0056a41086a22024200370300200142003703a00541f78ac0004110200141a0056a100120014190086a41086a22052002290300370300200120012903a00537039008200142003703c00520014190086a4110200141c0056a41081003200141013a00c00520024200370300200142003703a00541b895c0004115200141a0056a100120052002290300370300200120012903a0053703900820014190086a4110200141c0056a410110030b410821b001420021b101200141a0056a41086a22024200370300200142003703a00541978bc0004115200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a10a70120012802c00522b001450d2420012902c40521b1010b410821b201420021b301200141a0056a41086a22024200370300200142003703a00541cd95c0004116200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a10a70120012802c00522b201450d2520012902c40521b3010b200141a0056a41086a22024200370300200142003703a00541e395c0004114200141a0056a100120014190086a41086a2002290300370300200120012903a0053703900802400240024020014190086a411041f8b3c200410041001002417f460d00200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d14420120012903c00522042004501b21b40120b101422088a721b50120060d020c010b42e50021b40120b101422088a721b50120060d010b20b501417f6a220220b5014b0d1d200220b5014f0d1d20b00120024103746a2202450d1d200229030021af010b410020b50141016a220220b401a76b2206200620024b1b22b60120b5014b0d1d42ffffffff0f21b701410321b80120b00120b6014103746a21b90120b601450d00422021ba0120b30142208821bb01410821bc01410121bd01417f21be0142808080807021bf01427f21c00120b00121c101410221510c320b20b10120b701832104024020b50120b6016b2202450d00024020b601450d0020b00120b901200241037410cf031a0b2002ad42208620048421040b41002102024020b3014220882207a72208450d00024020084101460d004100210220082106034020022006410176220520026a220920af0120b20120094103746a290300541b2102200620056b220641014b0d000b0b2002200220af0120b20120024103746a290300220b566a20af01200b511b220220084b0d210b02400240024002400240024002400240200820b301a7470d00200841016a22062008490d492007a722094101742205200620062005491bad22b301420386220b422088a70d49200ba722064100480d4902402008450d0020b20120094103742006101e22b201450d020c010b2006101f22b201450d010b20b20120024103746a220641086a2006200820026b41037410cf031a200620af013703002004a72004422088220ba72202470d02200241016a22062002490d4820024101742205200620062005491bad2204420386220a422088a70d48200aa722064100480d482002450d0120b00120024103742006101e22b001450d030c020b200641081020000b2006101f22b001450d010b20b00120024103746a20af01370300200742017c220aa72202450d212002410176220620024f0d2220b20120064103746a2903002107024020024101710d002006417f6a220620024f0d2d20b20120064103746a29030020077c42018821070b20b30142ffffffff0f83200a42208684210a2001200b42017c220b422086200442ffffffff0f838437029408200120b0013602900841978bc000411520014190086a10a60102402004a7450d0020b001101d0b2001200a37029408200120b2013602900841cd95c000411620014190086a10a601024020b301a7450d0020b201101d0b200141a0056a41086a22094200370300200142003703a00541f78ac0004110200141a0056a100120014190086a41086a22022009290300370300200120012903a00537039008200120073703c00520014190086a4110200141c0056a41081003200b42ffffffff0f8320b401520d0320094200370300200142003703a005418cb9c000410d200141a0056a100120022009290300370300200120012903a0053703900842002104024020014190086a411041f8b3c200410041001002417f460d00200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d1720012903c00521040b200141a0056a41086a22024200370300200142003703a00541cb96c0004117200141a0056a100120014190086a41086a2002290300370300200120012903a0053703900820014190086a411041f8b3c200410041001002417f460d01200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d1720012903c005210b0c020b200641081020000b42e807210b0b200720b4014201887c200b7c2004560d0020014190086a108001200128029008210820012802940821c2010240024002402001280298082202450d0020024105742206410575220cad42287e2204422088a70d452004a722054100480d452005101f2203450d31200820066a210f2002410574210520032102200821060340200641086a2900002104200641106a29000021072006290000210b200241186a200641186a290000370000200241106a2007370000200241086a20043700002002200b370000200241206a4201370300200241286a2102200641206a2106200541606a22050d000b200f20086b41606a41057641016a210220c201450d020c010b4100210c410821034100210220c201450d010b2008101d0b42002104200141a0056a41086a22064200370300200142003703a00541f78ac0004110200141a0056a1001200141b8036a41086a2006290300370300200120012903a0053703b8030240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d1c20012903900821040b20012002360298082001200c36029408200120033602900820014190086a20b401427f7c4201200410a8010b200141b8036a41086a22024200370300200142003703b80341eb96c100411d200141b8036a100120092002290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d00200142103702c4052001200141a0056a3602c00520014190086a200141c0056a10a90120012903a00822044202510d25200141b8086a2802002103200141b4086a280200210d200141b0086a2802002110200129039808211202400240024002400240024020012903900822112000520d002003ad221342287e2207422088a741004721062007a721020240024002400240024020044201520d0020060d182002417f4c0d1820012903a80821132002450d012002101f2208450d3a2003450d030c020b20060d172002417f4c0d172002450d052002101f2208450d3a410021c2014100210520030d060c070b410821082003450d010b200341286c21094100210520082102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200541016a2105200641286a2106200941586a22090d000c020b0b410021050b200141b0086a2012370300200141a8086a2013370300200141a4086a2005360200200141a0086a20033602002001419c086a200836020020014198086a4101360200200141023a00900820014190086a108e010b201220117c2000520d040c030b41082108410021c201410021052003450d010b200341286c21094100210520082102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200541016a2105200641286a2106200941586a22090d000b0b200141a8086a20123703002001419c086a200836020020014198086a20c201360200200141a0086a2005ad422086201384370300200141023a00900820014190086a108e01201220117c2000520d010b2003ad42287e2204422088a70d0e2004a72202417f4c0d0e0240024002402002450d002002101f22c201450d31410021054100210920030d010c020b410821c20141002105410021092003450d010b200341286c21084100210920c2012102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200941016a2109200641286a2106200841586a22080d000b0b2001419c086a200936020020014190086a41086a22082003360200200120c20136029408200141093a00900820014190086a108b0102402003450d002010200341286c6a210f4100210520102102034020014190086a41186a2203200241186a29030037030020014190086a41106a22c201200241106a2903003703002008200241086a2903003703002001200229030037039008200241206a29030021042001410e3602ac04200141988ec1003602a804200141c0056a2005200141a8046a107e200141c0056a41086a280200210c20012802c00521094120101f2206450d112006200129039008370000200641186a2003290300370000200641106a20c201290300370000200641086a20082903003700002006412041c000101e2206450d12200620043700202009200c2006412810032006101d024020012802c405450d002009101d0b200541016a2105200241286a2202200f470d000b0b0240200d450d002010101d0b2001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a108101410021c20102402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d2220012802c00521c2010b0240200128029408450d002002101d0b024020c20120054d0d0020014198086a21032005210203402001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a10810141002109024020012802900822062003280200220841f8b3c200410041001002417f460d00200141003602c00520062008200141c0056a41044100100241016a41044d0d0c20012802c00521090b0240200128029408450d002006101d0b200241016a21060240200920024d0d002001410e3602c405200141988ec1003602c00520014190086a2002200141c0056a107e200128029008220220032802001009200128029408450d002002101d0b2006210220c2012006470d000b0b2001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a10810120012802980821062001280290082102200120053602c00520022006200141c0056a410410030240200128029408450d002002101d0b200141b8036a41086a22024200370300200142003703b80341eb96c100411d200141b8036a1001200141a0056a41086a2002290300370300200120012903b8033703a005200141a0056a411010090c010b200d450d002010101d0b200141b8036a41086a22024200370300200142003703b80341a8bcc1004114200141b8036a1001200141a0056a41086a2002290300370300200120012903b8033703a00502400240200141a0056a411041f8b3c200410041001002417f460d002001420037039008200141a0056a411020014190086a41084100100241016a41084d0d1320012903900822044200510d27420021c30120002004824200520d040c010b420021c30120004201824200520d030b200141b8036a41086a220220c301370300200120c3013703b80341cea8c100410c200141b8036a1001200141a0056a41086a22062002290300370300200120012903b8033703a00502400240200141a0056a411041f8b3c200410041001002417f460d0020014200370398082001420037039008200141a0056a411020014190086a4110410010022205417f460d2b2005410f4d0d2b20014198086a290300210420012903900821070c010b42002107420021040b200120073703c006200120043703c806200141a8086a200437030020014190086a41106a200737030020014190086a41086a41013a00002001410a3a00900820014190086a108b01200141003a00e803200142003703a807200142003703a00720024200370300200142003703b80341bcbcc1004112200141b8036a100120062002290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d00200142103702c4052001200141a0056a3602c00520014190086a200141c0056a10aa0120012802900822c401450d2c2001200129029408220437028c04200120c40136028804410021c50120014100360290042004a721c6012004422088a722c701450d0220014199086a21c801200141e8046a21c901200141c8046a21ca01410821cb01200141c0056a41086a21cc01410021cd01410221ce01410121cf01420121d00141e00021d101410421d201411221d301411021d401412421d501420021d601411621d701411821d801427f21d901200141c8086a21da01200141c0086a21db01200141bc086a21dc01410a21dd01417f21de01410021df01410021c501410021c201410321510c330b410021c70120014100360290042001420437038804410421c401410021c6010b410021c5010b20014188046a41086a20c70120c5016b36020020014188046a10ab01024020c601450d0020c401101d0b20012903a007200141a0076a41086a29030010ac01024020012d00e8030d0042002104200141b8036a41086a22144200370300200142003703b80341cebcc100410d200141b8036a1001200141a0056a41086a2014290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d002001410036029008200141a0056a411020014190086a41044100100241016a41044d0d2a20013502900821040b200141086a20012903c006222e42002004420010d203200141c0066a41086a2214201429030022042004420042edeb82bdef9804200129030842c0843d8020012903104200521b2232202e5641002004501b22141b22077d202e202e203220141b220454ad7d3703002001202e20047d3703c006200141a8086a2007370300200141a0086a200437030020014190086a41086a41033a00002001410a3a00900820014190086a108b010b20012903c006212e200141a8086a200141c0066a41086a221429030037030020014190086a41106a202e37030020014190086a41086a41043a00002001410a3a00900820014190086a108b012014290300212e20012903c0062104200141b8036a41086a22144200370300200142003703b80341cea8c100410c200141b8036a1001200141a0056a41086a2014290300370300200120012903b8033703a0052001202e370398082001200437039008200141a0056a411020014190086a411010030b200141a0056a41086a221420c301370300200120c3013703a00541e0f2c1004111200141a0056a1001200141b8036a41086a2014290300370300200120012903a0053703b803200141b8036a4110100920014190096a24000f0b411b41011020000b413b41011020000b41f60041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b102e000b412041011020000b41c00041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200541081020000b411841011020000b413841011020000b41df88c0004133103a000b411c41011020000b413c41011020000b41df88c0004133103a000b41f795c0004126103a000b41b0aec400102c000b4198d8c200102c000b4180d1c20020062002104b000b41df88c0004133103a000b41c8aec400102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41ecd8c300102c000b410841081020000b410841081020000b4180d1c20020062002104b000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241081020000b200541081020000b200241081020000b200241081020000b41012151410321020c0f0b410321020c0e0b410321020c0d0b02402061450d002060101d0b200510a5010240024002400240024002400240205f450d0020014190086a201e6a22022005360200201b20363a0000200120353a00900820014190086a108b0120382903002204500d01200141c0056a200141a8046a203f10ce031a200141a0056a200420007c220410ad0120014190086a200141c0056a203f10ce031a200141c0066a201b203910ce031a20012802a4052208200141a0056a20196a22062802002202470d022002203e6a22092002490d142002203e742208200920092008491b2208ad20407e2207204188a70d142007a722032027480d142002450d0320012802a005200220376c2003101e22090d040c0a0b20014190086a201e6a2005360200201b201c3a0000200120353a00900820014190086a108b01205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c1003201a103c20142016470d0c0c050b20014190086a201a203910ce031a200120273b01c005200141c0006a20014190086a200141c0056a108a012001280240210620022005360200203a2006453a0000201b203b3a0000200120353a00900820014190086a108b01205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c100320142016470d0a0c040b20012802a00521090c020b2003101f2209450d060b200120083602a405200120093602a0050b2009200220376c220f6a200141c0066a203910ce03210320062002203e6a220c360200200320396a20053602002042101f2202450d02200220246a20272900f89c40370000200220196a20272900f19c40370000200220272900e99c40370000200220422043101e2202450d0320022004370017205a202e3703002001202e3703b80320022044200141b8036a1001205b205a290300370300200120012903b8033703c00620012020360294082001200141c0066a36029008200141a0056a20014190086a10ae012002101d0240200c450d00200f20376a2106200921020340024020022802002024460d002002103c0b200220376a2102200620456a22060d000b0b02402008450d002009101d0b205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c100320142016470d050b201621140b20142016470d070c060b411741011020000b412e41011020000b200341081020000b410021510c040b410021510c040b410021510c040b410121020c040b410021020c030b410321020c020b410321020c010b410321020c000b0b1021000ba00905027f017e037f027e097f230041d0006b220124004108210242002103200141186a41086a220442003703002001420037031841ddb8c000410d200141186a1001200141086a41086a2004290300370300200120012903183703084100210502400240024002400240024002400240024002400240200141086a411041f8b3c200410041001002417f460d00200142103702442001200141086a360240200141186a200141c0006a10d30120012802182202450d05200129021c2103200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a290300370300200141186a41086a200041086a290300370300200120002903003703182003422088a722052003a7470d02200141186a210020052003a7460d010c070b200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a2903003703002004200041086a29030037030020012000290300370318200141186a210041004200a7470d060b200541016a22042005490d0720054101742206200420042006491bad220742287e2208422088a70d072008a722044100480d072005450d012002200541286c2004101e2202450d020c040b200141186a21000c050b2004101f22020d020b200441081020000b41df88c0004133103a000b20034280808080708320078421030b2003422088a721050b2002200541286c22066a22042000290300370300200441206a200041206a290300370300200441186a200041186a290300370300200441106a200041106a290300370300200441086a200041086a290300370300200141186a41086a220942003703002001420037031841ddb8c000410d200141186a1001200141086a41086a20092903003703002001200129031837030820014100360248200142013703402001200541016a220a360218200141186a200141c0006a106202400240200a450d00200641286a210b200141c0006a41086a220c28020021002001280244210d200221060340200141186a200610d4012001280218210e0240024002400240200d20006b2009280200220f4f0d002000200f6a22042000490d07200d4101742210200420042010491b22114100480d07200d450d012001280240200d2011101e22100d020c080b2000200f6a2104200128024021100c020b2011101f2210450d060b20012011360244200120103602402011210d0b200c2004360200201020006a200e200f10ce031a0240200128021c450d00200e101d0b200641286a210620042100200b41586a220b0d000c020b0b200141c0006a41086a28020021042001280244210d200128024021100b200141086a41102010200410030240200d450d002010101d0b0240200a450d00200541286c41286a2104200221000340024020002d00002206450d00024020064101470d00200041086a280200450d01200041046a280200101d200041286a2100200441586a22040d020c030b200041106a280200450d002000410c6a280200101d0b200041286a2100200441586a22040d000b0b02402003a7450d002002101d0b200141d0006a24000f0b1021000b201141011020000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1001200341086a2005290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d002003420037031020034110200341106a41084100100241016a41084d0d0220032903102106200341101009420121040c010b0b2000200437030020002006370308200341206a24000f0b41df88c0004133103a000be096012f017f027e027f037e0e7f017e027f017e037f017e027f037e187f027e027f037e167f017e027f037e1d7f027e057f017e087f037e0e7f037e027f017e127f017e027f027e017f027e017f017e097f017e087f017e047f027e0b7f027e027f230041d0086b2202240002400240024002400240024002400240024002402001450d00200241e8036a41086a22014200370300200242003703e80341a590c1004117200241e8036a1001200241f0056a41086a2001290300370300200220022903e8033703f0050240024002400240024002400240200241f0056a411041f8b3c200410041001002417f460d00200242003703f806200241f0056a4110200241f8066a41084100100241016a41084d0d0220022903f80621030c010b420321030b200241e8036a41086a22014200370300200242003703e8034195a8c1004115200241e8036a1001200241f8066a41086a2001290300370300200220022903e8033703f80602400240200241f8066a411041f8b3c200410041001002417f460d00200242003703f005200241f8066a4110200241f0056a41084100100241016a41084d0d034200210420022903f00520037e22034200510d010c050b4200210442e80720037e22034200520d040b200241e8036a41086a22012004370300200220043703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d032001410f4d0d0320024180076a290300210320022903f80621040c050b420021030c040b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b2000200320032000541b22002004510d0442002104200241e8036a41086a22014200370300200242003703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0042003421086200080210002400240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d052001410f4d0d0520024180076a290300210320022903f80621040c010b420021030b200241a0036a200420032000420010d20320022903a003421088200241a8036a2903002200423086842104200042108821030b200241e8036a41086a22014200370300200242003703e80341deecc1004118200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022206417f460d032006410f4d0d0320024180076a290300210720022903f80621000c010b42002100420021070b20014200370300200242003703e80341deecc1004118200241e8036a100120052001290300370300200220022903e8033703f0042002200020047c22043703f8062002200720037c2004200054ad7c37038007200241f0046a4110200241f8066a411010030b200241e8036a41086a22014200370300200242003703e8034181a8c1004114200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004420021040240024002400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0120022903f80621040b20014200370300200242003703e80341e0d7c1004115200241e8036a100120052001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d00200241f0046a411010090c070b200241e8036a41086a22014200370300200242003703e80341f6ecc100411b200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004420021000240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0220022903f80621000b20014200370300200242003703e8034191edc1004116200241e8036a100120052001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0420022903f80622034200520d0141d880c400102c000b42e80721030b200420007d2003824200520d070c060b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41c080c400102c000b20024188036a41deecc100411810e3010240024002400240200229039003220820024188036a41106a290300220984500d00200228028803450d01200241e8036a41086a22014200370300200242003703e80341a7edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0044100210a02400240024002400240200241f0046a411041f8b3c200410041001002417f460d00200242103702f4052002200241f0046a3602f005200241f8066a200241f0056a105e20022802f806220b450d0220022802fc06210c20024180076a280200220a41057422010d010c040b4101210b4100210c41004105742201450d020b200b20016a210d4120210e4112210f41102110410021114108211241322113412a21144118211541222116411a21174200211841f8b3c2002119417f211a4201211b200241a0076a211c4130211d2002419c076a211e4210211f200b2120410021210c050b41df88c0004133103a000b410021010c040b410021010c030b410121010c020b410121010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010212120b200241e8016a20082009200aad2203420010d20320024190076a2009370300200241f8066a41106a2008370300200241f8066a41086a41003a0000200241043a00f806200241f8066a108b01200241e8036a41086a22014200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004200241f0046a411041f8b3c2004100410010022101200241e8016a41086a290300210420022903e8012100024002402001417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d0f2001410f4d0d0f20024180076a290300210720022903f80621220c010b42002122420021070b200241d8016a202220072003420010d20302402000200484500d0020022903d8012203200241d8016a41086a290300222284500d0042002107200241e8036a41086a22014200370300200242003703e80341aeb9c0004116200241e8036a1001200241f0056a41086a22052001290300370300200220022903e8033703f00502400240200241f0056a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0056a4110200241f8066a4110410010022206417f460d112006410f4d0d1120024180076a290300212420022903f80621230c010b42002123420021240b200241c8016a202320037d202420227d2023200354ad7d2003202210d103200241b8016a20022903c801200241c8016a41086a2903002000200410d20320014200370300200242003703e80341cea8c100410c200241e8036a100120052001290300370300200220022903e8033703f005200241f0056a411041f8b3c2004100410010022101200241b8016a41086a290300210420022903b8012100024002402001417f460d002002420037038007200242003703f806200241f0056a4110200241f8066a4110410010022201417f460d122001410f4d0d1220024180076a290300210320022903f80621070c010b420021030b200241e8036a41086a22014200370300200242003703e80341cea8c100410c200241e8036a1001200241f0056a41086a2001290300370300200220022903e8033703f0052002200720007c22003703f8062002200320047c2000200754ad7c37038007200241f0056a4110200241f8066a411010030b200c450d12200b101d410121010c3c0b200241e8036a41086a22014200370300200242003703e80341ceedc1004112200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0320022903f80642017c21040c010b420121040b200241e8036a41086a22014200370300200242003703e80341ceedc1004112200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a4108100320014200370300200242003703e80341e0edc100411a200241e8036a100120052001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d03200220022903f80622043703f005200241e8036a41086a22014200370300200242003703e8034191edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d06200420022903f806520d010c020b200442e807510d010b200241e8036a41086a22014200370300200242003703e8034191edc1004116200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a4108100320014200370300200242003703e8034181a8c1004114200241e8036a100120052001290300370300200220022903e8033703f004420021040240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0820022903f80621040b20014200370300200242003703e80341f6ecc100411b200241e8036a100120052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a410810030b200241e8036a41086a22014200370300200242003703e80341faedc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004410021250240200241f0046a411041f8b3c200410041001002417f460d00200241003602f806200241f0046a4110200241f8066a41044100100241016a41044d0d0520022802f80621250b200241e8036a41086a22014200370300200242003703e8034190eec100411d200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004024002400240200241f0046a411041f8b3c200410041001002417f460d00200241003602f80641012126200241f0046a4110200241f8066a41044100100241016a41044d0d0820022802f806220141024f0d010c020b410421010b200121260b200241e8036a41086a22014200370300200242003703e80341c8d8c100411a200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004410021050240200241f0046a411041f8b3c200410041001002417f460d0020024190076a4200370300200241f8066a41106a4200370300200241f8066a41086a4200370300200242003703f806200241f0046a4110200241f8066a4120410010022201417f460d082001411f4d0d08200241f0056a41186a2201200241f8066a41186a2205290300370300200241f0056a41106a2206200241f8066a41106a2227290300370300200241f0056a41086a2228200241f8066a41086a2229290300370300200220022903f8063703f005200520012903003703002027200629030037030020292028290300370300200220022903f0053703f806410121050b4128101f2201450d0a200120053a0004200141f8b3c200360200200120022903f806370005200120022f00a8083b00252001410d6a200241f8066a41086a2206290300370000200141156a200241f8066a41106a22272903003700002001411d6a20024190076a2228290300370000200141276a200241aa086a2d00003a0000200241e8036a41086a22054200370300200242003703e80341adeec100411a200241e8036a1001200241f0046a41086a2005290300370300200220022903e8033703f004410021050240200241f0046a411041f8b3c200410041001002417f460d00202842003703002027420037030020064200370300200242003703f806200241f0046a4110200241f8066a4120410010022205417f460d092005411f4d0d09200241f0056a41186a2205200241f8066a41186a2206290300370300200241f0056a41106a2227200241f8066a41106a2228290300370300200241f0056a41086a2229200241f8066a41086a222a290300370300200220022903f8063703f0052006200529030037030020282027290300370300202a2029290300370300200220022903f0053703f806410121050b4128101f2227450d0b202720053a0004202741f8b3c200360200202720022903f806370005202720022f00a8083b00252027410d6a20024180076a290300370000202741156a200241f8066a41106a2903003700002027411d6a200241f8066a41186a290300370000202741276a200241a8086a41026a2d00003a0000200241003602c803200242083703c00320024188086a41186a200241c8086a3602002002410036029808200241f080c40036028c0820022001360288082002200241c0036a36029c082002200241c8086a360294082002200241c8086a36029008200241f8066a20024188086a10f502024002400240024020022d00f80722054102470d00200241023a00f0060c010b200241f0046a200241f8066a41800110ce031a2002200241f8066a4184016a2800003600e303200220022800f9073602e003200241f8066a41046a200241f0046a41800110ce03212120024188086a41106a4101360200200241e8036a200241f8066a41840110ce031a200241003602f806200241f8066a410472200241e8036a41840110ce031a200241f8066a4188016a20053a000020024181086a20022802e00336000020024184086a20022800e303360000200241f0056a2002419c086a200241f8066a10840320022d00f0064102470d010b4100212b200241003602d803200242083703d0032001101d4108212c4108212d4108212e4100212a0c010b200241f8066a200241f0056a41880110ce031a200241e8036a2001108503418801101f222c450d10202c200241f8066a41880110ce031a200241a8086a41186a20024188086a41186a280200360200200241a8086a41106a222f20024188086a41106a290300370300200241a8086a41086a20024188086a41086a29030037030020022002290388083703a808200241f8066a200241a8086a10f502024002400240024020022d00f80722294102470d004101212a4101212b0c010b20024181086a212a200241f8066a410472212d200241bc086a2130200241f9076a212e202f2802002131410221064188012105410021014101212b0340200241f0046a200241f8066a41800110ce031a2002202e41036a2800003600e3032002202e2800003602e0032021200241f0046a41800110ce031a202f203120016a222841016a360200200241e8036a200241f8066a41840110ce031a200220283602f806202d200241e8036a41840110ce031a200241f8066a4188016a20293a0000202a20022802e003360000202a41036a20022800e303360000200241f0056a2030200241f8066a108403200241f0056a4180016a2d00004102460d02200241f8066a200241f0056a41880110ce031a0240200141016a2228202b470d00200241e8036a20022802a80820022802ac08280210110300202841016a22292028490d432006202920292006491b222bad4288017e2204422088a70d432004a722294100480d4302402001417f460d00202c20052029101e222c0d010c100b2029101f222c450d0f0b202c20056a200241f8066a41880110ce031a200641026a210620054188016a2105200241f8066a200241a8086a10f50220282101200241f8066a4180016a2d000022294102470d000b202841016a212a0b202c212d200241f0066a41023a00000c010b200141016a212a202c212d0b20022802a808220520022802ac08220128020011040002402001280204450d002005101d0b2002202a3602d8032002202b3602d4032002202c3602d003202d212e0b200241f0056a20271086032002280290062230450d2241012132200241e8036a410172213341282134200241f0056a41286a213541242136200241f0056a41246a213741182138411021394108213a4120213b200241f8066a41206a213c42d000213d4220213e417f213f41052140428080808010214142002142427f21434100214441d000214541342146413c214741c40021484188012149419f04214a41e000214b41e801214c41f002214d41f803214e41a004214f41c800215041c0002151413821524130215341cc002154410121210c140b209901450d22209901208c016a219901209a01206e6a2101209a0120666a2263219a0120012d00000d112063208c016a229a0120716a219b012063209801470d170c160b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b202941081020000b412841041020000b412841041020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41880141081020000b024002400240024002400240024002400240024002400240024002400240024002400240024020210e050001020304040b2020450d11200f101f2201450d0a200120106a20112f00ddc5413b0000200120126a20112900d5c541370000200120112900cdc5413700002001200f2013101e2201450d0b20012020290000370012200120146a202020156a290000370000200120166a202020106a290000370000200120176a202020126a290000370000200241e8036a20126a22052018370300200220183703e80320012013200241e8036a1001200241f0046a20126a2005290300370300200220022903e8033703f00402400240200241f0046a20102019201120111002201a460d002002201f3702fc062002200241f0046a3602f80620024180036a200241f8066a10d501200228028003450d0b200241e8026a200241f8066a10ca0220022903e802a7450d0b200241e8026a20106a290300210420022903f00221030c010b42002103420021040b2001101d42002100200242003703f805200242003703f005024002402008200320082003200854200420095420042009511b22011b22227d220320092004200920011b22237d2008202254ad7d220784500d00200241f8066a202010cb02200241f8066a20126a2903002204201820022903f8062200201b5620042018522004501b22011b21042000201b20011b2100200241f8066a200e6a28020021060240201c2802002201450d002000200484500d1020062001201d6c6a2105200621010340200241c0026a2001290300200120126a2903002003200710d203200241b0026a20022903c002200241c0026a20126a2903002000200410d103200241d0026a200120106a20022903b002200241b0026a20126a290300108703200241f0056a20022903d00220022903d802200241d0026a20106a29030010df012001201d6a22012005470d000b0b20002004842018510d0e200241a0026a200241f8066a20106a290300200241f8066a20156a2903002003200710d20320024190026a20022903a002200241a0026a20126a2903002000200410d10320024190026a20126a29030021042002290390022100201e280200450d012006101d0c010b420021040b200241f8016a2020200020227c2203200420237c2003200054ad7c108703200241f0056a20022903f801200229038002200241f8016a20106a29030010df0120022903f005200241f0056a20126a29030010ac012020200e6a220121202001200d470d0f410021010c3c0b2035280200215520372802002156200241a8086a20386a2257200241f0056a20386a290300370300200241a8086a20396a2258200241f0056a20396a290300370300200241a8086a203a6a2259200241f0056a203a6a290300370300200220022903f0053703a808200241e8036a200241a8086a10f60202400240024020022d00e8032032470d00200241f0046a20386a203320386a290000370300200241f0046a20396a203320396a290000370300200241f0046a203a6a2033203a6a290000370300200220332900003703f004200241f8066a200241f0046a10c902203c2802002201450d01200241f8066a203a6a290300215a20022903f8062104200241f8066a20366a280200450d022001101d0c020b203c20443602000b420021044200215a0b2055ad203d7e2200203e88a70d2a2000a72201203f4c0d2a0240024002402001450d002001101f225b450d0920552040742201450d020c010b4108215b20552040742201450d010b203020016a215c2004203e88205a203e8684225d2043205a2041541b215e4200215f4100216020302161410021620c1a0b2004203e88205a203e8684215d4200215f410021600c210b0240202a450d00202d206e6a2101206721050340024020012d0000450d00200120666a21012005208c016a22050d010c020b20012091016a2903002204208e012004208e015620012090016a2903002204208d01522004501b22061b22002004208d0120061b220484208d01510d04200241a8016a208f01208f012000200410d10320012092016a200241a8016a206a6a2903003703002001208b016a20022903a801370300200120666a21012005208c016a22050d000b0b20022802c003229401206b280200229501206c6c6a219601209501450d15209401219701410121620c190b20a6012802282201450d1e20a60128022022c201200120a5016c6a21c30120a60120a8016a21c401410321620c190b20e70120c8016a290300210420e7012903002100200241f0056a20cc016a222f20e70120d4016a290000370300200241f0056a20cd016a22a10120e70120d5016a290000370300200241f0056a20c8016a22a20120e70120d6016a290000370300200220e7012900603703f00520e7012802282229ad20d7017e220320d80188a70d272003a7220520d9014c0d2720e70120cc016a290300210320e701290310210720e701280220210102400240024002402005450d002005101f2221450d082029450d020c010b410821212029450d010b2001202920ca016c6a212841002106202121050340200520012903003703002005200120c8016a290300370308200520cb016a200120cb016a290300370300200520c5016a200120c5016a290300370300200520cc016a200120cc016a290300370300200520cd016a200120cd016a290300370300200520ca016a2105200620c7016a2106200120ca016a22012028470d000c020b0b410021060b200241f8066a20cc016a200337030020d301200737030020da01200636020020db01202936020020dc012021360200200220003703f806200220043703800720dd01101f2201450d01200120de016a20df012900e9d841370000200120df012900e2d841370000200120dd0120e001101e2231450d02203120022903f00537000f203120e1016a202f290300370000203120e2016a20a101290300370000203120e3016a20a201290300370000200241e8036a20c8016a222820e401370300200220e4013703e803203120e001200241e8036a1001200241f0046a20c8016a2028290300370300200220022903e8033703f004202820df01360200200220e5013703e8032002200241f8066a3602880820024188086a200241e8036a10f302200220d3013602880820024188086a200241e8036a10f30220dc012802002101200220da0128020022053602880820024188086a200241e8036a1062024002402005450d00200520ca016c21290340024002400240024020022802ec032206202828020022056b20c5014f0d00200520c5016a22212005490d41200620c70174222f20212021202f491b222120df01480d412006450d0120022802e80320062021101e22060d020c060b20022802e80321060c020b2021101f2206450d040b200220213602ec03200220063602e8030b2028200520c5016a360200200620056a220520c8016a200120cc016a290000370000200520cd016a200120c5016a290000370000200520cc016a200120cb016a2900003700002005200120cd016a290000370000200220013602880820024188086a200241e8036a10f302200120ca016a2101202920e6016a22290d000b0b200020c901542101200420d201512105200420d20154210620022802ec032129200241f0046a20cd0120022802e80322212028280200100302402029450d002021101d0b2001200620051b210120e70120d0016a21e7012031101d024020db01280200450d0020dc01280200101d0b200420d20120011b21d201200020c90120011b21c90120e70120d101470d0d200241e8036a41086a22634200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200220d20137038007200220c9013703f806200241f0046a4110200241f8066a4110100320ce014188016c22634188016d2178024002402063450d002078ad4205862204422088a70d3d2004a722014100480d3d2001101f22cd01450d0d20ce01450d010c1d0b410121cd014100217820ce010d1c0b4100210520cf010d1c0c1d0b202141011020000b41b0b0c400102c000b410f41011020000b412f41011020000b200141081020000b200541081020000b41df88c0004133103a000b411241011020000b413241011020000b41c080c400102c000b41c080c400102c000b200141011020000b410021210c040b410421210c050b410021010c2a0b410121010c290b410221010c280b410321010c270b410321010c260b410321010c250b410021010c050b410221010c040b410121010c030b410321010c020b410321010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010204040b20930120696a219301202e202a20666c6a2198012067219901202e2163024002400240024003402063219a0120980120636b206d4d0d07209a01206e6a2d0000450d01209a01206f6a2d0000450d02209a0120726a2d0000450d0320990120746a219901209a0120756a2163209a0120766a2d00000d000b410321010c030b209a0120716a219b01209a0120666a2263209801470d150c140b209a0120706a2163410121010c010b209a0120736a2163410221010b209a01200120666c6a229a0120716a219b012063209801460d10410121010c240b209b01206a6a2903002104209b0129030021000340206320666a210102402063206e6a2d0000450d002001216320682001470d010c140b20632083016a29030022032004206320716a2903002207200054200320045420032004511b22051b21042007200020051b21002063209a0120051b219a012001216320682001470d000b410221010c230b209a0120693a008001209501450d02209a012083016a219c01209a01208a016a219d01410221620c150b410221010c400b02400240024020620e0400010204040b20612201450d272001203b6a2161202e202a20496c6a212941002105202e2106024002400340202920066b204a4d0d012006204b6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204c6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204d6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204e6a22282001460d02200520282001203b10d00322282044476a21052006204f6a210620280d000c020b0b024020062029460d0003402006204b6a22062001460d02200520062001203b10d00322282044476a21052028450d02200620346a22062029470d000b0b2061205c470d0b0c280b202a20054d0d05202e200520496c22066a222820506a2043202e20066a220620506a290300220320062903402204205e7c22002004542206ad7c220720062007200354200020045a1b22061b37030020282043200020061b370340200241f8066a20386a2206200120386a290000370300200241f8066a20396a2228200120396a290000370300200241f8066a203a6a22292001203a6a290000370300200220012900003703f806024020552060470d00205520326a22012055490d442055203274222f20012001202f491b2201ad203d7e2204203e88a70d442004a7222f2044480d44024002402055450d00205b205520456c202f101e225b0d010c090b202f101f225b450d080b200121550b205b206020456c6a220120443602242001200536022020012042370300200120386a2042370300200120396a20423703002001203a6a204237030020292903002104202829030021002006290300210320022903f8062107200120443a0048200120516a2003370300200120526a2000370300200120536a200437030020012007370328200120546a20022800e303360000200120022802e003360049206020326a21602061205c470d0b0c270b02402097012802282201450d002001206c6c21062097012802202089016a21010340202a200128020022054d0d050240202e200520666c6a22052d0080010d002005290340220420052081016a290300220084500d00200241d8006a208e01208d012097012903002203208d0110d203200241e8006a209701206a6a2903002207208d01208d01208d0110d20320024198016a2003208d01208d01208d0110d20320024188016a208f012002290398012007200229037084200229036084208d015220024198016a206a6a2903002203200229036820022903587c7c22072003547222281b208f01200720281b2004200010d103200241f8006a20970120786a290300208d0120022903880120024188016a206a6a29030010d20320052083016a2228208f0120282903002204200241f8006a206a6a2903007c2005290330220020022903787c22032000542228ad7c22002028200020045420002004511b22281b3703002005208f01200320281b3703300b2001206c6a21012006208b016a22060d000b0b209701206c6a229701209601470d0b410021010c210b209401206c6a212f02402094012802282205450d0020940128022021012005206c6c210503400240209c012001460d0020012085016a209d0120890110d003450d002001206c6a21012005208b016a22050d010c020b20940120786a22062903002104209c0129030021002001209a0120716a22282903002203209401207a6a222929030022077d3703002001200020047d2003200754ad7d370308202829030021042006209c01290300370300202920043703002001206c6a21012005208b016a22050d000b0b202f219401202f209601470d0b0b200241f8066a20786a222f209a0120776a290300370300207b209a0120796a290300370300200241f8066a206a6a222d209a01207c6a2903003703002002209a012903603703f806209a012802282229ad207d7e2204207e88a70d2d2004a72205207f4c0d2d209a0120786a2903002104209a01206a6a2903002100209a012802202101209a012903102103209a01290300210702400240024002402005450d002005101f2221450d082029450d020c010b410821212029450d010b2001202920716c6a2128410021062021210503402005200129030037030020052001206a6a29030037030820052085016a20012085016a29030037030020052089016a20012089016a290300370300200520786a200120786a2903003703002005207a6a2001207a6a290300370300200520716a2105200620696a2106200120716a22012028470d000c020b0b410021060b209a01206e6a2d00002131209a012080016a2903002122209a01206c6a2903002123209a012081016a2903002124209a012082016a290300219e01209a012083016a290300219f01209a0120716a29030021a001024002400240024020022802b403200241b0036a206a6a22052802002201470d00200120696a22282001490d44200120697422a1012028202820a101491b22a201ad2084017e22a301207e88a70d4420a301a722a1012065480d442001450d0120022802b003200120666c20a101101e22280d020c090b20022802b00321280c020b20a101101f2228450d070b200220a2013602b403200220283602b003200528020021010b2028200120666c6a220120233703502001209e01370340200120a00137033020012003370310200120003703082001200737030020012021360220200120022903f806370360200120312065473a008001200120022800f0053600810120012080016a202237030020012081016a202437030020012083016a209f01370300200120786a200437030020012085016a200636020020012086016a20293602002001207c6a202d290300370300200120796a207b290300370300200120776a202f29030037030020012087016a2088012800003600002005200528020020696a360200202e212d2093012064490d060c260b20c201222820a9016a2105202820a5016a21c20120022802b003220620aa0128020020ab016c6a212f0240024002400340202f200622016b20ac014d0d03200120ad016a22062005460d172006200520ae0110d003450d17200120af016a22062005460d012006200520ae0110d003450d01200120b0016a22062005460d022006200520ae0110d003450d020240200120b2016a22292005460d00200120b4016a21062029200520ae0110d0030d010b0b200120b3016a21010c160b200120ab016a21010c150b200120b1016a21010c140b2001202f460d140340200120ad016a22062005460d142006200520ae0110d003450d14200620a9016a2201202f470d000c150b0b4198adc4002005202a104b000b4198adc4002005202a104b000b202f41081020000b200541081020000b20a10141081020000b41022121410321010c370b410021620c070b410021620c070b410121620c070b410221620c080b410221010c130b410221010c120b410121010c110b410221010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b202820b5013a0048200241286a20a60120a4016a290300220020b6012028290300220420b60110d203200241386a202820a4016a290300220320b60120a601290300220720b60110d203200241c8006a200720b601200420b60110d20320a60120b8016a290300220420b901200420b9015620a60120b7016a290300220420b601522004501b22051b2207200420b60120051b220484500d04200241186a20ba012002290348200020b60152200320b6015271200229033020b6015272200229034020b6015272200241c8006a20a4016a2903002200200229032820022903387c7c22032000547222051b20ba01200320051b2007200410d103202820b7016a2206200241186a20a4016a2903002200370300202820022903182203370310200120bb016a220520ba012000200529030022047c2003200129035022007c22032000542205ad7c22002005200020045420002004511b22051b370300200120ba01200320051b37035020c401200120ad016a2205460d00200520c40120ae0110d003450d00200120a4016a220520ba01200529030022042006290300220020bc0186202820b8016a2205290300220320bc01888420b60120005022281b7c20012903002200200320bc018620bd0120281b7c22032000542228ad7c22002028200020045420002004511b22281b370300200120ba01200320281b370300200241f8066a20b7016a20c40120b7016a2900002203370300200241f8066a20b8016a20c40120b8016a2900002207370300200241f8066a20a4016a20c40120a4016a2900002222370300200220c40129000022233703f8062006290300210420052903002100200241f0056a20b7016a22282003370300200241f0056a20b8016a22292007370300200241f0056a20a4016a222f2022370300200220233703f005024020012802282205200120be016a2231280200470d00200520b5016a22062005490d2c200520b5017422a1012006200620a101491b22a101ad20bf017e220320bc0188a70d2c2003a722a20120c001480d2c2005450d02200120ae016a280200200520c1016c20a201101e22060d030c060b200120ae016a28020021060c030b20c20120c301470d050c0d0b20a201101f2206450d030b203120a101360200200120ae016a2006360200200120a9016a28020021050b2006200520c1016c6a220520022903f0053703102005200420bc0186200020bc01888420b60120045022061b3703082005200020bc018620bd0120061b370300200520a9016a2028290300370300200520ae016a2029290300370300200520b7016a202f290300370300200120a9016a2201200128020020b5016a36020020c20120c301470d030c0a0b41a8adc400102c000b20a20141081020000b410321620c010b410321620c010b410321010c010b410321010c000b0b20c60120636a21850120ce014188016c216620c6014180016a2163200241b0076a219a014100210520cd012101024002400340206341a47f6a280200216e206341a07f6a28020021cc01200241f0056a206341a87f6a41d80010ce031a20632d00004102460d01200241f8066a200241f0056a41d80010ce031a200241e8036a41186a2268209a0141186a290000370300200241e8036a41106a2271209a0141106a290000370300200241e8036a41086a22c501209a0141086a2900003703002002209a012900003703e8030240206e450d0020cc01101d0b200120022903e803370000200141186a2068290300370000200141106a2071290300370000200141086a20c50129030037000020634188016a2163200541016a2105200141206a2101206641f87e6a22660d000c020b0b206341086a2263208501460d0020c60120ce014188016c6a219a01034020634180016a2d00004102460d0120634188016a21010240206341246a280200450d00206341206a280200101d0b20012163209a012001470d000b0b20cf01450d010b20c601101d0b200220783602f404200220cd013602f004200220053602f80441a7edc1004116200241f0046a10e8024100216602400240024002400240024020054105742263450d0020634105752268ad4205862204422088a70d232004a722014100480d232001101f226e450d0220cd0120636a20cd01470d010c030b4101216e4100216820cd0120636a20cd01460d020b2005410574229a0141606a4105762166200241f8066a4101722105206e216320cd0121010340200241f0056a41186a200141186a290000370300200241f0056a41106a200141106a290000370300200241f0056a41086a200141086a290000370300200220012900003703f005200241f8066a200241f0056a10f6020240024020022d00f8064101470d00200241e8036a41186a200541186a290000370300200241e8036a41106a200541106a290000370300200241e8036a41086a200541086a290000370300200220052900003703e8030c010b200241e8036a41186a4200370300200241e8036a41106a4200370300200241e8036a41086a4200370300200242003703e8030b200141206a2101206320022903e803370000206341186a200241e8036a41186a290300370000206341106a200241e8036a41106a290300370000206341086a200241e8036a41086a290300370000206341206a2163209a0141606a229a010d000b206641016a216620780d020c030b200141011020000b2078450d010b20cd01101d0b2066ad2204421b88a70d0a2004420586a72263417f4c0d0a024002400240024002402063450d002063101f2205450d022066450d010c030b4101210520660d020b41002166410021630c020b206341011020000b2066410574219a014160206e6b217120052163206e2101034020632001290000370000206341186a200141186a290000370000206341106a200141106a290000370000206341086a200141086a290000370000206341206a2163200141206a2101209a0141606a229a010d000b206e20664105746a20716a41057641016a21630b2002206336028007200220663602fc06200220053602f80641aaa8c1004112200241f8066a10e80202402066450d002005101d0b2068450d09206e101d0c090b20a60120a5016a22a60120a701460d0341032121410321010c1a0b20024188086a20386a2201205729030037030020024188086a20396a2205205829030037030020024188086a203a6a22062059290300370300200220022903a8083703880802402056450d002030101d0b205b450d00200241f8066a20386a22282001290300370300200241f8066a20396a22292005290300370300200241f8066a203a6a2221200629030037030020022002290388083703f8060240200241c0036a203a6a2206280200220520022802c403470d00200241f0056a202710850320022802c40322012006280200222f6b203f20022802f005223020326a223120312030491b22304f0d00202f20306a2230202f490d1c2001203274222f20302030202f491b222fad203d7e2204203e88a70d1c2004a722302044480d1c024002402001450d0020022802c003200120456c2030101e22010d010c140b2030101f2201450d130b2002202f3602c403200220013602c0030b20022802c003200520456c6a2201205b360220200120022903f80637022c200120346a2060360200200120366a2055360200200120423703102001205f2042205a204154222f1b3703082001205d2043202f1b370300200120386a2042370300200120466a2021290300370200200120476a2029290300370200200120486a20282903003702002006200520326a360200200241f0056a2027108603200241f0056a203b6a28020022300d150b2027101d0240202a20264f0d000240202a450d00202a4188016c2101202d41206a216303400240206341046a280200450d002063280200101d0b20634188016a2163200141f87e6a22010d000b0b0240202b450d00202c101d0b0240200241c8036a2802002263450d00206341d0006c210120022802c00341206a216303400240206341046a280200450d002063280200101d0b206341d0006a2163200141b07f6a22010d000b0b20022802c403450d0320022802c003101d0c030b202a2025202a2025491b2264ad4288017e2204422088a70d072004a72201417f4c0d07024002402001450d002001101f22050d01200141081020000b410821050b41002165200241003602b803200220643602b403200220053602b0032064450d004188012166202e202a4188016c22676a2168410121694108216a200241c0036a41086a216b41d000216c419f04216d418001216e418802216f4190022170413021714190032172419803217341e07b217441a0042175419804217641f80021774118217841f00021794110217a200241f8066a41106a217b41e800217c4230217d4220217e417f217f41d80021800141c80021810141c000218201413821830142880121840141282185014124218601418401218701200241f3056a218801412021890141e000218a0141b07f218b0141f87e218c014200218d014201218e01427f218f014148219001414021910141b87f2192014100219301410221210c150b410821a401200241c0036a41086a2802002201450d0041d00021a50120022802c00322a601200141d0006c6a21a701412c21a801412821a901200241b0036a41086a21aa0141880121ab01419f0421ac0141e00021ad01412021ae0141e80121af0141f00221b00141900221b10141f80321b20141980321b30141a00421b401410121b501420021b601411821b701411021b801420121b901427f21ba0141d80021bb01422021bc0142808080807021bd01412421be01423021bf01410021c001413021c101410321210c150b20022802d00321c50120022902b403210320022802b00321c6010240200241d0036a20a4016a2802002201450d0020014188016c210520c50141206a210103400240200141046a280200450d002001280200101d0b20014188016a2101200541f87e6a22050d000b0b024020022802d403450d0020c501101d0b0240200241c8036a2802002201450d00200141d0006c210520022802c00341206a210103400240200141046a280200450d002001280200101d0b200141d0006a2101200541b07f6a22050d000b0b024020022802c403450d0020022802c003101d0b20c601450d00200220c6013602a808200220033702ac08200241e8036a41086a22014200370300200242003703e80341a7edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004200241f0046a411041f8b3c200410041001002417f460d01200242103702f4052002200241f0046a3602f005200241f8066a200241f0056a105e20022802f8062229450d1120022802fc0621c70120024180076a28020041057422c8010d020c030b420021c901200241e8036a41086a22634200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200241f0046a411041f8b3c200410041001002417f460d032002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022263417f460d0e2063410f4d0d0e20022903f80621c9010c030b41012129410021c701410041057422c801450d010b202921010340410f101f2205450d05200541076a41002900e9d841370000200541002900e2d8413700002005410f412f101e2205450d062005200129000037000f200541276a200141186a22ca012900003700002005411f6a200141106a2206290000370000200541176a200141086a22cb01290000370000200241e8036a41086a22c5014200370300200242003703e8032005412f200241e8036a1001200241f0056a41086a22cc0120c501290300370300200220022903e8033703f005200241f0056a411010092005101d4112101f2205450d07200541106a41002f0087d74122283b0000200541086a41002900ffd6412204370000200541002900f7d6412200370000200541124132101e2205450d08200520012900003700122005412a6a20ca01290000370000200541226a20062900003700002005411a6a20cb0129000037000020c5014200370300200242003703e80320054132200241e8036a100120cc0120c501290300370300200220022903e8033703f005410021cc010240200241f0056a411041f8b3c200410041001002417f460d00200241003602f806200241f0056a4110200241f8066a41044100100241016a41044d0d0520022802f80621cd01200241f0056a41101009410121cc010b2005101d024020cd01410020cc011b22cc0141014d0d004112101f2205450d0a200541106a20283b0000200541086a200437000020052000370000200541124132101e2205450d0b200520012900003700122005412a6a20ca01290000370000200541226a20062900003700002005411a6a20cb0129000037000020c5014200370300200242003703e80320054132200241e8036a1001200241f0046a41086a20c501290300370300200220022903e8033703f004200220cc01417f6a3602f806200241f0046a4110200241f8066a410410032005101d0b200141206a210120c80141606a22c8010d000b0b2003422088a721ce01024020c701450d002029101d0b20ce01450d0c2003a721cf0141880121d00120c60120ce014188016c6a21d101410821c80120c60141086a29030021d20120c60129030021c901411021cd01200241f8066a41106a21d30141f80021d401411821cc0141f00021d50141e80021d601423021d701422021d801417f21d901413021ca01412821cb01200241f8066a41286a21da012002419c076a21db01412021c501200241f8066a41206a21dc01410f21dd01410721de01410021df01412f21e001412721e101411f21e201411721e301420021e401420121e501410121c701415021e60120c60121e701410421210c110b200241e8036a41086a22634200370300200242003703e80341c7eec1004115200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200241003602f806200241f0046a4110200241f8066a41044100100241016a41044d0d0a20023502f80621040c010b423c21040b200241086a20c90142002004420010d203200241e8036a41086a22634200370300200242003703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200242003703800720024289f48bdcc4002002290308428094ebdc038020022903104200521b3703f806200241f0046a4110200241f8066a411010030c120b102e000b41df88c0004133103a000b410f41011020000b412f41011020000b411241011020000b413241011020000b411241011020000b413241011020000b41df88c0004133103a000b203041081020000b41df88c0004133103a000b41e882c40041004100104b000b41df88c0004133103a000b41012121410321010c030b410321010c020b410321010c010b410321010c000b0b200241f8066a10800120022802f806210520022802fc06216602402002280280072263450d002063410574220141057522c501ad42287e2204422088a70d012004a7229a014100480d01209a01101f2268450d02200520016a216e2063410574219a0120682163200521010340200141086a2900002104200141106a290000210020012900002103206341186a200141186a290000370000206341106a2000370000206341086a200437000020632003370000206341206a4201370300206341286a2163200141206a2101209a0141606a229a010d000b206e20056b41606a41057641016a216e2066450d040c030b410021c501410821684100216e20660d020c030b1021000b209a0141081020000b2005101d0b2002410e3602ec03200241988ec1003602e803200241f8066a41a68ec100200241e8036a108101410021630240024020022802f8062201200228028007229a0141f8b3c200410041001002417f460d00200241003602e8032001209a01200241e8036a41044100100241016a41044d0d0120022802e80321630b024020022802fc06450d002001101d0b200241f0056a206310b30220022802f0052171024002400240206e20022802f805470d0020712068460d01417f219a0120682163207121010340209a0141016a229a01206e4f0d0220632001412010d0030d01200141206a2105206341206a2166206341286a2163200141286a210120662903002005290300510d000b0b2002206e36028007200220c5013602fc06200220683602f806200241f8066a42004200200410a80120022802f405450d012071101d200241d0086a24000f0b024020022802f405450d002071101d0b20c501450d002068101d0b200241d0086a24000f0b41df88c0004133103a000bb10803027f017e107f230041f0036b22022400200241086a200110d50102400240024002400240024002400240024002402002280208450d00200228020c2203ad4288017e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241f0036a24000f0b4108210620030d030b4100210f4100210d0c030b102e000b200541081020000b200241b0026a4104722107200141086a2108200241306a41186a2109200241306a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f200828020021102002410036029003200841002001280200200f20024190036a410420101002220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d00200228029003211120024190036a200110a301200228029003410f460d00200241b0026a20024190036a41e00010ce031a20094200370300200a4200370300200241306a41086a2210420037030020024200370330200841002001280200200e280200200241306a412020082802001002220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d0020024190016a41186a200929030037030020024190016a41106a200a29030037030020024190016a41086a2010290300370300200220022903303703900120022802b0022110200241b4016a200741dc0010ce031a201121120c020b200241b0026a108c010b410f21100b20024190036a200241b4016a41dc0010ce031a20024190026a41186a220e20024190016a41186a29030037030020024190026a41106a221120024190016a41106a29030037030020024190026a41086a221320024190016a41086a2903003703002002200229039001370390022010410f460d02200541016a210f200241306a20024190036a41dc0010ce031a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903900237031002402005200d470d00200b200f200f200b491b220dad4288017e2204422088a70d042004a722134100480d0402402005450d002006200c2013101e22060d010c060b2013101f2206450d050b2006200c6a22052010360200200541046a200241306a41dc0010ce031a200541e0006a2012360200200541fc006a2014290300370200200541f4006a200e290300370200200541ec006a2011290300370200200541e4006a2002290310370200200b41026a210b200c4188016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241f0036a24000f0b2000410036020002402005450d002006210503402005103c20054188016a2105200c41f87e6a220c0d000b0b0240200d450d002006101d0b200241f0036a24000f0b1021000b201341081020000bf30202027f037e230041306b22022400024002404113101f2203450d002003410f6a41002800f99b40360000200341086a41002900f29b40370000200341002900ea9b40370000200341134126101e2203450d0120032001360013200241206a41086a220142003703002002420037032020034117200241206a1001200241086a2001290300370300200220022903203703000240024002402002411041f8b3c200410041001002417f460d00200220023602102002411036021420024200370328200242003703202002410020024110200241206a41104100100222012001417f461b2201411020014110491b3602182001410f4d0d02200241286a290300210420022903202105200241206a200241106a105e20022802202201450d0220022902242106200020043703082000200537030020002006370214200020013602100c010b200041003602100b2003101d200241306a24000f0b41df88c0004133103a000b411341011020000b412641011020000bc90401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d0020004188016c2104200241086a22052802002100200228020421060340200341e0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000101e22060d020c070b200228020021060c020b2000101f2206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a20073600002003200210b201024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000101e22080d020c080b200228020021080c020b2000101f2208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341ec006a290000370000200741106a200341f4006a290000370000200741186a200341fc006a2900003700002007200341e4006a29000037000020034188016a2103200441f87e6a22040d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1021000b200041011020000b200041011020000b2008101d0b200241106a24000be90504027f017e017f047e230041206b220324000240024002404118101f2204450d00200441106a41002900e9ba40370000200441086a41002900e1ba40370000200441002900d9ba40370000200441184138101e2204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341106a41086a220642003703002003420037031020044138200341106a1001200341086a2006290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022206417f460d022006410f4d0d02200341186a2903002107200329031021052004101d411421064114101f2204450d010c050b420021072004101d411421064114101f22040d040b200641011020000b41df88c0004133103a000b411841011020000b413841011020000b200441106a41002800d5ba40360000200441086a41002900cdba40370000200441002900c5ba403700000240200420064134101e2204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a29000037000042002108200341106a41086a220642003703002003420037031020044134200341106a1001200341086a2006290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022206417f460d022006410f4d0d02200341186a2903002109200329031021080c010b420021090b2004101d20002008200120052005200156200720025620072002511b22041b22017c220a20092002200720041b22027c200a200854ad7c10e2012000200520017d200720027d2005200154ad7d10e701200341206a24000f0b41df88c0004133103a000b413441011020000bc30b03027f017e047f23004180026b22052400200541086a220642003703002005420037030041d09cc000411920051001200541f0016a41086a2006290300370300200520052903003703f00141002106024002400240024002400240024002400240024002400240024002400240200541f0016a411041f8b3c200410041001002417f460d0020054100360278200541f0016a4110200541f8006a41044100100241016a41044d0d01024020052802782206450d0020052006417f6a1096012005280208410f460d01200541f8006a200541f80010ce031a20052903782107200541f8006a41086a103c20072001580d01200041b09dc00036020420004101360200200041086a41c7003602002002103c20054180026a24000f0b410021060b200541086a220842003703002005420037030041d09cc000411920051001200541f0016a41086a2008290300370300200520052903003703f0012005200641016a360278200541f0016a4110200541f8006a4104100320052001370378200541f8006a41086a200241e00010ce032109200520043703e001200520033a00e801411a101f2202450d01200241186a41002f00e89b403b0000200241106a41002900e09b40370000200241086a41002900d89b40370000200241002900d09b403700002002411a4134101e2208450d022008200636001a200541086a22024200370300200542003703002008411e20051001200541f0016a41086a2002290300370300200520052903003703f0012005410036020820054201370300200529037821014108101f220a450d032005410836020420022002280200220b41086a3602002005200a360200200a200b6a20013700002009200510b20102400240024002400240024002400240024002400240200541e8016a2d000022024101460d0020024102470d012005280204200541086a2802002202470d03200241016a220a2002490d162002410174220b200a200a200b491b220b4100480d162002450d0720052802002002200b101e220a450d080c130b2005280204200541086a2802002202470d01200241016a220a2002490d152002410174220b200a200a200b491b220b4100480d152002450d0420052802002002200b101e220a450d050c100b2005280204200541086a2802002202470d02200241016a220a2002490d142002410174220b200a200a200b491b220b4100480d142002450d0720052802002002200b101e220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b101f220a0d0b0b200b41011020000b200b101f220a0d0b0b200b41011020000b200b101f220a0d050b200b41011020000b41df88c0004133103a000b411a41011020000b413441011020000b410841011020000b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41003a00000c040b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41013a00000c020b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41023a00000b200541e0016a29030021010240024002402005280204220a200541086a28020022026b41084f0d00200241086a220b2002490d03200a4101742202200b200b2002491b22024100480d03200a450d012005280200200a2002101e220a450d020c040b2005280200210a0c040b2002101f220a0d020b200241011020000b1021000b200520023602042005200a360200200541086a28020021020b200541086a220b200241086a360200200a20026a200137000020052802042102200541f0016a41102005280200220a200b280200100302402002450d00200a101d0b2008101d2009103c20054184016a200636020020054181016a20033a0000200541f8006a41086a41023a0000200541053a0078200541f8006a108b01200041003602002000200636020420054180026a24000b9a0604027f017e047f017e230041a0036b220224000240024002400240411a101f2203450d00200341186a41002f00e89b403b0000200341106a41002900e09b40370000200341086a41002900d89b40370000200341002900d09b403700002003411a4134101e2203450d012003200136001a200241e0016a41086a22014200370300200242003703e0012003411e200241e0016a1001200241086a2001290300370300200220022903e0013703000240024002402002411041f8b3c200410041001002417f460d002002200236021020024110360214200242003703e0012002410020024110200241e0016a41084100100222012001417f461b2201410820014108491b360218200141074d0d0620022903e0012104200241e0016a200241106a10a30120022802e0012101200241c4026a200241e0016a41047241dc0010ce031a2001410f460d0620024184016a200241c4026a41dc0010ce031a20022001360220200241206a41047220024184016a41dc0010ce032105200241003a00e00120022802102002280214200241e0016a4101200241186a22012802001002210620012001280200200641016a41014b22066a22073602002006450d0220022d00e001220641034f0d02200242003703e001200241106a41086a2208410020022802102002280214200241e0016a41082007100222012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903e001210920022802202101200241e0016a200541dc0010ce031a2002200241236a2800003600c702200220022800203602c4022001410f460d06200241206a200241e0016a41dc0010ce031a200220022800c70236008701200220022802c4023602840120002001360208200020043703002000410c6a200241206a41dc0010ce031a200041f0006a20063a0000200041e8006a20093702002000200228028401360071200041f4006a2002280087013600000c010b2000410f3602080b2003101d200241a0036a24000f0b200241206a103c41df88c0004133103a000b411a41011020000b413441011020000b200241206a103c0b41df88c0004133103a000bec0603027f017e0b7f23004190036b22022400200241086a200110d50102400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42e8007e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b2000410036020020024190036a24000f0b4108210620030d030b4100210d4100210b0c030b102e000b200541081020000b200241c8016a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00a8022001280200200141046a220c280200200241a8026a410120052802001002210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00a802220d4101460d00200d0d06200241a8026a200241106a41dc0010ce031a410f210c0c010b200241a8026a200110a30120022802a802410f460d04200241c8016a200241a8026a41e00010ce031a200c280200210d2005280200210c2002410036028c03200541002001280200200d2002418c036a4104200c1002220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d03200228028c03210e20022802c801210c200241ec006a200741dc0010ce031a200241a8026a200241ec006a41dc0010ce031a200c410f460d05200241106a200241a8026a41dc0010ce031a200241a8026a200241106a41dc0010ce031a200c4110460d060b200a41016a210d200241c8016a200241a8026a41dc0010ce031a0240200a200b470d002008200d200d2008491b220bad42e8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f101e22060d010c090b200f101f2206450d080b200620096a220a200c360200200a41046a200241c8016a41dc0010ce031a200a41e0006a200e360200200841026a2108200941e8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d36020020024190036a24000f0b200241c8016a108c010b200241a8026a200241ec006a41dc0010ce031a0b200241a8026a200241106a41dc0010ce031a0b200041003602000240200a450d0020062105034002402005280200410f460d002005103c0b200541e8006a2105200941987f6a22090d000b0b0240200b450d002006101d0b20024190036a24000f0b1021000b200f41081020000bc382010d027f027e067f017e0a7f017e037f017e017f017e297f027e337f230041b0026b2201240020014190026a41086a220242003703002001420037039002419efcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035022034200510d044200210420002003824200520d120c010b42002104200042e807824200520d110b20014190026a41086a22022004370300200120043703900241b2fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f001200141f0016a411041f8b3c200410041001002417f460d1020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d0120012802502202450d104108210520014190026a41086a22064200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200629030037030020012001290390023703f0014100210602400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a40120012802502205450d06200141d8006a2802002106200128025421070c010b410021070b4200210320014190026a41086a22084200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a2209200829030037030020012001290390023703f001200141d0006a200141f0016a10600240200128025c220a450d00200128025822082001290360220b422088a76b20066a2109200129035021030240200ba7450d00200a101d0b20092002490d070c060b200842003703002001420037039002418cb9c000410d20014190026a10012009200829030037030020012001290390023703f001410021080240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d04200129035021030b200620024f0d050c060b41df88c0004133103a000b41df88c0004133103a000b41f0a8c300102c000b41df88c0004133103a000b41df88c0004133103a000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014190026a41086a22024200370300200142003703900241dafcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035020037c21030c010b420520037c21030b20014190026a41086a220242003703002001420037039002419efcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d022001290350220b4200520d0141a88ec300102c000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d002005101d0b20032000520d0c4108210c20014190026a41086a22024200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210d02400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a4012001280250220c450d07200141d8006a280200210d2001280254210e0c010b4100210e0b20014190026a41086a22024200370300200142003703900241b2fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210f0240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d032001280250210f0b4200210320014190026a41086a220242003703002001420037039002418cb9c000410d20014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035021030b0240024002400240200d41286c2202450d00200c41206a2903002003520d00200141f0016a41186a2206200c41186a290300370300200141f0016a41106a2208200c41106a290300370300200141f0016a41086a2205200c41086a2903003703002001200c2903003703f0014120101f2210450d0b201020012903f001370000201041186a2006290300370000201041106a2008290300370000201041086a2005290300370000200c20026a200c41286a2202460d02200d41286c41586a21054120210841012106410121110340200241206a2903002003520d04200141f0016a41186a2207200241186a290300370300200141f0016a41106a220a200241106a290300370300200141f0016a41086a2209200241086a290300370300200120022903003703f00102400240024020112006470d00200641016a22122006490d2a20064101742213201220122013491b2213ad420586220b422088a70d2a200ba722124100480d2a2006450d01201020064105742012101e22100d020c0c0b200621130c010b2012101f2210450d0a0b200241286a2102201020086a220620012903f001370000200641186a2007290300370000200641106a200a290300370000200641086a2009290300370000200841206a2108201141016a211120132106200541586a22050d000c020b0b4101211041002111410021130b200f200d20116b22064d0d0a0c0b0b4101211141012113200f200d41016b22064b0d0a0c090b20062113200f200d20116b22064b0d090c080b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b201241011020000b41df88c0004133103a000b4188a9c30020082006104b000b412041011020000b2013450d012010101d0c010b20014190026a41086a22024200370300200142003703900241eefcc000411c20014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d022001290350210b0c010b42e807210b0b20014190026a41086a22024200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014100360258200142013703504108101f2202450d01200142888080808001370254200120023602502002200b20037c370000200241084110101e2202450d0220014290808080c0013702542002200f20066b221436000820012002360250200120113602900220014190026a200141d0006a10620240024002402011450d002011410574210a4100200141d0006a41086a28020022066b210520012802502109200128025421072010210203400240200720056a411f4b0d00200641206a22082006490d2320074101742212200820082012491b22084100480d23024002402007450d00200920072008101e22090d010c060b2008101f2209450d050b200821070b200920066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200a41606a220a0d000b200141d8006a200636020020012007360254200120093602500c010b200141d8006a280200210620012802542107200128025021090b200141f0016a411020092006100302402007450d002009101d0b02402013450d002010101d0b20014190026a41086a220242003703002001420037039002418afdc000410e20014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210602400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a105e20012802502212450d0620012802542115200141d8006a280200220641ffffff3f712213450d010c070b4101211241002115410041ffffff3f7122130d060b410821100c060b200841011020000b41df88c0004133103a000b410841011020000b411041011020000b41df88c0004133103a000b20134104742202101f22100d00200241081020000b4100210202402012201220064105746a460d002006410574220841606a2107200141086a21052010210220122106034020012006109a01200129030021032002200529030037030820022003370300200241106a2102200641206a2106200841606a22080d000b200741057641016a21020b20014190026a41086a2206420037030020014200370390024198fdc000411820014190026a1001200141d0006a41086a2006290300370300200120012903900237035020014100360298022001420137039002200120023602f001200141f0016a20014190026a10620240024020024104742207450d0020062802002102200128029002210a2001280294022105201021060340200641086a29030021032006290300210b0240024002400240200520026b41104f0d00200241106a22082002490d1f20054101742209200820082009491b22094100480d1f2005450d01200a20052009101e220a0d020c0a0b200241106a21080c020b2009101f220a450d080b200921050b200641106a2106200a20026a220220033700082002200b37000020082102200741706a22070d000b20014198026a200836020020012005360294022001200a360290020c010b200628020021082001280294022105200128029002210a0b200141d0006a4110200a2008100302402005450d00200a101d0b02402013450d002010101d0b20014190026a41086a22024200370300200142003703900241b0fdc000411220014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d0a200128025021050c010b410221050b200141a8026a4200370300200141a0026a420037030020014198026a42003703002001420037039002200520146a220aad42307e2203422088a70d172003a72202417f4c0d17024002402002450d002002101f2209450d0d200921020c010b41082109410821020b200141d0006a41186a220620014190026a41186a290300370300200141d0006a41106a220820014190026a41106a290300370300200141d0006a41086a20014190026a41086a2903003703002001200129039002370350024002400240200a4102490d002011200f6a20056a417f6a200d6b21050340200141f0016a41186a2006290300370300200141f0016a41106a2008290300370300200141f0016a41086a200141d0006a41086a2207290300370300200120012903503703f0012002420037030820024200370300200729030021032008290300210b20012903502116200241286a2006290300370300200241206a200b370300200241186a2003370300200241106a2016370300200241306a21022005417f6a22050d000b200a417f6a21060c010b41002106200a450d010b200242003703082002420037030020022001290350370310200241186a200141d8006a290300370300200241206a200141e0006a290300370300200241286a200141d0006a41186a290300370300200641016a21060b200120063602582001200a3602542001200936025020014190026a41086a22024200370300200142003703900241c2fdc000411320014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a1085020240200a450d002009101d0b200141d0006a41086a2014360200200141023a0054200141063a0050200141d0006a108b012015450d002012101d200e0d010c020b200e450d010b200c101d0b20014190026a41086a22022004370300200120043703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f001200141d0006a200141f0016a1060200128025c2217450d172001280260211820012903502000520d1620014190026a41086a2202420037030020014200370390024198fdc000411820014190026a1001200141d0006a41086a20022903003703002001200129039002370350200141d0006a4110100920024200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d002001200141f0016a3602900220014110360294022001420037035020014100200141f0016a4110200141d0006a41084100100222022002417f461b2202410820024108491b220636029802200241074d0d05200129035021042001410036025020014198026a4100200141f0016a4110200141d0006a41042006100222022002417f461b22024104200241044922021b20066a36020020020d0520012802502102200141d0006a20014190026a105e20012802502219450d052001290254211a200141f0016a41101009200120023602c801200120043703c00120012802c801211b410821094200211620014190026a41086a22024200370300200142003703900241c2fdc000411320014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10860220012802502209450d0a20012902542116200141f0016a411010090b20014190026a41086a220242003703002001420037039002418cb9c000410d20014190026a1001200141f0016a41086a2206200229030037030020012001290390023703f0014200210b0240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d042001290350210b0b20024200370300200142003703900241dafcc000411420014190026a10012006200229030037030020012001290390023703f001200141f0016a411041f8b3c200410041001002417f460d0120014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d042001290350211c0c020b02402018450d002017101d0b41ae9fc100410f100a41a3fec0004135100a200141b0026a24000f0b4205211c0b4200210420014190026a41086a220242003703002001420037039002418efec000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d002001420037035820014200370350200141f0016a4110200141d0006a4110410010022202417f460d072002410f4d0d07200141d8006a2903002104200129035021000c010b420921000b20092016422088a7221d41306c6a2102024002400240201b450d00201b417f6a211041002108024020092002460d002009201d41306c6a220641506a2202290300200641586a29030084500d02200141a8026a200641786a290000370300200141a0026a200641706a29000037030020014198026a200641686a2900003703002001200641606a29000037039002410121080b410021120c020b4100211241002110410021080c010b410121120b200141d9006a20014190026a41086a290300370000200141e1006a20014190026a41106a290300370000200141e9006a20014190026a41186a290300370000200120083a005020012001290390023700514101211e200141d0006a4101722106024002402008450d00200620002004109401200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014120101f221e450d09201e20012903f001370000201e41186a200141f0016a41186a2206290300370000201e41106a200141f0016a41106a2208290300370000201e41086a200141f0016a41086a2205290300370000200141d0006a4101722107410221114120210a4101210d4101211f410020106b220c41016a4101460d010340201241ff01710d0220092002460d02200241506a2210290300200241586a29030084500d022006200241786a2900003703002008200241706a2900003703002005200241686a2900003703002001200241606a2900003703f001200720012903f001370000200741086a2005290300370000200741106a2008290300370000200741186a2006290300370000200141013a005020072000200410940120014190026a41186a2202200629030037030020014190026a41106a2212200829030037030020014190026a41086a22132005290300370300200120012903f0013703900220062002290300370300200820122903003703002005201329030037030020012001290390023703f0010240200d201f470d00200d41016a2202200d490d1d2011200220022011491b221fad4205862203422088a70d1d2003a722024100480d1d0240200d450d00201e200a2002101e221e0d010c080b2002101f221e450d070b201e200a6a220220012903f001370000200241186a2006290300370000200241106a2008290300370000200241086a2005290300370000201141026a2111200a41206a210a4100211220102102200c200d41016a220d6a4101470d000c020b0b200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014100210d4100211f0b4108212020014190026a41086a22024200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100212102400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a40120012802502220450d0a200141d8006a2802002111200128025421210c010b410021110b200141013602502020201141286c6a210e024002400240024002400240201a422088a72205450d00410021224100212302402005200e20206b41286e2202200220054b1b2202450d00200241057422064100480d202006101f2208450d1220012008360250200221230b20202102200521082001280250222421060340200e20026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000202241046a212220064180016a2106200241a0016a21022008417c6a22080d000c060b0b4100212320012802502124410021220c040b200e2002460d032020201141286c6a2112410121070240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082007220a460d01200a41016a2107200641206a21062012200241286a2202470d000b0b2022200a6a21220c030b202241017221220c020b202241027221220c010b202241037221220b201c200b7c210b201e200d4105746a2125024002400240024002402005450d00200e2020460d012005417f732106201141286c2108202021020340200141f0016a41186a200241186a290300370300200141f0016a41106a200241106a290300370300200141f0016a41086a200241086a290300370300200120022903003703f001200641016a2206450d03200241286a2102200841586a22080d000c020b0b200e2020460d00200141d0006a41186a202041186a290300370300200141d0006a41106a202041106a290300370300200141d0006a41086a202041086a29030037030020012020290300370350202041286a2106202029032021040c020b0240201e2025460d00200141f0016a41186a201e41186a2202290000370300200141f0016a41106a201e41106a2206290000370300200141f0016a41086a201e41086a22082900003703002001201e2900003703f0012008290000210420062900002100201e290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002201e41206a210841022105200e2106200b21040c030b410021114108210c02402021450d002020101d0b410021070c100b200241206a2903002104200141d0006a41186a200141f0016a41186a290300370300200141d0006a41106a200141f0016a41106a290300370300200141d0006a41086a200141f0016a41086a290300370300200120012903f001370350200241286a21060b20014190026a41186a200141d0006a41186a29030037030020014190026a41106a200141d0006a41106a29030037030020014190026a41086a200141d0006a41086a290300370300200120012903503703900241002105201e21080b417f417f200e20066b41286d2202202520086b4105766a220720072002491b220241016a220720072002491b2211ad42287e2200422088a70d182000a72202417f4c0d18024002402002450d002002101f220c450d0c200c21260c010b4108210c410821260b200c200129039002370300200c41186a20014190026a41186a290300370300200c41106a20014190026a41106a290300370300200c41086a20014190026a41086a29030037030020262004370320024002402005450d0020082025460d01200841086a2900002104200841106a29000021002008290000210320014190026a41186a200841186a29000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c100b02402006200e460d00200141d0006a41186a200641186a2202290300370300200141d0006a41106a200641106a2205290300370300200141d0006a41086a200641086a22072903003703002001200629030037035020014190026a41086a200729030037030020014190026a41106a200529030037030020014190026a41186a20022903003703002001200629030037039002200641286a2102200629032021044100210f0c110b20082025460d00200141f0016a41186a200841186a2202290000370300200141f0016a41106a200841106a2205290000370300200141f0016a41086a200841086a2207290000370300200120082900003703f00120072900002104200529000021002008290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c0f0b4101210720210d100c110b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241011020000b200941011020000b41df88c0004133103a000b41df88c0004133103a000b412041011020000b41df88c0004133103a000b41df88c0004133103a000b200241081020000b200641011020000b200241081020000b410021020c090b4102210f200b2104200621020b4102210a41022106412821050340200141d0006a41186a221220014190026a41186a2214290300370300200141d0006a41106a221020014190026a41106a2215290300370300200141d0006a41086a221320014190026a41086a22272903003703002001200129039002370350024020062207417f6a22062011470d002006417f417f200e20026b41286d2226202520086b4105766a221120112026491b222641016a221120112026491b6a22262006490d0b200a20262026200a491b2211ad42287e2200422088a70d0b2000a722064100480d0b0240024020074101470d002006101f220c0d010c060b200c20052006101e220c450d050b200c21260b202620056a22062001290350370300200641186a2012290300370300200641106a2010290300370300200641086a2013290300370300200641206a2004370300024002400240024002400240200f41ff017122064101460d0020064102470d0120082025460d05200841086a2900002104200841106a2900002100200829000021032014200841186a29000037030020152000370300202720043703002001200337039002200841206a2108420121004102210f0c020b200e2002460d042014200241186a2903003703002015200241106a2903003703002027200241086a290300370300200120022903003703900220022903202104420121004101210f200241286a21020c030b200e2002470d014102210f024020082025460d00200141f0016a41186a200841186a2206290000370300200141f0016a41106a200841106a2212290000370300200141f0016a41086a200841086a2210290000370300200120082900003703f0012010290000210420122900002100200829000021032014200629000037030020152000370300202720043703002001200337039002200841206a2108420121000c010b420021000c020b200b21040c010b2012200241186a22062903003703002010200241106a22122903003703002013200241086a221029030037030020012002290300370350201029030021042012290300210020022903002103201420062903003703002015200037030020272004370300200120033703900220022903202104420121004100210f200241286a21020b200a41026a210a200741016a2106200541286a210520004200520d010b0b2021450d010b2020101d0b0240200741144b0d0041012128200741014d0d03417f21292007417f6a212a4128212b2026200741286c6a212c4102212d4120212e4118212f41102130410821314103213241f0002133415821344178213541702136416821374160213841c80021394100213a0c040b2007410176223bad42287e2204422088a70d062004a72202417f4c0d064108213c024002402002450d002002101f223d450d03203d213e0c010b4108213d4108213e0b4158213f202641586a2140202641a87f6a21414100214241042143417f21444101214542032146422021474103214841022149417d214a4128214b4178214c4120214d4118214e4110214f417e2150417421514164215241502153410521544109215541f000215641c800215741c0002158413821594130215a410a215b4104215c4100215d4100215e2007215f4101213a0c040b200641081020000b200241081020000b410021020c020b410121020c010b410121020b0240034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b20012007360258200120113602542001200c36025020014190026a41086a22654200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a2202206529030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a10870202402011450d00200c101d0b20654200370300200142003703900241d5fdc000411220014190026a10012002206529030037030020012001290390023703f00141002166024002400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a105e20012802502267450d02200141d8006a2802002168200128025421660c010b41012167410021680b200141d8016a4200370300200141d0016a4200370300200141c8016a4200370300200142003703c0012068ad2204421b88a70d172004420586a72265417f4c0d17024002402065450d002065101f22690d01206541011020000b410121690b200141d0006a41186a2206200141c0016a41186a290300370300200141d0006a41106a2208200141c0016a41106a290300370300200141d0006a41086a2205200141c0016a41086a290300370300200120012903c00137035002400240024020684102490d002068417f6a210220692165034020652001290350370000206541186a2006290300370000206541106a2008290300370000206541086a2005290300370000206541206a21652002417f6a22020d000b2068417f6a216a0c010b4100216a206921652068450d010b20652001290350370000206541186a200141d0006a41186a290300370000206541106a200141d0006a41106a290300370000206541086a200141d0006a41086a290300370000206a41016a216a0b2009201d41306c6a21652016a7216b4100216c4158216d4150216e4178216f4118217020014190026a41186a2171417021724110217320014190026a41106a2174416821754108217620014190026a41086a217741602178410121794105217a201b450d024102213a0c090b41df88c0004133103a000b02400240024002400240024002400240024002400240203a0e0400010203030b2007202a220220296a222a490d0402402007202a6b2206202d490d0020262002202b6c6a2202202e6a22052903002026202a202b6c6a2208202e6a220a29030022045a0d00200141f0016a202f6a22122008202f6a2210290300370300200141f0016a20306a2213200820306a220f290300370300200141f0016a20316a220e200820316a2214290300370300200120082903003703f001200820022903003703002014200220316a290300370300200f200220306a29030037030020102002202f6a290300370300200a2005290300370300024020062032490d00200820336a29030020045a0d0041022108202c210503402005220220346a2002290300370300200220356a2002202e6a290300370300200220366a2002202f6a290300370300200220376a200220306a290300370300200220386a200220316a290300370300200820286a220820064f0d012002202b6a2105200220396a2903002004540d000b0b200220012903f001370300200220043703202002202f6a2012290300370300200220306a2013290300370300200220316a200e2903003703000b202c20346a212c202a0d090c0e0b205f21604100215f41012161206020446a2210450d1502400240024002400240024020262010204b6c6a204d6a29030020262060204b6c22026a20536a29030022045a0d002041206020546c20487422056a2102034020102045460d02201020446a21102004200229030022005421062002203f6a21022000210420060d000c030b0b206020506a2105204120026a21064100215f41002102034020052002460d05200220456a21022004200629030022005a21082006203f6a21062000210420080d000b200220456a2161206020026b20446a2210450d030c020b410021100b20602010490d08206020074b0d0a0240206020106b22612045762208450d00204020056a210220262010204b6c6a21060340200141d0006a204d6a22052006204d6a220a290300370300200141d0006a204e6a22122006204e6a2213290300370300200141d0006a204f6a220f2006204f6a220e290300370300200141d0006a203c6a22142006203c6a2215290300370300200120062903003703502002203c6a222729030021042002204f6a222529030021002002204e6a222029030021032002290300210b200a2002204d6a222129030037030020132003370300200e2000370300201520043703002006200b37030020212005290300370300202020122903003703002025200f29030037030020272014290300370300200220012903503703002002203f6a21022006204b6a2106200820446a22080d000b0b2010450d010b206120554b0d00206020074b0d0820262010204b6c6a2162410021630c1c0b2010215f205d205e460d190c1a0b20602161205d205e460d160c170b20652009460d012065206d6a21022065206e6a2265290300200229030084500d01201b2079460d0b2079201b6b2102034020092065460d022065206d6a21062065206e6a2265290300200629030084500d02200220796a22020d000c0b0b0b20652009460d00024003402065206d6a29030021042065206e6a2202290300210020712065206f6a2903003703002074206520726a2903003703002077206520756a2903003703002001206520786a290300370390022000200484500d01200141d0006a20706a22062071290300370300200141d0006a20736a22082074290300370300200141d0006a20766a220520772903003703002001200129039002370350200141e0016a200141d0006a10fb01200141c0016a20706a220a2071290300370300200141c0016a20736a22122074290300370300200141c0016a20766a2210207729030037030020012001290390023703c001024020012802e0012079460d002002216520092002470d010c030b0b200141f0016a20766a22132010290300370300200141f0016a20736a22102012290300370300200141f0016a20706a2212200a290300370300200120012903c0013703f001200141e0016a20766a2802002102200141306a20706a220a2012290300370300200141306a20736a22122010290300370300200141306a20766a22102013290300370300200120012903f001370330200141106a20706a2213200a290300370300200141106a20736a220a2012290300370300200141106a20766a2212201029030037030020012001290330370310200620132903003703002008200a29030037030020052012290300370300200120012903103703500240206a20024d0d002065206e6a216520692002207a746a22022001290350370000200220706a2006290300370000200220736a2008290300370000200220766a2005290300370000206c20796a216c4100211b41000d0a4103213a0c110b4198a9c3002002206a104b000b200141306a41186a200141f0016a41186a290300370300200141306a41106a200141f0016a41106a290300370300200141306a41086a200141f0016a41086a290300370300200120012903f0013703300b0240206b450d002009101d0b024002400240206a206841ffffff3f7122652065206a4b1b2208450d0020672165206921024100214d0340024020652002460d0020652002412010d003450d004116101f2206450d032006410e6a41002900d7d940370000200641086a41002900d1d940370000200641002900c9d940370000200641164136101e2206450d04200620652900003700162006412e6a206541186a290000370000200641266a206541106a2900003700002006411e6a206541086a29000037000020014190026a41086a2205420037030020014200370390022006413620014190026a1001200141d0006a41086a20052903003703002001200129039002370350200141d0006a411010092006101d0b206541206a2165200241206a2102204d41016a224d2008490d000b0b2069206a4105746a2165206a21050240024002400240024002400240206a4104490d00200141d0006a41206a213c20014190016a214f200141b0016a214e200141d0016a213f200141e8006a2106200141e0006a214d200141d8006a210820652102206a2105034020064200370300204d420037030020084200370300200142003703500240203c2002460d00200241606a200141d0006a412010d0030d030b20064200370300204d420037030020084200370300200142003703500240204f2002460d00200241406a200141d0006a412010d0030d040b20064200370300204d420037030020084200370300200142003703500240204e2002460d00200241a07f6a200141d0006a412010d0030d050b20064200370300204d42003703002008420037030020014200370350200241807f6a21650240203f2002460d002065200141d0006a412010d0030d060b2005417c6a210520652102206520696b41ff004b0d000b0b20652069460d052005417f6a2102200141d0006a41206a2106200141e8006a214d200141e0006a2108200141d8006a21050340204d4200370300200842003703002005420037030020014200370350024020062065460d00206541606a200141d0006a412010d0030d060b2002417f6a21022069206541606a2265470d000c060b0b2005417f6a21020c030b2005417e6a21020c020b2005417d6a21020c010b2005417c6a21020b200241016a2265206a206a20654b1b216a0b200141ec006a2022360200200141d0006a41186a2023360200200141e4006a2024360200200141d0006a41106a200d360200200141dc006a201f360200200141d0006a41086a2265201e360200200141033a0054200141063a0050200141d0006a108b0120014190026a41086a22024200370300200142003703900241d5fdc000411220014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014100360258200142013703502001206a3602900220014190026a200141d0006a1062024002400240206a450d00206a41057421054100206528020022026b214d2001280250213c2001280254210820692165034002402008204d6a411f4b0d00200241206a22062002490d232008410174224f20062006204f491b22064100480d23024002402008450d00203c20082006101e223c0d010c060b2006101f223c450d050b200621080b203c20026a22062065290000370000200641186a206541186a290000370000200641106a206541106a290000370000200641086a206541086a290000370000204d41606a214d200241206a2102206541206a2165200541606a22050d000b200141d8006a2002360200200120083602542001203c3602500c010b20652802002102200128025421082001280250213c0b200141f0016a4110203c2002100302402008450d00203c101d0b02402068450d002069101d0b20014190026a41086a22654200370300200142003703900241e7fdc000411620014190026a1001200141f0016a41086a2202206529030037030020012001290390023703f0012001206c360250200141f0016a4110200141d0006a4104100320654200370300200142003703900241fdfdc000411120014190026a10012002206529030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d06200128025041016a21650c010b410121650b20014190026a41086a22024200370300200142003703900241fdfdc000411120014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120012065360250200141f0016a4110200141d0006a4104100302402066450d002067101d0b201aa7450d202019101d0c200b200641011020000b411641011020000b413641011020000b202a2007102a000b41df88c0004133103a000b20102060102a000b20602010417f6a225f490d160b20602007102b000b4100213a0c050b4103213a0c050b4102213a0c070b4103213a0c070b4103213a0c070b410021020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410121020c080b410121020c070b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b205d205e470d13410121020c170b205d20456a2202205d490d1a205d2045742206200220022006491b2202ad2046862204204788a70d1a2004a722062042480d1a02400240205d450d00205c205d2048742006101e225c0d010c030b2006101f225c450d020b2002215d410221020c160b205c205e2048746a220220613602042002205f360200205e20456a2264215e20642049490d02410121630c140b200641041020000b0240024020630e020001010b2060201020446a225f490d1602402060205f6b22612049490d0020262010204b6c6a2202204d6a22082903002026205f204b6c6a2206204d6a220529030022045a0d00200141f0016a204e6a220a2006204e6a2212290300370300200141f0016a204f6a22132006204f6a220f290300370300200141f0016a203c6a220e2006203c6a2214290300370300200120062903003703f0012006200229030037030020142002203c6a290300370300200f2002204f6a29030037030020122002204e6a29030037030020052008290300370300024020612048490d00200620566a29030020045a0d0041022106206221080240034020082202204d6a200220576a2903003703002002204e6a200220586a2903003703002002204f6a200220596a2903003703002002203c6a2002205a6a29030037030020022002204b6a2208290300370300200620456a220620614f0d01200220566a2903002004540d000b0b2002204b6a21020b200220012903f001370300200220043703202002204e6a200a2903003703002002204f6a20132903003703002002203c6a200e2903003703000b205f450d0f2062203f6a2162205f21102061205b490d0d410021020c140b0240024002400240205c2064220e20446a22642048746a2202280200450d00205c200e2048746a220a20516a2802002205200228020422064d0d004102215e200e41024d0d04205c200e204a6a22022048746a2802042208200620056a4d0d014103215e200e41034d0d04200a20526a280200200820056a4d0d010c050b200e2048490d0120022802042106205c200e204a6a22022048746a28020421080b20082006490d010b200e20506a21020b200e200220456a22254d0d03200e20024d0d04205c20022048746a2215280204222020152802006a2202205c20252048746a2227280200225e490d05200220074b0d06201520436a21212026205e204b6c6a220f20272802042214204b6c22066a210a2002204b6c2108024002400240024002402002205e6b221220146b220220144f0d00203d200a2002204b6c220610ce031a203e20066a210520142045480d0120022045480d01204020086a2108200a2102034020082002203f6a22122005203f6a22132005204c6a2903002002204c6a29030054220a1b22062903003703002008204d6a2006204d6a2903003703002008204e6a2006204e6a2903003703002008204f6a2006204f6a2903003703002008203c6a2006203c6a29030037030020052013200a1b2105200f20122002200a1b22024f0d042008203f6a2108203e2106203e2005490d000c050b0b203d200f200610ce031a203e20066a210520142045480d01201220144c0d01202620086a2113203e2106200f210203402002200a2006200a204d6a2903002006204d6a2903005422121b22082903003703002002204d6a2008204d6a2903003703002002204e6a2008204e6a2903003703002002204f6a2008204f6a2903003703002002203c6a2008203c6a29030037030020062006204b6a20121b21062002204b6a2102200a204b6a200a20121b220a20134f0d04200520064b0d000c040b0b200a21020c010b200f21020b203e21060b20022006200520066b22082008204b706b10ce031a2021202020146a3602002015205e36020020272027203c6a2025204473200e6a20487410cf031a2064215e206420454b0d0d0b205f0d060c010b200e215e205f0d060b0240205d450d00205c101d0b203b450d06203d101d410021020c110b4188bfc3002025200e104b000b4188bfc3002002200e104b000b205e2002102a000b20022007102b000b4101213a0c020b4101213a0c020b410021020c0a0b410121020c090b410121020c080b410021630c030b410121630c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b205f2060102a000b102e000b1021000b2018450d002017101d0b200141b0026a24000b980201027f230041306b220224000240024002404113101f2203450d002003410f6a410028008f9d40360000200341086a41002900889d40370000200341002900809d40370000200341134126101e2203450d0120032001360013200241206a41086a220142003703002002420037032020034117200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a105e20022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b411341011020000b412641011020000b41df88c0004133103a000bb20504027f017e017f037e230041206b220224000240024002404114101f2203450d00200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241106a41086a220542003703002002420037031020034134200241106a1001200241086a2005290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021042003101d4118101f2203450d010c050b420021062003101d4118101f22030d040b411841011020000b41df88c0004133103a000b411441011020000b413441011020000b200341106a41002900e9ba40370000200341086a41002900e1ba40370000200341002900d9ba403700000240200341184138101e2203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002107200241106a41086a220142003703002002420037031020034138200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022201417f460d022001410f4d0d02200241186a2903002108200229031021070c010b420021080b2003101d2000200720047c22043703002000200820067c2004200754ad7c370308200241206a24000f0b41df88c0004133103a000b413841011020000bc60201037f230041206b2201240002400240024002404110101f2202450d00200241086a41002900a49b403700002002410029009c9b4037000020002802002103200241104120101e2202450d01200220033600102002412041c000101e2202450d02200220002900043700142002412c6a2000411c6a290000370000200241246a200041146a2900003700002002411c6a2000410c6a290000370000200141106a41086a220042003703002001420037031020024134200141106a1001200141086a2000290300370300200120012903103703004100210002402001411041f8b3c200410041001002417f460d00200141003a001020014110200141106a41014100100241016a41014d0d0420012d001021000b2002101d200141206a240020000f0b411041011020000b412041011020000b41c00041011020000b41df88c0004133103a000bec1004097f047e097f027e230041a0036b220524000240024002400240024002400240024002400240024002402004450d0020054190036a41086a22064200370300200542003703900341939dc000411d20054190036a1001200541f0026a41086a200629030037030020052005290390033703f002410021060240200541f0026a411041f8b3c200410041001002417f460d0020054180026a4200370300200541e8016a41106a4200370300200541e8016a41086a4200370300200542003703e801200541f0026a4110200541e8016a4120410010022206417f460d0b2006411f4d0d0b200541a0016a41186a200541e8016a41186a290300370300200541a0016a41106a200541e8016a41106a290300370300200541a0016a41086a200541e8016a41086a290300370300200520052903e8013703a001410121060b4128101f2207450d0b200720063a0004200741f8b3c200360200200720052903a001370005200720052f00e8013b00252007410d6a200541a8016a290300370000200741156a200541b0016a2903003700002007411d6a200541b8016a290300370000200741276a200541ea016a2d00003a0000200541a0016a200710ba0120052d00a001450d012004417f6a2108200541e8016a41206a2109200541a0016a4101722106200541e8016a41c0006a220a2002460d02200541e8016a41186a210b200541e8016a41106a210c200541c8026a210d4200210e4200210f42002110420021110340200b200f370300200c200e370300200520103703e801200520113703f0012009200641c10010ce0321040240200a2002412010d0030d00200541f0026a41186a2212200441186a2213290200370300200541f0026a41106a2214200441106a2215290200370300200541f0026a41086a2216200441086a2217290200370300200520042902003703f0024110101f2218450d07201841086a41002900a49b403700002018410029009c9b40370000201841104120101e2218450d0a201820013600102018412041c000101e2218450d0b201820052903f0023700142018412c6a2012290300370000201841246a20142903003700002018411c6a201629030037000020054190036a41086a2219420037030020054200370390032018413420054190036a1001200541d0026a41086a221a201929030037030020052005290390033703d002200541d0026a411041f8b3c20041004100100221192018101d2019417f470d00200d2c00002118200541d0026a41186a22192013290000370300200541d0026a41106a22132015290000370300201a2017290000370300200520042900003703d00220054190016a200541d0026a109a0120054190016a41086a290300211b200529039001211c20054180016a200541d0026a109a01200541d0006a20052903800120054180016a41086a2903002018200320182003411874411875481b2204ad423886423887420010d20320122019290300370300201420132903003703002016201a290300370300200520052903d0023703f002200541e0006a2001200541f0026a20042008109c01201b200f7c201c200e7c220f201c54ad7c200541e0006a41186a2903007c200f20052903707c220e200f54ad7c210f200541d0006a41086a29030020117c2005290350221c20107c2211201c54ad7c200541e0006a41086a2903007c201120052903607c2210201154ad7c21110b200541a0016a200710ba0120052d00a0010d000c040b0b4200210e4200210f42002110420021110c030b42002110420021114200210e4200210f0c010b200541c8026a21164200210e4200210f42002110420021110340200541e8016a41186a200f370300200541e8016a41106a200e370300200520103703e801200520113703f0012009200641c10010ce032118200541f0026a41186a2202200641186a290000370300200541f0026a41106a220a200641106a290000370300200541f0026a41086a220b200641086a290000370300200520062900003703f0024110101f2204450d03200441086a41002900a49b403700002004410029009c9b40370000200441104120101e2204450d04200420013600102004412041c000101e2204450d05200420052903f0023700142004412c6a2002290300370000200441246a200a2903003700002004411c6a200b29030037000020054190036a41086a220c420037030020054200370390032004413420054190036a1001200541d0026a41086a2212200c29030037030020052005290390033703d002200541d0026a411041f8b3c200410041001002210c2004101d0240200c417f470d0020162c00002104200541d0026a41186a220c201841186a290000370300200541d0026a41106a2214201841106a2900003703002012201841086a290000370300200520182900003703d002200541c0006a200541d0026a109a01200541c0006a41086a290300211b2005290340211c200541306a200541d0026a109a0120052005290330200541306a41086a2903002004200320042003411874411875481b2204ad423886423887420010d2032002200c290300370300200a2014290300370300200b2012290300370300200520052903d0023703f002200541106a2001200541f0026a20042008109c01201b200f7c201c200e7c220f201c54ad7c200541106a41186a2903007c200f20052903207c220e200f54ad7c210f200541086a29030020117c2005290300221c20107c2211201c54ad7c200541106a41086a2903007c201120052903107c2210201154ad7c21110b200541a0016a200710ba0120052d00a0010d000b0b2007101d0b2000200e37031020002010370300200041186a200f37030020002011370308200541a0036a24000f0b411041011020000b412041011020000b41c00041011020000b412041011020000b41c00041011020000b41df88c0004133103a000b412841041020000bbd1207017f017e087f047e017f037e067f23004180016b2203240042002104200341086a41086a2205420037030020034200370308418cb9c000410d200341086a1001200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041f8b3c200410041001002417f460d0020034200370308200341d8006a4110200341086a41084100100241016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110ea0120032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210902402007450d002006101d0b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b200320032802403602384128101f220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2216460d002006200841286c6a2108200341d8006a41186a210b200341f9006a221741036a21184101210941012115034002400240024002400240200b2000460d000340200341d8006a41206a2219200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2211200c41106a290300370300200341d8006a41086a221a200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002011290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2008200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022008200c41286a220c470d000c070b0b2003201728000036025020032018280000360053200c41286a210c201a290300211020192d00002111200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22111b21102013200f20111b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722111200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b36004320032003280248360240200341d8006a41206a221920113a0000200b200e370300200341d8006a41106a221a200d3703002017200328024036000020182003280043360000200320103703602003200f370358024020152009470d00200941016a22112009490d0620094101742215201120112015491b2215ad42287e220d422088a70d06200da722114100480d0602402009450d00200a200941286c2011101e220a0d010c080b2011101f220a450d070b200a200941286c6a22112003290358370300201141206a2019290300370300201141186a200b290300370300201141106a201a290300370300201141086a200341d8006a41086a290300370300200941016a2109200c2016470d000c020b0b41012109410121150b02402007450d002006101d0b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2208200541086a2903003703002003200529030037035820092015470d04200941016a220c2009490d0120094101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402009450d00200a200941286c200c101e220a450d010c060b200c101f220a0d050b200c41081020000b41df88c0004133103a000b1021000b201141081020000b412841081020000b200a200941286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2008290300370300200941016a21090b200320093602602003201536025c2003200a3602582001200341d8006a10f10120034180016a24000bc30201027f230041f0016b220224000240024002404112101f2203450d00200341106a41002f00eaa8413b0000200341086a41002900e2a841370000200341002900daa841370000200341124124101e2203450d012003200136001220024188016a41086a2201420037030020024200370388012003411620024188016a1001200241e8006a41086a2001290300370300200220022903880137036802400240200241e8006a411041f8b3c200410041001002417f460d002002421037027c2002200241e8006a36027820024188016a200241f8006a10e1022002290388014201520d04200241086a20024188016a41086a41e00010ce031a20004201370300200041086a200241086a41e00010ce031a0c010b200042003703000b2003101d200241f0016a24000f0b411241011020000b412441011020000b41df88c0004133103a000bc20502037f037e230041306b220424000240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441086a22064200370300200442003703002005413420041001200441206a41086a200629030037030020042004290300370320024002400240200441206a411041f8b3c200410041001002417f460d002004420037030820044200370300200441206a411020044110410010022206417f460d022006410f4d0d02200441086a2903002107200429030021080c010b42002108420021070b2005101d20042001200820027c2202200720037c2002200854ad7c10ec01200441106a290300210820042903082102024002400240024020042903004200510d0042002109200441086a220542003703002004420037030041aeb9c000411620041001200441206a41086a2201200529030037030020042004290300370320200441206a411041f8b3c200410041001002417f460d012004420037030820044200370300200441206a411020044110410010022206417f460d072006410f4d0d07200441086a2903002103200429030021070c020b200221090c020b42002107420021030b200542003703002004420037030041aeb9c000411620041001200120052903003703002004200429030037032020044200200320087d2007200254ad7d2208200720027d2202200756200820035620082003511b22051b37030820044200200220051b370300200441206a4110200441101003420021080b2000200937030020002008370308200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b7e01017f230041c0006b220124002001412e36020c2001419d96c000360208200120003602142001413c6a411b3602002001412c6a4102360200200141183602342001420237021c200141b8b1c4003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41c8b1c40010cf01000bb60504027f017e0e7f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210e4100210d0c030b102e000b200541081020000b200141046a2107200241306a41186a2108200241306a41106a21094100210a4100210b4100210c2003210d0240034020024200370330200141086a2205410020012802002007280200200241306a410820052802001002220e200e417f461b220e4108200e4108491b20052802006a220f360200200e41074d0d01200229033021042008420037030020094200370300200241306a41086a22104200370300200242003703302005410020012802002007280200200241306a4120200f1002220e200e417f461b220e4120200e4120491b20052802006a360200200e411f4d0d01200c41016a210e200241106a41186a220f2008290300370300200241106a41106a22112009290300370300200241106a41086a22122010290300370300200220022903303703100240200c200d470d00200a200e200e200a491b220dad42287e2213422088a70d042013a722054100480d040240200c450d002006200b2005101e22060d010c060b2005101f2206450d050b2006200b6a22052004370300200541206a200f290300370300200541186a2011290300370300200541106a2012290300370300200541086a2002290310370300200a41026a210a200b41286a210b200e210c200e2003490d000c020b0b200041003602000240200d450d002006101d0b200241d0006a24000f0b2000200d36020420002006360200200041086a200e360200200241d0006a24000f0b1021000b200541081020000ba20403057f017e037f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041286c6a2104200241086a22052802002100200228020421060340200329030021070240024002400240200620006b41084f0d00200041086a22082000490d0620064101742209200820082009491b220a4100480d062006450d0120022802002006200a101e22090d020c070b200041086a2108200228020021090c020b200a101f2209450d050b2002200a36020420022009360200200a21060b20052008360200200920006a20073700000240024002400240200620086b41204f0d00200841206a22002008490d062006410174220a20002000200a491b220a4100480d062006450d0120092006200a101e22090d020c080b200841206a21000c020b200a101f2209450d060b2002200a36020420022009360200200a21060b20052000360200200920086a220841086a200341106a290000370000200841106a200341186a290000370000200841186a200341206a2900003700002008200341086a290000370000200341286a22032004470d000b200128020020012802042009200010032006450d050c040b200228020421032001280200200128020420022802002209200241086a280200100320030d030c040b1021000b200a41011020000b200a41011020000b2009101d0b200241106a24000ba77f05057f057e057f017e097f230041d0096b22022400200241003a00f00820012802002001280204200241f0086a410120012802081002210320012001280208200341016a41014b22036a2204360208024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00f0082203410e4b0d07024020030e0f000b0709040c0e0a10060f03050d02000b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dc10120022d00f008450d130cc1010b2000410f360200200241d0096a24000f0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d1420022d00f00822034101460d1320030d14200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d14200241b0076a20024190086a41dc0010ce031a41e000101f2201450d9d0120012003360200200141046a200241b0076a41dc0010ce031a20014108762104410121030c250b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dbd0120022d00f008450d0f0cbd010b200241003a00f008410421032001280200200141046a280200200241f0086a4101200410022104200141086a22052005280200200441016a41014b22046a22053602002004450d1c20022d00f00822044102460d1b20044101460d1a20040d1c20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841042103200141086a220441002001280200200141046a280200200241f0086a41202005100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d1c200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210620022900ff08210720022900f7082108200241a0076a41086a220320012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024190086a41086a20032d00003a0000200220013b018807200220022903a007370390082008422088a721012008a72104410121030c1e0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d2920022d00f008220341044b0d29024020030e050027252624000b200241e8046a200110ca0220022903e804a7450d29200241f8046a290300210720022903f0042108200241f0086a200110bb0220022d00f00822034102460d292002418c096a2902002109200241fc086a290200210a20022f00f108210120022d00f308210420022902f408210b200220024184096a2902003703a0082002200a370398082002200b3703900820012004411074722101410121040c280b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1220022d00f00822054101460d114103210320050d13200241c0046a200110d50120022802c004450d1320022802c4042104200241f0086a200110a30120022802f008210520024190086a200241f0086a41047241dc0010ce031a2005410f460d13200241b0076a20024190086a41dc0010ce031a41e000101f2201450d9d0120012005360200200141046a200241b0076a41dc0010ce031a410121030c140b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22012001280200200341016a41014b6a3602002000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d1420022d00f00822034101460d1220030d14200241f0086a200110bb0220022d00f00822034102460d1420022d00f308210c20022f00f108210d2002418c096a290200210720024188096a280200210420024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f4082108200241d8006a200110ca022002280258450d14200d200c411074722101200241d8006a41106a29030021094101210c2002290360210a0c130b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d6620022d00f008220341094b0d66024020030e0a00363334313839353b32000b200241f0086a200110920220022802f0082203450d6620022902f4082107200241a0036a200110d5012007a7210420022802a003450d6520022802a403210c200441087621012003410876210f20074220882107410121100c360b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d880120022d00f008220541064b0d880141022106024020050e0700b5012b2c2a2d2e000b200241186a200110d5012002280218450d8801200228021c2204417f4c0d8e012004450d6e200410792203450d9a01200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d6f0cb3010b200241003a00f008410421052001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22063602002003450d820120022d00f008220d410e4b0d82010240200d0e0f005354810150585b565d525e4f51594e000b200241f0086a200110bb0220022d00f00822044102460d820120022d00f308210620022f00f108210d2002418c096a290200210720024188096a280200210e20024184096a2802002103200241f0086a41106a350200210b200241fc086a350200211120022902f4082108200241b0016a200110ca0220022903b001a7450d8201200241b0016a41106a290300210a20022903b8012109200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d820120022d00f008220c41024b0d8201200d200641107472210f200b422086201184210b410121050c80010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d034105210320022d00f008220441034b0dae01024020040e0400191718000b200241f0086a200110a403200241a0076a41086a220120024190096a28020036020020024190086a41086a2204200241a8096a29030037030020024190086a41106a2205200241b0096a290300370300200220024188096a2903003703a0072002200241a0096a29030037039008200241c0096a290300210a200241b8096a29030021082002419c096a280200210e20024198096a280200210620024194096a280200210c200241f0086a41106a290300210720022903f808210920022903f0084201520d2c20024188076a41086a2001280200360200200241b0076a41086a2004290300370300200241b0076a41106a2005290300370300200220022903a0073703880720022002290390083703b007410121030caf010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a220d3602002003450d5e20022d00f008220f410b4b0d5e410921030240200f0e0c004445424748464ba301434a41000b200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d5e200241b0076a20024190086a41dc0010ce031a41e000101f2204450d9b0120042003360200200441046a200241b0076a41dc0010ce031a200241d0026a200110ca0220022903d002a7450d5d200241e0026a290300210720022903d8022208422088a7210e2008a7210c410121030c600b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dae0120022d00f008450d050cae010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d014106210320022d00f008220541044b0da801024020050e050024212220000b200241f0086a200110a30120022802f008210120024190086a200241f0086a41047241dc0010ce031a2001410f460da801200241b0076a20024190086a41dc0010ce031a41e000101f2204450d940120042001360200200441046a200241b0076a41dc0010ce031a410121030caa010b410521030caa010b410621030ca6010b200241e0046a200110d50120022802e004450dad0120022802e4042203417f4c0d86012003450d35200310792204450d8e01200141086a2205200341002001280200200141046a280200200420032005280200100222012001417f461b2201200120034b1b220120052802006a36020020012003470d360ca4010b200241086a200110f1022002290308a7450dad012002290310210720004100360200200041086a2007370300200241d0096a24000f0b200241d0046a200110f10220022903d004a7450da80120022903d80421072000410a360200200041086a2007370300200241d0096a24000f0b200241f0086a200110bb024102210320022d00f00822014102470d100b2000410f360200200241d0096a24000f0b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220541002001280200200141046a280200200241f0086a41202004100222032003417f461b2203412020034120491b20052802006a3602002003411f4d0d00200241a0076a41086a2203200241f0086a411f6a2d00003a0000200220022f00f1083b01940720022002290087093703a00720022d00f008210520022800f308210420022900ff08210720022900f7082108200241b0076a41086a20032d00003a0000200220022f0194073b019c07200220022903a0073703b007200241c8046a200110d5014103210320022802c804450d0120022802cc042106200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210e20012001280200200e41016a41014b220e6a360200200e450d012008422088a7210e2008a7210120022d00f008210c20024188076a41086a200241b0076a41086a2d00003a0000200220022f019c073b018407200220022903b00737038807410221030c020b410321030b0b200241f0086a41086a220d20024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac07024020034103470d002000410f360200200241d0096a24000f0b200241f8066a41086a220f200d2d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020053a0005200020033a000420004109360200200041146a2007370200200041106a200e3602002000410c6a2001360200200041086a20043602002000200c3a0025200041286a2006360200200020022f01dc063b00062000411c6a20022903f806370200200041246a200f2d00003a0000200020022f01da063b0126200241d0096a24000f0b200241f0086a200110bb0220022d00f00822034102460d0120022d00f308210c20022f00f108210d2002418c096a290200210720024188096a280200210420024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f408210820024188016a200110ca02200229038801a7450d0120024188016a41106a2903002109200229039001210a200241f0006a200110ca022002290370a7450d01200d200c41107472210120024180016a29030021112002290378210b4102210c0b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a200b370200200041386a2009370200200041306a200a370200200041286a2007370000200041246a2004360000200041206a20053600002000411c6a2006360000200041186a200e360000200041106a20083700002000410c6a20033a0000200041086a200c360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241a0016a200110f10220022903a001a7450d0120022903a8012207422088a721012007a72104410221030c020b200241003a00f008410421032001280200200141046a280200200241f0086a4101200510022104200141086a22012001280200200441016a41014b22016a3602002001450d0020022d00f0082105410321030c020b0b0b200241f0086a41086a220e20024190086a41086a2d00003a0000200220022f0188073b01e00620022002290390083703f008200220022f01f8063b01ac07024020034104470d002000410f360200200241d0096a24000f0b200241b0076a41086a220c200e2d00003a0000200220022f01e0063b019c07200220022903f0083703b007200220022f01ac073b018407200020053a0009200041086a20033a000020004104360200200041186a2007370200200041146a2001360200200041106a20043602002000410c6a2006360200200020022f019c073b000a200041206a20022903b007370000200041286a200c2d00003a0000200020022f0184073b012a200241d0096a24000f0b200241f0086a200110bb0220024190086a41086a22042002418c096a280200360200200220024184096a2902003703900820022d00f00822054102460d970120022d00f308210d20022f00f108210f20024190096a280200210c200241fc086a290200210720022902f4082109200241a0076a41086a200428020036020020022002290390083703a00720024190066a200110ca0241052103200229039006a7450d7220024190066a41106a290300210a200229039806210b20024180066a200110f102200229038006a7450d722002290388062108200241f8056a200110d50120022802f805450d7220022802fc05220e417f4c0d75200e450d70200e10792206450d8701200141086a2204200e41002001280200200141046a2802002006200e2004280200100222012001417f461b22012001200e4b1b220120042802006a3602002001200e470d710c90010b200241c0066a200110ca0220022903c006a7450d9601200241d0066a290300210820022903c806210a200241b0066a200110f10220022903b006a7450d960120022903b806210b20024188096a4200370300200241f0086a41106a4200370300200241f0086a41086a4200370300200242003703f00841002106200141086a220341002001280200200141046a280200200241f0086a41202003280200100222042004417f461b2204412020044120491b20032802006a3602002004411f4d0d4c2002419e076a20022d00f2083a000020024190086a41086a200241f0086a411f6a2d00003a0000200220022f01f0083b019c0720022002290087093703900820022f01f40820022d00f60841107472210420022d00f308210520022900f708210920022900ff082107410121060c4d0b200241e8056a200110f10220022903e805a7450d950120022903f0052107200241e0056a200110d50120022802e005450d950120022802e4052206417f4c0d732006450d51200610792205450d8001200141086a2204200641002001280200200141046a280200200520062004280200100222012001417f461b2201200120064b1b220120042802006a36020020012006470d520c8d010b20022f00f10820022d00f308411074722104200241fc086a2802002105200241f0086a41106a280200210620024184096a280200210e20024188096a280200210c2002418c096a290200210820022902f40821070b200020033602042000410e360200200041246a2008370200200041206a200c3602002000411c6a200e360200200041186a2006360200200041146a20053602002000410c6a2007370200200041086a2004410874200141ff017172360200200241d0096a24000f0b200241d8056a200110d50120022802d805450d0520022802dc0522034108762101410521040c030b200241c8056a200110d50120022802c805450d0420022802cc052103200241b0056a200110ca0220022903b005a7450d04200241c0056a290300210720022903b8052108200241a0056a200110f10220022903a005a7450d0420022903a805210920024198056a200110d501200228029805450d04200228029c052101200241a0086a20073703002002200837039808200220013602900820034108762101410321040c030b200241d0056a200110d50120022802d005450d0320022802d40522034108762101410421040c010b20024180056a200110ca02200229038005a7450d0220024190056a29030021072002200229038805370390082002200737039808410221040b0b200241f0086a41106a20024190086a41106a290300220a370300200241f0086a41086a20024190086a41086a290300220b370300200241b0076a41086a2205200b370300200241b0076a41106a2206200a3703002002200229039008220a3703b0072002200a3703f008200041386a2007370200200041306a20083702002000410c6a2001410874200341ff017172360200200041086a20043602002000410c360200200041286a2009370200200041106a20022903b007370200200041186a2005290300370200200041206a2006290300370200200241d0096a24000f0b200241f0086a41106a20024190086a41106a290300370300200241f0086a41086a20024190086a41086a29030037030020022002290390083703f0082000410f360200200241d0096a24000f0b200241b0046a200110f10220022903b004a7450d880120022903b8042207422088a721012007a72105410521030c020b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841002105200141086a220641002001280200200141046a280200200241f0086a41202004100222012001417f461b2201412020014120491b20062802006a3602002001411f4d0d19200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210620022800f308210420022900ff08210720022900f7082108200241b0076a41086a20012d00003a0000200220022f0198073b019c07200220022903e0063703b0072008422088a721012008a721054101210e0c1a0b200241a0046a200110f10220022903a004a7450d860120022903a8042207422088a721012007a72105410421030b0c86010b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841002105200141086a220641002001280200200141046a280200200241f0086a41202004100222042004417f461b2204412020044120491b20062802006a220e3602002004411f4d0d18200241e0066a41086a2205200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210620022800f308210420022900f708210820022900ff08210720024190086a41086a20052d00003a0000200220022f0198073b01ac07200220022903e00637039008410121050c190b200241286a200110d5012002280228450d5e200228022c2204417f4c0d642004450d3e200410792203450d72200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d3f0c7d0b200241206a200110d5012002280220450d5d20022802242204417f4c0d632004450d3f200410792203450d72200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d400c7b0b200242003703f00841042106200141086a220341002001280200200141046a280200200241f0086a41082004100222012001417f461b2201410820014108491b20032802006a360200200141074d0d5c20022903f00821070c88010b200241c0006a200110d5012002280240450d5b20022802442213ad42187e2207422088a70d612007a72204417f4c0d612004450d432004101f22030d44200441041020000b200241d0006a200110d5012002280250450d5a20022802542212ad420c7e2207422088a70d602007a72204417f4c0d602004450d442004101f22030d45200441041020000b0c82010b200241d0036a200110d50120022802d003450d3520022802d4032203410876210f42002107410521100c080b20024190046a200110f102200229039004a7450d34200229039804220842208821072008a722044108762101410a21100c090b200241c0036a200110d50120022802c003450d3320022802c4032103200241f0086a200110bb0220022d00f00822044102460d3320022d00f308210c20022f00f108210f2002418c096a290200210820024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f4082107200220024188096a280200360290082002200837029408200241b8036a200110d50120022802b803450d3320022802bc03210d200241b0036a200110d50120022802b003450d33200f200c4110747221012007422088a7210c2008422088a721122003410876210f200229039008210820022802b403ad21094200210a410321100c0a0b200241c8036a200110d50120022802c803450d3220022802cc032203410876210f42002107410421100c050b200241f0086a200110bb0220022d00f00822034102460d3120022902f40822084220882107410821102008a72204410876210120022f00f10820022d00f30841107472210f200241fc086a280200210c200241f0086a41106a280200210e20024184096a280200210620024188096a28020021052002418c096a29020021080c080b200241f0086a200110920220022802f0082203450d3020022902f4082107200241a8036a200110d5012007a7210420022802a803450d2f20022802ac03210c200441087621012003410876210f20074220882107410221100b0c050b200241f0086a200110bb0220022d00f00822034102460d2e20022d00f308210420022f00f108210d2002418c096a290200210820024188096a280200210520024184096a2802002106200241f0086a41106a280200210e200241fc086a280200210c20022902f408210b200241e0036a200110ca0220022903e003a7450d2e200241e0036a41106a290300210a20022903e8032109200241d8036a200110d50120022802d803450d2e200d200441107472210f20022802dc032112200b4220882107200ba722044108762101410621100c050b200241f8036a200110d50120022802f803450d2d20022802fc032203410876210f42002107410721100b0c020b20024180046a200110f102200229038004a7450d2b200229038804220842208821072008a722044108762101410921100b0b0b20004107360200200041c0006a200a370200200041386a2009370200200041346a200d360200200041306a2012360200200041286a2008370200200041246a2005360200200041206a20063602002000411c6a200e360200200041186a200c360200200041086a20103602002000410c6a200f410874200341ff017172360200200041106a20074220862001ad42ffffff07834208862004ad42ff01838484370200200241d0096a24000f0b410121042001280200200141046a28020041014100200141086a28020010021a41002003460d6e0b2003450d762004101d0c760b410021014100210e0b200241a0076a41086a220c200241b0076a41086a2d00003a0000200220022f019c073b019407200220022903b0073703a0070240200e450d0020024190086a41086a2203200c2d00003a0000200220022f019407220e3b01ac07200220022903a0073703900820024188076a41086a20032d00003a00002002200e3b018407200220022903900837038807410321030b0c6e0b0b200241a0076a41086a220c20024190086a41086a2d00003a0000200220022f01ac073b01940720022002290390083703a00702402005450d00200241b0076a41086a200c2d00003a0000200220022f0194073b019c07200220022903a0073703b007200241003a00f0082001280200200141046a280200200241f0086a4101200e10022105200141086a22012001280200200541016a41014b22016a3602002001450d0020022d00f008210e20024188076a41086a200241b0076a41086a2d00003a0000200220022f019c073b018407200220022903b007370388072008422088a721012008a72105410221030c6d0b0c6c0b410c21030c1e0b200241f8026a200110d501410d210320022802f802450d1d20022802fc022104200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d1d20022d00f0082105410421030c600b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220341002001280200200141046a280200200241f0086a4120200d100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1b200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900ff08210720022900f7082108200241a0076a41086a220320012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024190086a41086a220620032d00003a0000200220013b01ac07200220022903a00737039008200241b0076a41086a220320062d00003a0000200220013b019c0720022002290390083703b00720024188076a41086a20032d00003a0000200220013b018407200220022903b007370388072008422088a7210e2008a7210c410a21030c5f0b200241e8026a200110d5014102410d20022802e8021b210320022802ec0221040c040b200241f0026a200110d501410d210320022802f002450d1a20022802f4022104200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d1a20022d00f0082105410321030c5d0b20024190036a200110f102410d2103200229039003a7450d19200229039803210720024188036a200110d501200228028803450d19200228028c0321042007422088a7210e2007a7210c410721030c1a0b200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d17200241b0076a20024190086a41dc0010ce031a41e000101f2204450d5520042003360200200441046a200241b0076a41dc0010ce031a200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22032802001002210520032003280200200541016a41014b22056a22063602002005450d1620022d00f008220541024b0d16200242003703f008200141086a220341002001280200200141046a280200200241f0086a41082006100222012001417f461b2201410820014108491b20032802006a360200200141074d0d1620022903f0082207422088a7210e2007a7210c410521030c5b0b20024180036a200110d5014106410d2002280280031b210320022802840321040b0c170b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220641002001280200200141046a220e280200200241f0086a4120200d100222032003417f461b2203412020034120491b20062802006a220c3602002003411f4d0d14200241e0066a41086a2203200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900f708210820022900ff082107200241a0076a41086a220d20032d00003a0000200220022f01980722033b019407200220022903e0063703a007200241b0076a41086a220f200d2d00003a0000200220033b019c07200220022903a0073703b00720024190086a41086a200f2d00003a0000200220033b01ac07200220022903b00737039008200241003a00f0082001280200200e280200200241f0086a4101200c1002210120062006280200200141016a41014b22016a3602002001450d2b20022d00f008210620024188076a41086a20024190086a41086a2d00003a0000200220022f01ac073b0184072002200229039008370388072008422088a7210e2008a7210c410b21030c580b20024188096a420037030020024180096a420037030041082103200241f0086a41086a4200370300200242003703f008200141086a220441002001280200200141046a280200200241f0086a4120200d100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d13200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900ff08210720022900f7082108200241a0076a41086a220620012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024188076a41086a20062d00003a0000200220013b018407200220022903a007370388072008422088a7210e2008a7210c0c570b200241f0086a2001105e20022802f0082204450d342004410876210f20022902f4082108410f21050c2e0b200241c0026a200110d50120022802c002450d3320022802c4022204410876210f410c21050c0a0b20024190026a200110d501200228029002450d322002280294022103200241f8016a200110ca0220022903f801a7450d3220024188026a290300210b2002290380022108410521050c2f0b200241003a00f0082001280200200141046a280200200241f0086a4101200610022103200141086a22012001280200200341016a41014b22016a3602002001450d3120022d00f008210c410d21050c050b200241a0026a200110f10220022802a002450d30410a210520022903a80221080c0c0b200241c8016a200110ca0220022903c801a7450d2f200241d8016a290300210b20022903d0012108410221050c010b200241e0016a200110ca0220022903e001a7450d2e200241f0016a290300210b20022903e8012108410321050b0c290b200241003a00f0082001280200200141046a280200200241f0086a410120061002210341082105200141086a22012001280200200341016a41014b22016a3602002001450d2c20022d00f008220c41034f0d2c0b0c290b20024198026a200110d501200228029802450d2a200228029c022214ad42247e2207422088a70d352007a72203417f4c0d352003450d222003101f22040d23200341041020000b200241c8026a200110d50120022802c802450d2920022802cc022204410876210f410e21050b0c010b410721050b0c220b200241f0086a200110bb0220022d00f00822044102460d2520022f00f10820022d00f30841107472210f200241fc086a290200210b20024184096a280200210320024188096a280200210e2002418c096a290200210720022902f4082108410921050c220b200241b0026a200110f10220022802b002450d24410b210520022903b80221080b0c1e0b2004103c2004101d0b410d21030b0b0c410b2004450d002003101d0b2000410f360200200241d0096a24000f0b0b200241ac076a41026a22032002419c076a41026a2d00003a0000200241f0086a41086a220e20024190086a41086a2d00003a0000200220022f019c073b01ac0720022002290390083703f00802402006450d0020024198076a41026a20032d00003a0000200241a0076a41086a200e2d00003a0000200220022f01ac073b019807200220022903f0083703a007200241a8066a200110d5014105210320022802a806450d3b20022802ac062206417f4c0d272006450d2520061079220c450d3a200141086a220e200641002001280200200141046a280200200c2006200e280200100222012001417f461b2201200120064b1b2201200e2802006a36020020012006470d260c3c0b410521030c3a0b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d3e0b20040d1d0c1e0b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d3b0b20040d1b0c1c0b410121052001280200200141046a28020041014100200141086a28020010021a41002006460d3b0b2006450d422005101d0c420b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d440b20040d170c180b410421030b2013450d0242002107200141086a210c200141046a21154100210f410021044100210e201321160340200241386a200110d5012002280238450d15200228023c2206417f4c0d1d024002402006450d00200610792210450d28200c200641002001280200201528020020102006200c280200100222052005417f461b2205200520064b1b2205200c2802006a36020020052006460d010c160b410121102001280200201528020041014100200c28020010021a41002006470d150b200241306a200110d5012002280230450d1420022802342205417f4c0d1d024002402005450d00200510792212450d26200c200541002001280200201528020020122005200c2802001002220d200d417f461b220d200d20054b1b220d200c2802006a360200200d2005460d010c150b410121122001280200201528020041014100200c28020010021a41002005470d140b200e41016a210d0240200e2016470d00200f200d200d200f491b2216ad42187e2208422088a70d1f2008a722144100480d1f0240200e450d00200320042014101e22030d010c240b2014101f2203450d230b200320046a220e2010360200200e41146a2005360200200e41106a2005360200200e410c6a2012360200200e41046a2006ad220842208620088437020020074280808080107c2107200f41026a210f200441186a2104200d210e200d2013490d000c040b0b410421030b2012450d0242002107200141086a210f200141046a21154100210c410021054100210e201221100340200241c8006a200110d5012002280248450d07200228024c2204417f4c0d1b024002402004450d0020041079220d450d1f200f2004410020012802002015280200200d2004200f280200100222062006417f461b2206200620044b1b2206200f2802006a36020020062004460d010c080b4101210d2001280200201528020041014100200f28020010021a41002004470d070b200e41016a21060240200e2010470d00200c20062006200c491b2210ad420c7e2208422088a70d1d2008a722164100480d1d0240200e450d00200320052016101e22030d010c200b2016101f2203450d1f0b200320056a220e200d360200200e41046a2004ad220842208620088437020020074280808080107c2107200c41026a210c2005410c6a21052006210e20062012490d000c040b0b41002116420021070b2003450d1220072016ad842107410621060c3e0b41002110420021070b2003450d1020072010ad842107410721060c3c0b410d21030c2c0b2004450d00200d101d0b0240200e450d002003210103400240200141046a280200450d002001280200101d0b2001410c6a2101200541746a22050d000b0b20100d0c0c0d0b410421040b024002402014450d004200210720024188096a211720024184096a2118200241fc086a21194100210e411c210641002103201421130340200241f0086a200110bb0220022d00f008220c4102460d08200341016a210520022d00f308210d20022f00f108210f2002418c096a29020021082017280200211020182802002112200241f0086a41106a28020021152019280200211620022902f4082109024020032013470d00200e20052005200e491b2213ad42247e220a422088a70d16200aa7221a4100480d1602402003450d002004200641646a201a101e22040d010c1a0b201a101f2204450d190b200420066a22032008370000200341676a200f200d41107472220d4110763a0000200341656a200d3b00002003417c6a2010360000200341786a2012360000200341746a2015360000200341706a2016360000200341686a2009370000200341646a200c3a000020074280808080107c2107200e41026a210e200641246a21062005210320052014490d000c020b0b41002113420021070b2004450d0620072013ad8421082004410876210f410621050b0b0b0b0b200220022f01b00722013b01f008200220013b01e006200041386a200a370000200041306a2009370000200041186a200b370000200041106a20083700002000200c3a0009200041086a20053a000020004105360200200041286a2007370000200041246a200e360000200041206a20033600002000410c6a200f410874200441ff017172360000200020022f01e0063b000a200241d0096a24000f0b2013450d002004101d0b200220022f01b0073b01f0082000410f360200200241d0096a24000f0b2005450d002012101d0b2006450d002010101d0b0240200e450d002003210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200441686a22040d000b0b2016450d010b2003101d0b2000410f360200200241d0096a24000f0b410121062001280200200141046a28020041014100200141086a28020010021a4100200e460d1f0b200e450d002006101d0b0c1e0b4101210c2001280200200141046a28020041014100200141086a28020010021a41002006460d160b2006450d14200c101d0c140b102e000b1021000b200441011020000b201641041020000b201a41041020000b201441041020000b41e00041081020000b200541011020000b200341011020000b200641011020000b41e00041081020000b41e00041081020000b200441011020000b200641011020000b200441011020000b200441011020000b41e00041081020000b41e00041081020000b200e41011020000b200641011020000b0c010b20024194076a41026a20024198076a41026a2d00003a000020024188076a41086a200241a0076a41086a2d00003a00002002200a3703b007200220022f0198073b019407200220022903a007370388072002200b3703c007200220083703b807410421032006210e0b0c060b200241f0086a41086a220120024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac0702402003410d470d002000410f360200200241d0096a24000f0b200241f8066a41086a220d20012d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020053a0009200041086a20033a000020004106360200200041186a2007370200200041146a200e360200200041106a200c3602002000410c6a2004360200200020063a0029200020022f01dc063b000a200041206a20022903f806370200200041286a200d2d00003a0000200020022f01da063b012a200241d0096a24000f0b2004ad22074220862007842107410321060c0d0b2004ad22074220862007842107410521060c0c0b200541087621042006ad22084220862008842109410221030c080b200241c0076a200a37030020024188076a41086a200241a0076a41086a2802003602002002200b3703b807200220022903a007370388072002200e3602b007410321030b200f200d4110747221040b0c050b2004450d08200020043602042000410b360200200041086a2003ad2207422086200784370200200241d0096a24000f0b0b0b200241f0086a41086a220c20024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac07024020034106470d002000410f360200200241d0096a24000f0b200241f8066a41086a220d200c2d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020063a0009200041086a20033a000020004108360200200041186a2007370200200041146a2001360200200041106a20053602002000410c6a20043602002000200e3a0029200020022f01dc063b000a200041206a20022903f806370200200041286a200d2d00003a0000200020022f01da063b012a200241d0096a24000f0b0b200241a0076a41026a220120024194076a41026a2d00003a000020024190086a41086a220d20024188076a41086a280200360200200241f0086a41086a220f200241b0076a41086a290300370300200241f0086a41106a2210200241b0076a41106a290300370300200220022f0194073b01a007200220022903880737039008200220022903b0073703f008024020034105470d002000410f360200200241d0096a24000f0b20024184076a41026a221220012d00003a0000200241f8066a41086a2201200d280200360200200241e0066a41086a220d200f290300370300200241e0066a41106a220f2010290300370300200220022f01a0073b01840720022002290390083703f806200220022903f0083703e0062000410f6a20044110763a00002000410d6a20043b0000200041086a20033a00002000410d360200200041186a2007370200200041106a20093702002000410c6a20053a0000200041346a200e360200200041306a20063602002000412c6a200c360200200020022f0184073b00092000410b6a20122d00003a0000200041206a20022903f806370200200041286a2001280200360200200041386a20022903e006370200200041c0006a200d290300370200200041c8006a200f290300370200200041d8006a200a370200200041d0006a2008370200200241d0096a24000f0b2000410f360200200241d0096a24000f0b2004ad22074220862007842107410121060b20004101360200200041106a20073702002000410c6a2003360200200041086a2006360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000bdd0504027f017e0f7f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210f4100210d0c030b102e000b200541081020000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001002220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241106a41186a22112007290300370300200241106a41106a22122008290300370300200241106a41086a2213200e29030037030020022002290330370310200242003703302005410020012802002009280200200241306a410820101002220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f200229033021042007201129030037030020082012290300370300200e2013290300370300200220022903103703300240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005101e22060d010c060b2005101f2206450d050b2006200b6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a200e290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d002006101d0b200241d0006a24000f0b2000200d36020420002006360200200041086a200f360200200241d0006a24000f0b1021000b200541081020000bd60501097f230041c0006b220124000240024002400240411a101f2202450d00200241186a41002f00e89b403b0000200241106a41002900e09b40370000200241086a41002900d89b40370000200241002900d09b403700002002411a4134101e2202450d012002200036001a200141306a41086a22034200370300200142003703302002411e200141306a1001200141206a41086a200329030037030020012001290330370320200141206a411010092002101d4113101f2202450d022002410f6a410028008f9d40360000200241086a41002900889d40370000200241002900809d40370000200241134126101e2202450d0320022000360013200141306a41086a220342003703002001420037033020024117200141306a1001200141206a41086a200329030037030020012001290330370320200141206a411010092002101d200120001099012001280204210420012802002105024002400240024020012802082202450d0020024105742106200521030340200141186a2207200341186a290000370300200141106a2208200341106a290000370300200141086a2209200341086a290000370300200120032900003703004110101f2202450d02200241086a41002900a49b403700002002410029009c9b40370000200241104120101e2202450d03200220003600102002412041c000101e2202450d04200341206a2103200220012903003700142002412c6a2007290300370000200241246a20082903003700002002411c6a2009290300370000200141306a41086a220742003703002001420037033020024134200141306a1001200141206a41086a200729030037030020012001290330370320200141206a411010092002101d200641606a22060d000b0b02402004450d002005101d0b200141c0006a24000f0b411041011020000b412041011020000b41c00041011020000b411a41011020000b413441011020000b411341011020000b412641011020000b890303047f017e027f230041306b22032400200341206a41086a220442003703002003420037032020002001200341206a1001200341086a41086a20042903003703002003200329032037030820034100360228200342013703202002280200210120032002280208220236021c2003411c6a200341206a106202400240024002402002450d002002410374210520042802002102200328022421060340200129030021070240024002400240200620026b41084f0d00200241086a22002002490d0720064101742208200020002008491b22094100480d072006450d01200328022020062009101e22080d020c080b200241086a2100200328022021080c020b2009101f2208450d060b2003200936022420032008360220200921060b200141086a210120042000360200200820026a200737000020002102200541786a22050d000c020b0b2004280200210020032802242106200328022021080b200341086a411020082000100302402006450d002008101d0b200341306a24000f0b1021000b200941011020000bc20304027f017e087f017e230041106b220224002002200110d50102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b102e000b200541081020000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001002220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c101e22060d010c060b200c101f2206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d002006101d0b200241106a24000f0b1021000b200c41081020000bb50d03017f017e097f230041d0006b2204240042002105200441206a41086a220642003703002004420037032041eb96c100411d200441206a1001200441086a220720062903003703002004200429032037030002400240024002400240024002400240024002402004411041f8b3c200410041001002417f460d002004421037021420042004360210200441206a200441106a10a90120042903304202510d0102402004280244450d00200441c0006a280200101d0b200041046a280200450d092000280200101d200441d0006a24000f0b2006420037030020044200370320418cb9c000410d200441206a100120072006290300370300200420042903203703000240024002402004411041f8b3c200410041001002417f460d002004420037032020044110200441206a41084100100241016a41084d0d01200429032021050b02402002a74101470d00200441206a41086a2206420037030020044200370320418897c100411a200441206a1001200441086a20062903003703002004200429032037030002402004411041f8b3c200410041001002417f460d002004420037032020044110200441206a41084100100241016a41084d0d0320042903202005580d00200041046a280200450d0c2000280200101d200441d0006a24000f0b200441206a41086a2206420037030020044200370320418897c100411a200441206a1001200441086a2006290300370300200420042903203703002004200142018620057c37032020044110200441206a410810030b200028020821062000280204210820002802002109200441206a41086a220042003703002004420037032041eb96c100411d200441206a1001200441086a20002903003703002004200429032037030020044100360228200442013703204108101f2200450d032004428880808080013702242004200036022020002005370000200041084110101e2200450d04200442908080808002370224200020013700082004200036022020042006360210200441106a200441206a106202400240024002402006450d002009200641286c6a210a200441206a41086a220b280200210c2004280224210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d062007410174220d20062006200d491b220e4100480d062007450d0120042802202007200e101e220d0d020c070b200c41206a21062004280220210d0c020b200e101f220d450d050b2004200e3602242004200d360220200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d032007410174220e200c200c200e491b220c4100480d03024002402007450d00200d2007200c101e220d0d010c070b200c101f220d450d060b2004200c3602242004200d360220200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441286a28020021002004280224210702400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0c20004101742207200620062007491b22074100480d0c2000450d03200428022020002007101e22060d040c140b20072000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d05200428022020002007101e22060d060c140b200428022021060c030b20042802202106200721070c050b2007101f2206450d100b20042007360224200420063602200b200441206a41086a220b200041016a220d360200200620006a41013a000002402007200d6b41074b0d00200d41086a220c200d490d072007410174220e200c200c200e491b220c4100480d072007450d0420062007200c101e22060d050c110b2007210c0c050b2007101f2206450d0e0b20042007360224200420063602200b200441286a200041016a220d360200200620006a41003a0000200441102006200d10032007450d0f0c0e0b200c101f2206450d0c0b2004200c360224200420063602200b200b200041096a22003602002006200d6a200337000020044110200620001003200c0d0b0c0c0b1021000b200e41011020000b200c41011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b410841011020000b411041011020000b200741011020000b200741011020000b200c41011020000b2006101d0b2008450d002009101d0b200441d0006a24000bc20306037f017e017f027e017f027e230041106b22022400200242003703002001410020012802002001280204200241082001280208100222032003417f461b2203410820034108491b20012802086a22043602080240024002400240200341074d0d002002290300210520024200370300200141086a220641002001280200200141046a280200200241082004100222032003417f461b2203410820034108491b20062802006a360200200341074d0d00200229030021072002200110a40120022802002204450d0020022902042108200241003a00002001280200200141046a28020020024101200141086a22032802001002210620032003280200200641016a41014b22066a22093602002006450d0120022d00004101470d014200210a20024200370300200141086a220341002001280200200141046a280200200241082009100222012001417f461b2201410820014108491b20032802006a360200200141074d0d022002290300210b4201210a0c030b20004202370310200241106a24000f0b4200210a0b0b2000200b3703182000200a3703102000200737030820002005370300200041246a2008370200200041206a2004360200200241106a24000bc60303027f017e097f230041106b220224002002200110d50102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b102e000b200541041020000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100222052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d101e22060d010c060b200d101f2206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d002006101d0b200241106a24000f0b1021000b200d41041020000b880301097f230041306b22012400200141206a41086a220242003703002001420037032041bcbcc1004112200141206a1001200141086a41086a20022903003703002001200129032037030820014100360228200142013703202000280200210320012000280208220036021c2001411c6a200141206a106202400240024002402000450d002000410274210420022802002100200128022421050340200328020021060240024002400240200520006b41044f0d00200041046a22072000490d0720054101742208200720072008491b22094100480d072005450d01200128022020052009101e22080d020c080b200041046a2107200128022021080c020b2009101f2208450d060b2001200936022420012008360220200921050b200341046a210320022007360200200820006a2006360000200721002004417c6a22040d000c020b0b2002280200210720012802242105200128022021080b200141086a411020082007100302402005450d002008101d0b200141306a24000f0b1021000b200941011020000bb60202047f027e230041206b22022400200241106a41086a220342003703002002420037031041aeb9c0004116200241106a1001200241086a22042003290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b200342003703002002420037031041aeb9c0004116200241106a100120042003290300370300200220022903103703002002427f200620017c200720007c22002007542203ad7c22072003200720065420072006511b22031b3703182002427f200020031b37031020024110200241106a41101003200241206a24000f0b41df88c0004133103a000b990201037f230041306b220224000240024002404117101f2203450d002003410f6a41002900f89c40370000200341086a41002900f19c40370000200341002900e99c4037000020034117412e101e2203450d0120032001370017200241206a41086a22044200370300200242003703202003411f200241206a1001200241086a200429030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a10970120022802202204450d0420002002290224370204200020043602000c010b20004100360208200042083702000b2003101d200241306a24000f0b411741011020000b412e41011020000b41df88c0004133103a000b9d0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021062024002400240024002402000450d00200041e8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410f470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007101e22060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007101e22060d060c0c0b200228020021060c030b200228020021060c050b2007101f2206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341e8006a2103200441987f6a22040d030c040b2007101f2206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a00002003200210b201200341e0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000101e22060d020c090b200228020021060c020b2000101f2206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341e8006a2103200441987f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100302402000450d002003101d0b200241106a24000f0b1021000b200741011020000b200741011020000b200041011020000bf60201037f230041306b22022400024002404110101f2203450d00200341086a410029009dba4037000020034100290095ba40370000200341104120101e2203450d0120032001370010200241106a41086a220442003703002002420037031020034118200241106a1001200241086a2004290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200241106a41186a4200370300200241106a41106a4200370300200241186a42003703002002420037031020024110200241106a4120410010022204417f460d022004411f4d0d0220002002290310370000200041186a200241106a41186a290300370000200041106a200241106a41106a290300370000200041086a200241106a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b2003101d200241306a24000f0b41df88c0004133103a000b411041011020000b412041011020000b890201027f230041306b22022400024002400240410f101f2203450d00200341076a41002900b4bf41370000200341002900adbf413700002003410f411e101e2203450d012003200136000f200241206a41086a220142003703002002420037032020034113200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a105e20022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b410f41011020000b411e41011020000b41df88c0004133103a000bc10903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d05200128020020002005101e2204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d08200128020020042000101e2204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000101e22040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004101e22070d0a0c110b2005101f22040d130b200541011020000b200128020021040c050b200128020021070c070b2000101f22040d0d0b200041011020000b2000101f2204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b2004101f2207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008101e22050d020c060b200128020021050c020b2008101f2205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b1021000b200841011020000b41c0dac300102c000b2002200241086a360240200241f0c0c100360244200241c8006a41146a4100360200200241286a41146a411c360200200241346a411d360200200241106a41146a4103360200200241f8b3c2003602582002420137024c200241d8dac3003602482002411d36022c20024203370214200241e0b0c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41e0dac30010cf01000b200041011020000b200441011020000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000ba1ce0103067f017e047f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002203450d0020034101460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110b101200028020022034101470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00000240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024020034102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a28020021030b024020034103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41023a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041106a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22052003490d1220044101742203200520052003491b22034100480d122004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41043a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024002400240024002400240024020034106470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1820034101742205200420042005491b22044100480d182003450d01200128020020032004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41053a00002000410c6a28020021032002200041146a280200220536020c2002410c6a2001106202402005450d002003200541186c6a2109200141046a210703402003280200210a2002200341086a280200220536020c2002410c6a2001106202400240024002402007280200220b200428020022066b20054f0d00200620056a220c2006490d19200b4101742206200c200c2006491b22064100480d19200b450d012001280200200b2006101e220b0d020c070b2001280200210b0c020b2006101f220b450d050b2001200b36020020072006360200200428020021060b2004200620056a360200200b20066a200a200510ce031a2003410c6a280200210a2002200341146a280200220536020c2002410c6a2001106202400240024002402007280200220b200428020022066b20054f0d00200620056a220c2006490d19200b4101742206200c200c2006491b22064100480d19200b450d012001280200200b2006101e220b0d020c080b2001280200210b0c020b2006101f220b450d060b2001200b36020020072006360200200428020021060b2004200620056a360200200b20066a200a200510ce031a200341186a22032009470d000b0b200041086a28020021030b20034107470d04024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1520034101742205200420042005491b22054100480d152003450d01200128020020032005101e2204450d020c050b200128020021040c050b2005101f22040d030b200541011020000b200641011020000b200641011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41063a00002000410c6a28020021052002200041146a280200220336020c2002410c6a200110622003450d0020052003410c6c6a2109200141046a210a03402005280200210b2002200541086a280200220336020c2002410c6a200110620240024002400240200a2802002207200628020022046b20034f0d00200420036a220c2004490d1320074101742204200c200c2004491b22044100480d132007450d01200128020020072004101e22070d020c060b200128020021070c020b2004101f2207450d040b20012007360200200a2004360200200628020021040b2006200420036a360200200720046a200b200310ce031a2005410c6a22052009470d000b0b200028020022034102470d020c030b200441011020000b20034102460d010b20034103460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200028020022034103470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200041086a2802004101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0f20034101742206200420042006491b22064100480d0f2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f302200041086a2802004102470d010b02400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f3022002200041c0006a36020c2002410c6a200110f3020b41042104200028020022034104470d010c020b4104210420034104460d010b20034105460d010c020b02400240024002400240200120046a280200200141086a2802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00000240200041086a22032d000022044101470d0002400240024002400240200141046a28020020052802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41003a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0b20054101742204200620062004491b22044100480d0b2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000020032d000021040b0240200441ff01714102470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41013a0000200041106a200110b10120032d000021040b0240200441ff01714103470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41023a000002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341016a2d00003a00000b200028020022034105470d010b02400240024002400240200141046a220b280200200141086a22052802002203470d00200341016a22042003490d0920034101742206200420042006491b22064100480d092003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41053a00000240024002400240024002400240200041086a2d000022034101470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d1020034101742206200420042006491b22064100480d102003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f302024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200b28020020052802002203470d03200341016a22042003490d1a20034101742206200420042006491b22064100480d1a2003450d08200128020020032006101e22040d090c110b200b28020020052802002203470d01200341016a22042003490d1920034101742206200420042006491b22064100480d192003450d04200128020020032006101e22040d050c0f0b200b28020020052802002203470d02200341016a22042003490d1820034101742206200420042006491b22064100480d182003450d09200128020020032006101e22040d0a0c100b200128020021040c040b200128020021040c060b200128020021040c080b2006101f2204450d0a0b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41013a00000c060b2006101f2204450d080b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41023a00000c030b2006101f2204450d060b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41003a00000b200041086a2d000021030b200341ff01714102470d05024002400240200b28020020052802002203470d00200341016a22042003490d0d20034101742206200420042006491b22064100480d0d2003450d01200128020020032006101e2204450d020c060b200128020021040c060b2006101f22040d040b200641011020000b200641011020000b200641011020000b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714103470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714104470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41033a0000200041086a2d000021030b0240200341ff01714105470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110622002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714106470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220436020c2002410c6a2001106202402004450d00200441246c210403402003200110bc02200341246a21032004415c6a22040d000b0b200041086a2d000021030b0240200341ff01714107470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41063a0000200041086a2d000021030b0240024002400240024002400240200341ff01714108470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d1020034101742206200420042006491b22064100480d102003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41073a000002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200b28020020052802002203470d03200341016a22042003490d1920034101742206200420042006491b22064100480d192003450d08200128020020032006101e22040d090c100b200b28020020052802002203470d01200341016a22042003490d1820034101742206200420042006491b22064100480d182003450d04200128020020032006101e22040d050c0e0b200b28020020052802002203470d02200341016a22042003490d1720034101742206200420042006491b22064100480d172003450d09200128020020032006101e22040d0a0c0f0b200128020021040c040b200128020021040c060b200128020021040c080b2006101f2204450d090b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41013a00000c060b2006101f2204450d070b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41023a00000c030b2006101f2204450d050b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41003a00000b200041086a2d000022034109470d05024002400240200b28020020052802002203470d00200341016a22042003490d0d20034101742206200420042006491b22064100480d0d2003450d01200128020020032006101e2204450d020c060b200128020021040c060b2006101f22040d040b200641011020000b200641011020000b200641011020000b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110bc02200041086a2d000021030b0240200341ff0171410a470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110b101200041086a2d000021030b0240200341ff0171410b470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041106a200110b101200041086a2d000021030b0240200341ff0171410c470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a20011062200041086a2d000021030b0240200341ff0171410d470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a410c3a000002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a200041096a2d00003a0000200041086a2d000021030b0240200341ff0171410e470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410d3a00002000410c6a20011062200041086a2d000021030b02400240200341ff0171410f470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0b20034101742206200420042006491b22064100480d0b2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a220c200341016a360200200420036a410e3a00002000410c6a28020021032002200041146a280200220436020c2002410c6a200110622004450d0020044105742107200141046a210903400240024002400240200b2802002206200528020022046b41204f0d00200441206a220a2004490d0b20064101742204200a200a2004491b22044100480d0b2006450d01200128020020062004101e22060d020c060b200128020021060c020b2004101f2206450d040b2001200636020020092004360200200c28020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200028020022034106470d020c030b200441011020000b20034106460d010b20034107460d010c050b02400240024002400240200141046a2206280200200141086a22032802002204470d00200441016a22052004490d0620044101742207200520052007491b22074100480d062004450d01200128020020042007101e2205450d020c030b200128020021050c030b2007101f22050d010b200741011020000b20012005360200200141046a2007360200200141086a28020021040b2003200441016a360200200520046a41063a00000240200041086a22052d000022044101470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41003a00002000410c6a280200200110b2012002200041106a36020c2002410c6a200110f302200041086a2d000021040b0240200441ff01714102470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41013a00002000410c6a2001106220052d000021040b0240200441ff01714103470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a220b200441016a360200200720046a41023a00002000410c6a2001106202400240024002400240200141046a280200200b2802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541016a2d00003a000020052d000021040b0240200441ff01714104470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a220b200441016a360200200720046a41033a00002000410c6a2001106202400240024002400240200141046a280200200b2802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541016a2d00003a000020052d000021040b0240200441ff01714105470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41043a00002000410c6a280200200110b20102400240024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022044101460d0020044102470d01200628020020032802002204470d03200441016a22072004490d162004410174220b20072007200b491b220b4100480d162004450d0820012802002004200b101e22070d090c100b200628020020032802002204470d01200441016a22072004490d152004410174220b20072007200b491b220b4100480d152004450d0420012802002004200b101e22070d050c0e0b200628020020032802002204470d02200441016a22072004490d142004410174220b20072007200b491b220b4100480d142004450d0920012802002004200b101e22070d0a0c0f0b200128020021070c040b200128020021070c060b200128020021070c080b200b101f2207450d090b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41013a00000c060b200b101f2207450d070b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41023a00000c030b200b101f2207450d050b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41003a00000b200041106a290300210802400240024020062802002207200328020022046b41084f0d00200441086a220b2004490d0a20074101742204200b200b2004491b22044100480d0a2007450d01200128020020072004101e2207450d020c060b200128020021070c060b2004101f22070d040b200441011020000b200b41011020000b200b41011020000b200b41011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441086a360200200720046a200837000020052d000021040b0240200441ff01714106470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41053a00002000410c6a2001106220052d000021040b0240200441ff01714107470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41063a0000200041106a200110b1012000410c6a2001106220052d000021040b0240200441ff01714108470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41073a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000020052d000021040b0240200441ff01714109470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41083a000020052d000021040b0240200441ff0171410a470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41093a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000020052d000021040b0240200441ff0171410b470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a410a3a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541216a2d00003a000020052d000021040b0240200441ff0171410c470d0002400240024002400240200628020020032802002204470d00200441016a22052004490d0720044101742206200520052006491b22064100480d072004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a410b3a00000b200028020022034107470d040b024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b1021000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000024002400240024002400240024002400240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1b20034101742205200420042005491b22054100480d1b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001106202402007450d00200141046a210b03400240024002400240200b28020020052802002203470d00200341016a22062003490d1c2003410174220a20062006200a491b220a4100480d1c2003450d0120012802002003200a101e22060d020c070b200128020021060c020b200a101f2206450d050b20012006360200200b200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a20011062200041086a28020021030b20034102470d03024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1820034101742205200420042005491b22054100480d182003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b200a41011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001106202402007450d00200141046a210b03400240024002400240200b28020020052802002203470d00200341016a22062003490d182003410174220a20062006200a491b220a4100480d182003450d0120012802002003200a101e22060d020c070b200128020021060c020b200a101f2206450d050b20012006360200200b200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a20011062200041086a28020021030b20034103470d03024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b200a41011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011062200041106a200110bc02200041346a20011062200041386a20011062200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011062200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011062200041086a28020021030b024020034106470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110bc022002200041386a36020c2002410c6a200110f302200041306a20011062200041086a28020021030b024020034107470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a20011062200041086a28020021030b024020034108470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110bc02200041086a28020021030b024020034109470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a200110b101200041086a28020021030b02402003410a470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110b1010b41082104200028020022034108470d010c020b4108210420034108460d010b20034109460d010c020b02400240024002400240200141046a280200200120046a2802002203470d00200341016a22052003490d0f20034101742206200520052006491b22064100480d0f2003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41083a00000240200020046a22032d000022044101470d0002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41003a00002000410c6a280200200110b201200041086a2d000021040b0240200441ff01714102470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1020054101742204200620062004491b22044100480d102005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341216a2d00003a000020032d000021040b0240200441ff01714103470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41023a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1020054101742204200620062004491b22044100480d102005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000020032d000021040b0240200441ff01714104470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41033a0000200041106a200110b10120032d000021040b0240200441ff01714105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1020034101742205200420042005491b22054100480d102003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041106a200110b1010b200028020022034109470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240200041046a22032d00004101470d0002400240024002400240200141046a28020020052802002204470d00200441016a22062004490d1020044101742207200620062007491b22074100480d102004450d01200128020020042007101e2206450d020c030b200128020021060c030b2007101f22060d010b200741011020000b20012006360200200141046a2007360200200141086a28020021040b200141086a200441016a360200200620046a41003a0000200041086a200110622000410c6a280200200110b201200041046a2d00004102470d010b02400240024002400240200141046a28020020052802002204470d00200441016a22052004490d0f20044101742206200520052006491b22064100480d0f2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a29000037000020042003290001370000200041286a2001106202400240024002400240200141046a28020020062802002204470d00200441016a22052004490d0f20044101742206200520052006491b22064100480d0f2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341216a2d00003a00000b20002802002203410a470d010c020b2003410a460d010b2003410b460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110b10120002802002203410b470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a0000200041046a280200210720022000410c6a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d0a20054101742204200620062004491b22044100480d0a2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a20002802002203410c470d010c020b2003410c460d010b2003410d460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0720034101742205200420042005491b22054100480d072003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a00000240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a200110f3022000410c6a200110bc02200041086a28020021030b024020034102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a200110f302200041086a28020021030b024020034103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110622002200041186a36020c2002410c6a200110f302200041286a200110b101200041106a20011062200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011062200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a200110620b2000280200410d470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0620034101742205200420042005491b22054100480d062003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a00000240200041086a22042d000022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a0000200041d0006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200520036a2007360000200041106a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041186a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041206a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041286a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041306a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041386a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041c0006a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041c8006a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041d4006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200520036a2007360000200041d8006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200520036a200736000020042d000021030b0240200341ff01714102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2207200341016a360200200520036a41013a0000200041186a200110b1012000410c6a280200210b2002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002206200728020022056b20034f0d00200520036a22072005490d0720064101742205200720072005491b22054100480d072006450d01200128020020062005101e2206450d020c030b200128020021060c030b2005101f22060d010b200541011020000b20012006360200200141046a2005360200200141086a28020021050b200141086a200520036a360200200620056a200b200310ce031a20042d000021030b0240200341ff01714103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2207200341016a360200200520036a41023a00002000410c6a200110bc022002200041c0006a36020c2002410c6a200110f302200041d0006a200110b101200041306a280200210b2002200041386a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002206200728020022056b20034f0d00200520036a22072005490d0720064101742205200720072005491b22054100480d072006450d01200128020020062005101e2206450d020c030b200128020021060c030b2005101f22060d010b200541011020000b20012006360200200141046a2005360200200141086a28020021050b200141086a200520036a360200200620056a200b200310ce031a20042d000021030b200341ff01714104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0620034101742206200520052006491b22064100480d062003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41033a00002002200041386a36020c2002410c6a200110f302200041c8006a200110b10102400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d0620054101742203200620062003491b22034100480d062005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a290000370000200320042900013700002000412c6a28020021072002200041346a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d0620054101742204200620062004491b22044100480d062005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a0b2000280200410e470d0302400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a0000024020002802044101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0620034101742206200420042006491b22064100480d062003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a280200200110b201200041046a2802004102470d040b024002400240200141046a28020020052802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b1021000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110bc020b200241106a24000bb70201027f0240024002400240024002402000280200220141064b0d0020010e0705010502050304050b02402000410c6a2802002202450d00200028020421012002410c6c210203400240200141046a280200450d002001280200101d0b2001410c6a2101200241746a22020d000b0b200041086a280200450d04200041046a280200101d0f0b200041086a280200450d032000280204101d0f0b200041086a280200450d022000280204101d0f0b200041086a280200450d012000280204101d0f0b02402000410c6a2802002202450d0020002802042101200241186c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200241686a22020d000b0b200041086a280200450d00200041046a280200101d0f0b0bef1004047f017e087f037e230041b0046b22022400200241106a200110b5010240024002400240024002400240024002402002280210450d00200241003a00880220024188026a2001280200220320012802042204410047220510ce031a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d008802220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b200241a8016a200110b60102400240024020022d00a8014102460d00200241c8036a41206a200241a8016a41206a280200360200200241c8036a41186a200241a8016a41186a290300370300200241c8036a41106a200241a8016a41106a290300370300200241c8036a41086a200241a8016a41086a290300370300200220022903a8013703c80320024188026a41386a2207420037030020024188026a41306a2208420037030020024188026a41286a2209420037030020024188026a41206a220a420037030020024188026a41186a220b420037030020024188026a41106a220c420037030020024188026a41086a220d4200370300200242003703880220024188026a20012802002203200141046a220e280200220441c000200441c000491b220510ce031a200e200420056b3602002001200320056a3602002004413f4d0d00200241f0036a41386a2007290300370300200241f0036a41306a2008290300370300200241f0036a41286a2009290300370300200241f0036a41206a200a290300370300200241f0036a41186a200b290300370300200241f0036a41106a200c290300370300200241f0036a41086a200d29030037030020022002290388023703f00320022001105a2002280200450d002002290308210f200141046a220e2802002104200241003a00880220024188026a200128020022072004410047220510ce031a20042005490d04200e200420056b22033602002001200720056a22053602002004450d002002310088022210500d01200241003a00880220024188026a20052003410047220410ce031a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d00420121062002310088024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024180016a41206a200241c8036a41206a28020036020020024180016a41186a200241c8036a41186a29030037030020024180016a41106a200241c8036a41106a29030037030020024180016a41086a200241c8036a41086a290300370300200241e8026a41086a200241f0036a41086a290300370300200241e8026a41106a200241f0036a41106a290300370300200241e8026a41186a200241f0036a41186a290300370300200241e8026a41206a200241f0036a41206a290300370300200241e8026a41286a200241f0036a41286a290300370300200241e8026a41306a200241f0036a41306a290300370300200241e8026a41386a200241f0036a41386a290300370300200220022903c80337038001200220022903f0033703e8020c030b20052004102a000b20052004102a000b20042003102a000b200241a8016a41206a220420024180016a41206a280200360200200241a8016a41186a220520024180016a41186a290300370300200241a8016a41106a220320024180016a41106a290300370300200241a8016a41086a220e20024180016a41086a29030037030020024188026a41086a2207200241e8026a41086a29030037030020024188026a41106a2208200241e8026a41106a29030037030020024188026a41186a2209200241e8026a41186a29030037030020024188026a41206a220a200241e8026a41206a29030037030020024188026a41286a220b200241e8026a41286a29030037030020024188026a41306a220c200241e8026a41306a29030037030020024188026a41386a220d200241e8026a41386a29030037030020022002290380013703a801200220022903e80237038802024020064202520d0020004203370370200241b0046a24000f0b200241d8006a41206a2004280200360200200241d8006a41186a2005290300370300200241d8006a41106a2003290300370300200241d8006a41086a200e290300370300200241186a41086a2007290300370300200241186a41106a2008290300370300200241186a41186a2009290300370300200241186a41206a200a290300370300200241186a41286a200b290300370300200241186a41306a200c290300370300200241186a41386a200d290300370300200220022903a80137035820022002290388023703180b20024188026a200110b7012002280288022101200241e8026a20024188026a41047241dc0010ce031a02402001410f470d0020004203370370200241b0046a24000f0b200241a8016a200241e8026a41dc0010ce031a2000200f37030020002002290358370308200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a2802003602002000200229031837022c200041346a200241186a41086a2903003702002000413c6a200241186a41106a290300370200200041c4006a200241186a41186a290300370200200041cc006a200241186a41206a290300370200200041d4006a200241186a41286a290300370200200041dc006a200241c8006a290300370200200041e4006a200241d0006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241a8016a41dc0010ce031a200241b0046a24000bca0301077f230041106b22022400200241003a0003200241036a2001280200220320012802042204410047220510ce031a0240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d000240024020022d0003220341037122044102460d00024020044101460d0020040d0220034102762101410121040c050b200241003a000b2002410b6a20052006410047220410ce031a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d000b4108742003724102762101410121040c040b41002104200241003a000e200241003b010c2002410c6a200520064103200641034922071b220810ce031a200141046a200620086b3602002001200520086a36020020070d0320022f010c20022d000e411074724108742003724102762101410121040c030b200341034b0d004100210420024100360204200241046a200520064104200641044922081b220310ce031a200141046a200620036b3602002001200520036a36020020080d0120022802042101410121040c020b410021040b0b2000200136020420002004360200200241106a24000f0b20052004102a000b20042006102a000b870801067f230041f0006b22022400200241003a0050200241d0006a2001280200220320012802042204410047220510ce031a02400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0020022d0050220441ef014b0d010c030b200041023a0000200241f0006a24000f0b02400240024002400240200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b220410ce031a200141046a200620046b3602002001200520046a360200200641014d0d0420022f0150220441ef014b0d09200041023a0000200241f0006a24000f0b20024100360250200241d0006a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d04410121012002280250220441ffff034b0d09200041023a0000200241f0006a24000f0b200041023a0000200141046a20062006410420064104491b22006b3602002001200520006a360200200241f0006a24000f0b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd031a200241d0006a2005200410ce031a200141046a200620046b3602002001200520046a3602002006411f4d0d032002412c6a41026a200241d0006a41026a2d00003a0000200241186a200241df006a290000370300200241206a200241e7006a290000370300200241286a200241d0006a411f6a2d00003a0000200220022f00503b012c2002200229005737031020022800532104410121030c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2205200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402003450d002002410c6a41026a20012d00003a0000200241d0006a41086a2005290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c030b200041023a0000200241f0006a24000f0b20052004102a000b410121010b200020022f010c3b0001200020013a0000200041046a2004360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000bb4820105067f057e047f037e097f230041e0096b22022400200241003a00800920024180096a2001280200220320012802042204410047220510ce031a02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d0080092204410e4b0d07024020040e0f000b0709040c0e0a10060f03050d02000b200241003a00800920024180096a20052006410047220410ce031a20062004490d9301200141046a200620046b3602002001200520046a3602002006450ddc0120022d008009450d130cdc010b2000410f360200200241e0096a24000f0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450d1420022d00800922044101460d1320040d1420024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d14200241c0076a200241a0086a41dc0010ce031a41e000101f2201450da60120012004360200200141046a200241c0076a41dc0010ce031a20014108762105410121040c250b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450dd80120022d008009450d0f0cd8010b200241003a00800920024180096a20052006410047220410ce031a20062004490d920141042103200141046a200620046b22073602002001200520046a22043602002006450d1c20022d00800922054102460d1b20054101460d1a20050d1c20024180096a2007412020074120491b22056a41004100412020056b2005411f4b1b10cd031a20024180096a2004200510ce031a41042103200141046a200720056b3602002001200420056a3602002007411f4d0d1c20024198076a41086a220520024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921012002280083092104200229008f0921082002290087092109200241f8066a41086a220620052d00003a0000200220022f01be0722053b01bc0720022002290398073703f806200241a0086a41086a20062d00003a0000200220053b01e806200220022903f8063703a0082009422088a721052009a72106410121030c1e0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450d2920022d008009220441044b0d29024020040e050027252624000b200241e0046a200110f20220022903e004a7450d29200241f0046a290300210820022903e804210920024180096a200110b60120022d00800922044102460d292002419c096a290200210a2002418c096a290200210b20022f008109210120022d0083092105200229028409210c200220024194096a2902003703b0082002200b3703a8082002200c3703a00820012005411074722101410121050c280b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b22033602002001200520046a22043602002006450d1220022d00800922054101460d114103210420050d13200241b8046a200110b50120022802b804450d1320022802bc04210520024180096a200110b7012002280280092106200241a0086a20024180096a41047241dc0010ce031a2006410f460d13200241c0076a200241a0086a41dc0010ce031a41e000101f2201450da90120012006360200200141046a200241c0076a41dc0010ce031a410121040c140b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002000410f360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450d1420022d00800922044101460d1220040d1420024180096a200110b60120022d00800922044102460d1420022d008309210d20022f008109210e2002419c096a290200210820024198096a280200210520024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092109200241c8006a200110f2022002280248450d14200e200d411074722101200241c8006a41106a290300210a4101210d2002290350210b0c130b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450d6620022d008009220441094b0d66024020040e0a00353233303738343a31000b20024180096a200110ba022002280280092204450d66200229028409210820024198036a200110b5012008a72105200228029803450d65200228029c03210d200541087621012004410876210f20084220882108410121100c350b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22073602002006450d810120022d008009220541064b0d810141022106024020050e0700d0012b2c2a2d2e000b200241186a200110b5012002280218450d8101200228021c2205417f4c0d97012005450d6d200510792204450daa0120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490dab012003200720066b3602002001200128020020066a36020020062005470d6e0cce010b200241003a00800920024180096a20052006410047220410ce031a20062004490d910141042103200141046a200620046b22073602002001200520046a22103602002006450dbd0120022d0080092206410e4b0dbd01024020060e0f0053547950585b565d525e4f51594e000b20024180096a200110b60120022d00800922044102460dbd0120022d008309210f20022f00810921102002419c096a290200210820024198096a280200210e20024194096a280200210520024180096a41106a350200210c2002418c096a35020021112002290284092109200241a0016a200110f20220022903a001a7450dbd01200241a0016a41106a290300210b20022903a801210a200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490db7012007200620036b3602002001200d20036a3602002006450dbd0120022d008009220d41024b0dbd012010200f41107472210f200c422086201184210c410121030c780b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22053602002006450d034105210420022d008009220641034b0dc801024020060e0400191718000b200241003602800920024180096a20052003410420034104491b220610ce031a200141046a220d200320066b22073602002001200520066a2205360200200341034d0dc8012002280280092103200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc8012002290380092109200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092108200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc801200229038009210a200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc801200229038009210b200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc801200229038009210c200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092111200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc8012002290380092112200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092113200241003602800920024180096a20052007410420074104491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741034d0dc8012002280280092107200241003602800920024180096a2005200e4104200e4104491b220610ce031a200141046a200e20066b3602002001200520066a360200200e41034d0dc8012002280280092101200220133703b008200220123703a808200220113703a008410121040cc9010b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b220e3602002001200520046a220f3602002006450d5e20022d0080092210410b4b0d5e41092104024020100e0c004344414748464bbe01424a40000b20024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d5e200241c0076a200241a0086a41dc0010ce031a41e000101f2205450db10120052004360200200541046a200241c0076a41dc0010ce031a200241c8026a200110f20220022903c802a7450d5d200241d8026a290300210820022903d0022209422088a721032009a72107410121040c600b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450dc90120022d008009450d050cc9010b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22053602002006450d014106210420022d008009220641044b0dc201024020060e050024212220000b20024180096a200110b7012002280280092101200241a0086a20024180096a41047241dc0010ce031a2001410f460dc201200241c0076a200241a0086a41dc0010ce031a41e000101f2205450da10120052001360200200541046a200241c0076a41dc0010ce031a410121040cc4010b410521040cc4010b410621040cc0010b200241d8046a200110b50120022802d804450dc80120022802dc042204417f4c0d8f012004450d34200410792206450d980120062001280200200141046a22032802002205200420052004491b220510ce031a200328020022072005490d99012003200720056b3602002001200128020020056a36020020052004470d350cbe010b200241086a2001105a2002290308a7450dc8012002290310210820004100360200200041086a2008370300200241e0096a24000f0b200241c8046a2001105a20022903c804a7450dc30120022903d00421082000410a360200200041086a2008370300200241e0096a24000f0b20024180096a200110b601200241a0086a41086a22062002418c096a290200370300200241a0086a41106a220320024194096a290200370300200241a0086a41186a22072002419c096a29020037030020022002290284093703a0084102210420022d00800922014102470d100b2000410f360200200241e0096a24000f0b20024180096a2003412020034120491b22056a41004100412020056b2005411f4b1b10cd031a20024180096a2004200510ce031a200141046a200320056b3602002001200420056a3602002003411f4d0d00200241f8066a41086a220420024180096a411f6a2d00003a0000200220022f0081093b01bc0720022002290097093703f80620022d00800921062002280083092105200229008f0921082002290087092109200241c0076a41086a20042d00003a0000200220022f01bc073b01fc08200220022903f8063703c007200241c0046a200110b5014103210420022802c004450d0120022802c4042103200141046a220e2802002107200241003a00800920024180096a2001280200220f2007410047220d10ce031a2007200d490d9801200e2007200d6b3602002001200f200d6a3602002007450d012009422088a721072009a7210120022d008009210d200241e8066a41086a200241c0076a41086a2d00003a0000200220022f01fc083b01f606200220022903c0073703e806410221040c020b410321040b0b20024180096a41086a220e200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe08024020044103470d002000410f360200200241e0096a24000f0b200241d8066a41086a220f200e2d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d606200020063a0005200020043a000420004109360200200041146a2008370200200041106a20073602002000410c6a2001360200200041086a20053602002000200d3a0025200041286a2003360200200020022f01e4063b00062000411c6a20022903d806370200200041246a200f2d00003a0000200020022f01d6063b0126200241e0096a24000f0b20024180096a200110b60120022d00800922044102460d0120022d008309210d20022f008109210e2002419c096a290200210820024198096a280200210520024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092109200241f8006a200110f2022002290378a7450d01200241f8006a41106a290300210a200229038001210b200241e0006a200110f2022002290360a7450d01200e200d411074722101200241f0006a29030021112002290368210c4102210d0b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a200c370200200041386a200a370200200041306a200b370200200041286a2008370000200041246a2005360000200041206a20063600002000411c6a2003360000200041186a2007360000200041106a20093700002000410c6a20043a0000200041086a200d360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b20024190016a2001105a200229039001a7450d012002290398012208422088a721052008a72106410221030c020b200241003a00800920024180096a20042007410047220510ce031a20072005490d840141042103200141046a200720056b3602002001200420056a3602002007450d0020022d0080092101410321030c020b0b0b20024180096a41086a2207200241a0086a41086a2d00003a0000200220022f01e8063b019807200220022903a00837038009200220022f01d8063b01fe08024020034104470d002000410f360200200241e0096a24000f0b200241c0076a41086a220d20072d00003a0000200220022f0198073b01fc0820022002290380093703c007200220022f01fe083b01f606200020013a0009200041086a20033a000020004104360200200041186a2008370200200041146a2005360200200041106a20063602002000410c6a2004360200200020022f01fc083b000a200041206a20022903c007370000200041286a200d2d00003a0000200020022f01f6063b012a200241e0096a24000f0b20024180096a200110b60120022d00800922064102460db10120022f00810920022d0083094110747221052002419c096a290200210b20024194096a290200210a2002418c096a2902002108200229028409210920024188066a200110f202200229038806a7450d6b20024188066a41106a290300210c2002290390062111200241f8056a2001105a20022903f805a7450d6b2002290380062112200241f0056a200110b50120022802f005450d6b20022802f4052203417f4c0d7e2003450d6920031079220d450da001200d2001280200200141046a220e2802002207200320072003491b220710ce031a200e280200220f2007490da101200e200f20076b3602002001200128020020076a36020020072003470d6a0cac010b200241b8066a200110f20220022903b806a7450db001200241c8066a290300210b20022903c006210c200241a8066a2001105a20022903a806a7450db00120022903b006211120024198096a420037030020024180096a41106a420037030020024188096a4200370300200242003703800920024180096a20012802002206200141046a22032802002204412020044120491b220510ce031a2003200420056b3602002001200620056a3602002004411f4d0d4c2002419a076a20022d0082093a0000200220022f0180093b01980720022d00830921062002290087092109200229008f092108200229009709210a200231009f09211220022f018409210420022d0086092105200241a0066a200110b501200420054110747221054105210420022802a006450da50120022802a4062203417f4c0d7d2003450d6b20031079220d450da101200d2001280200200141046a220e2802002207200320072003491b220710ce031a200e280200220f2007490da201200e200f20076b3602002001200128020020076a36020020072003470d6c0caa010b200241e0056a2001105a20022903e005a7450daf0120022903e8052108200241d8056a200110b50120022802d805450daf0120022802dc052203417f4c0d7c2003450d50200310792206450d910120062001280200200141046a22072802002205200320052003491b220510ce031a2007280200220d2005490d92012007200d20056b3602002001200128020020056a36020020052003470d510ca8010b20022f00810920022d00830941107472210520024198076a41186a200729030037030020024198076a41106a200329030037030020024198076a41086a2006290300370300200220022903a008370398070b200241f8066a41186a220620024198076a41186a290300370300200241f8066a41106a220320024198076a41106a290300370300200241f8066a41086a220720024198076a41086a29030037030020022002290398073703f806200041086a2005410874200141ff017172360200200020043602042000410e3602002000410c6a20022903f806370200200041146a20072903003702002000411c6a2003290300370200200041246a2006290300370200200241e0096a24000f0b200241d0056a200110b50120022802d005450d0520022802d40522044108762101410521050c030b200241c0056a200110b50120022802c005450d0420022802c4052104200241a8056a200110f20220022903a805a7450d04200241b8056a290300210820022903b005210920024198056a2001105a200229039805a7450d0420022903a005210a20024190056a200110b501200228029005450d042002280294052101200241b0086a2008370300200220093703a808200220013602a00820044108762101410321050c030b200241c8056a200110b50120022802c805450d0320022802cc0522044108762101410421050c010b200241f8046a200110f20220022903f804a7450d0220024188056a290300210820022002290380053703a008200220083703a808410221050b0b20024180096a41106a200241a0086a41106a290300220b37030020024180096a41086a200241a0086a41086a290300220c370300200241c0076a41086a2206200c370300200241c0076a41106a2203200b370300200220022903a008220b3703c0072002200b37038009200041386a2008370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410c360200200041286a200a370200200041106a20022903c007370200200041186a2006290300370200200041206a2003290300370200200241e0096a24000f0b20024180096a41106a200241a0086a41106a29030037030020024180096a41086a200241a0086a41086a290300370300200220022903a008370380092000410f360200200241e0096a24000f0b200241a8046a2001105a20022903a804a7450da20120022903b0042208422088a721012008a72106410521040c020b4100210620024180096a2003412020034120491b22076a41004100412020076b2007411f4b1b10cd031a20024180096a2005200710ce031a200141046a200320076b3602002001200520076a3602002003411f4d0d1820024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210d2002280083092105200229008f0921082002290087092109200241c0076a41086a20012d00003a0000200220022f01be073b01fc0820022002290398073703c0072009422088a721012009a72106410121030c190b20024198046a2001105a200229039804a7450da00120022903a0042208422088a721012008a72106410421040b0ca0010b4100210e20024180096a2003412020034120491b22066a41004100412020066b2006411f4b1b10cd031a20024180096a2005200610ce031a200141046a200320066b22073602002001200520066a22063602002003411f4d0d1720024198076a41086a220320024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210d20022800830921052002290087092109200229008f092108200241a0086a41086a20032d00003a0000200220022f01be073b01fe0820022002290398073703a0084101210e0c180b200241286a200110b5012002280228450d57200228022c2205417f4c0d6d2005450d3d200510792204450d840120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490d85012003200720066b3602002001200128020020066a36020020062005470d3e0c98010b200241206a200110b5012002280220450d5620022802242205417f4c0d6c2005450d3e200510792204450d850120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490d86012003200720066b3602002001200128020020066a36020020062005470d3f0c96010b200242003703800920024180096a20072003410820034108491b220410ce031a41042106200141046a200320046b3602002001200720046a360200200341074d0d5520022903800921080ca3010b200241c0006a200110b5012002280240450d5420022802442214ad42187e2208422088a70d6a2008a72205417f4c0d6a2005450d422005101f22040d43200541041020000b20024180096a200110ab022002280280092204450d532002290284092108410721060ca1010b200241c8036a200110b50120022802c803450d3620022802cc032204410876210f42002108410521100c080b20024188046a2001105a200229038804a7450d35200229039004220942208821082009a722054108762101410a21100c090b200241b8036a200110b50120022802b803450d3420022802bc03210420024180096a200110b60120022d00800922054102460d3420022d008309210d20022f008109210f2002419c096a290200210920024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092108200220024198096a2802003602a008200220093702a408200241b0036a200110b50120022802b003450d3420022802b403210e200241a8036a200110b50120022802a803450d34200f200d4110747221012008422088a7210d2009422088a721152004410876210f20022903a008210920022802ac03ad210a4200210b410321100c0a0b200241c0036a200110b50120022802c003450d3320022802c4032204410876210f42002108410421100c050b20024180096a200110b60120022d00800922044102460d3220022902840922094220882108410821102009a72205410876210120022f00810920022d00830941107472210f2002418c096a280200210d20024180096a41106a280200210720024194096a280200210320024198096a28020021062002419c096a29020021090c080b20024180096a200110ba022002280280092204450d312002290284092108200241a0036a200110b5012008a7210520022802a003450d3020022802a403210d200541087621012004410876210f20084220882108410221100b0c050b20024180096a200110b60120022d00800922044102460d2f20022d008309210520022f008109210e2002419c096a290200210920024198096a280200210620024194096a280200210320024180096a41106a28020021072002418c096a280200210d200229028409210c200241d8036a200110f20220022903d803a7450d2f200241d8036a41106a290300210b20022903e003210a200241d0036a200110b50120022802d003450d2f200e200541107472210f20022802d4032115200c4220882108200ca722054108762101410621100c050b200241f0036a200110b50120022802f003450d2e20022802f4032204410876210f42002108410721100b0c020b200241f8036a2001105a20022903f803a7450d2c200229038004220942208821082009a722054108762101410921100b0b0b20004107360200200041c0006a200b370200200041386a200a370200200041346a200e360200200041306a2015360200200041286a2009370200200041246a2006360200200041206a20033602002000411c6a2007360200200041186a200d360200200041086a20103602002000410c6a200f410874200441ff017172360200200041106a20084220862001ad42ffffff07834208862005ad42ff01838484370200200241e0096a24000f0b4101210641002004460d89010b2004450d92012006101d0c92010b41002101410021030b200241f8066a41086a2207200241c0076a41086a2d00003a0000200220022f01fc083b01bc07200220022903c0073703f80602402003450d00200241a0086a41086a220420072d00003a0000200220022f01bc0722033b01fe08200220022903f8063703a008200241e8066a41086a20042d00003a0000200220033b01f606200220022903a0083703e806410321040b0c89010b0b200241f8066a41086a2203200241a0086a41086a2d00003a0000200220022f01fe083b01bc07200220022903a0083703f8060240200e450d00200241c0076a41086a20032d00003a0000200220022f01bc073b01fc08200220022903f8063703c007200241003a00800920024180096a20062007410047220310ce031a20072003490d66200141046a200720036b3602002001200620036a3602002007450d0020022d0080092103200241e8066a41086a200241c0076a41086a2d00003a0000200220022f01fc083b01f606200220022903c0073703e8062009422088a721012009a72106410221040c88010b0c87010b410c21040c1f0b200241f0026a200110b501410d210420022802f002450d1e20022802f4022105200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490d6e2007200620036b3602002001200d20036a3602002006450d1e20022d0080092106410421040c030b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b3602002001200f20046a360200200e411f4d0d1c20024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921062002280083092105200229008f0921082002290087092109200241f8066a41086a220420012d00003a0000200220022f01be0722013b01bc0720022002290398073703f806200241a0086a41086a220320042d00003a0000200220013b01fe08200220022903f8063703a008200241c0076a41086a220420032d00003a0000200220013b01fc08200220022903a0083703c007200241e8066a41086a20042d00003a0000200220013b01f606200220022903c0073703e8062009422088a721032009a72107410a21040c7b0b200241e0026a200110b5014102410d20022802e0021b210420022802e40221050c050b200241e8026a200110b501410d210420022802e802450d1b20022802ec022105200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490d6c2007200620036b3602002001200d20036a3602002006450d1b20022d0080092106410321040b0c780b20024188036a2001105a410d2104200229038803a7450d19200229039003210820024180036a200110b501200228028003450d1920022802840321052008422088a721032008a72107410721040c1a0b20024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d17200241c0076a200241a0086a41dc0010ce031a41e000101f2205450d6b20052004360200200541046a200241c0076a41dc0010ce031a200141046a22072802002104200241003a00800920024180096a2001280200220d2004410047220610ce031a20042006490d6c2007200420066b22033602002001200d20066a22073602002004450d1620022d008009220641024b0d16200242003703800920024180096a20072003410820034108491b220410ce031a200141046a200320046b3602002001200720046a360200200341074d0d162002290380092208422088a721032008a72107410521040c760b200241f8026a200110b5014106410d20022802f8021b210420022802fc0221050b0c170b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b22033602002001200f20046a2204360200200e411f4d0d1420024198076a41086a220720024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210620022800830921052002290087092109200229008f092108200241f8066a41086a220d20072d00003a0000200220022f01be0722073b01bc0720022002290398073703f806200241c0076a41086a220e200d2d00003a0000200220073b01fc08200220022903f8063703c007200241a0086a41086a200e2d00003a0000200220073b01fe08200220022903c0073703a008200241003a00800920024180096a20042003410047220710ce031a20032007490d6a200141046a200320076b3602002001200420076a3602002003450d2d20022d008009210d200241e8066a41086a200241a0086a41086a2d00003a0000200220022f01fe083b01f606200220022903a0083703e8062009422088a721032009a72107410b21040c730b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b3602002001200f20046a360200200e411f4d0d134108210420024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921062002280083092105200229008f0921082002290087092109200241f8066a41086a220320012d00003a0000200220022f01be0722013b01bc0720022002290398073703f806200241e8066a41086a20032d00003a0000200220013b01f606200220022903f8063703e8062009422088a721032009a721070c720b200241c0026a200110b50120022802c002450d6f20022802c4022216ad2208421b88a70d482008420586a72205417f4c0d482005450d222005101f22040d23200541011020000b200241b0026a200110b50120022802b002450d6e20022802b4022204410876210f410c21030c0a0b20024180026a200110b501200228028002450d6d2002280284022105200241e8016a200110f20220022903e801a7450d6d200241f8016a290300210c20022903f0012109410521030c270b200241003a00800920024180096a20102007410047220410ce031a20072004490d56200141046a200720046b3602002001201020046a3602002007450d6c20022d008009210d410d21030c050b20024190026a2001105a200228029002450d6b410a210320022903980221090c0c0b200241b8016a200110f20220022903b801a7450d6a200241c8016a290300210c20022903c0012109410221030c010b200241d0016a200110f20220022903d001a7450d69200241e0016a290300210c20022903d8012109410321030b0c210b200241003a00800920024180096a20102007410047220410ce031a20072004490d52200141046a200720046b3602002001201020046a3602002007450d6720022d008009220d41034f0d67410821030b0c210b20024188026a200110b501200228028802450d65200228028c022216ad42247e2208422088a70d3e2008a72205417f4c0d3e2005450d1a2005101f22040d1b200541041020000b200241b8026a200110b50120022802b802450d6420022802bc022204410876210f410e21030b0c010b410721030b0c1a0b20024180096a200110b60120022d00800922044102460d6020022f00810920022d00830941107472210f2002418c096a290200210c20024194096a280200210520024198096a280200210e2002419c096a29020021082002290284092109410921030c1a0b200241a0026a2001105a20022802a002450d5f410b210320022903a80221090b0c160b2005103c2005101d0b410d21040b0b0c5c0b2005450d002004101d0b2000410f360200200241e0096a24000f0b410521040c580b4101210441002005460d5a0b20050d170c180b4101210441002005460d570b20050d150c160b4101210641002003460d570b2003450d5d2006101d0c5d0b4101210441002005460d600b20050d110c120b410421040b024002402014450d00420021084100210e4100210541002107201421150340200241386a200110b5012002280238450d11200228023c2203417f4c0d29024002402003450d0020031079220f450d36200f2001280200200141046a220d2802002206200320062003491b220610ce031a200d28020022102006490d37200d201020066b3602002001200128020020066a36020020062003460d010c120b4101210f41002003470d110b200241306a200110b5012002280230450d1020022802342206417f4c0d29024002402006450d00200610792210450d3220102001280200200141046a2217280200220d2006200d2006491b220d10ce031a20172802002218200d490d3320172018200d6b36020020012001280200200d6a360200200d2006460d010c110b4101211041002006470d100b200741016a210d024020072015470d00200e200d200d200e491b2215ad42187e2209422088a70d2b2009a722174100480d2b02402007450d00200420052017101e22040d010c300b2017101f2204450d2f0b200420056a2207200f360200200741146a2006360200200741106a20063602002007410c6a2010360200200741046a2003ad220942208620098437020020084280808080107c2108200e41026a210e200541186a2105200d2107200d2014490d000c020b0b41002115420021080b2004450d1020082015ad842108410621060c5e0b410121040b024002402016450d0020024180096a41176a211020024198096a211920024190096a211a20024180096a41086a211b200141046a210e20024180096a410f6a211c420021084100210d410021074100210320162118034020194200370300201a4200370300201b4200370300200242003703800920024180096a2001280200220f200e2802002205412020054120491b220610ce031a200e200520066b3602002001200f20066a3602002005411f4d0d0b200341016a210620024198076a41086a2205201041086a2d00003a0000200220022f008109220f3b01be072002201029000037039807201c290000210920022d00800921152002280083092117200229008709210a200241f8066a41086a221420052d00003a00002002200f3b01bc0720022002290398073703f806024020032018470d00200d20062006200d491b2218ad420586220b422088a70d29200ba722054100480d2902402003450d00200420072005101e22040d010c2c0b2005101f2204450d2b0b200420076a220520153a00002005410f6a2009370000200541076a200a370000200541036a2017360000200541016a20022f01bc073b00002005411f6a20142d00003a0000200541176a20022903f80637000020084280808080107c2108200d41026a210d200741206a21072006210320062016490d000c020b0b41002118420021080b2004450d4b20082018ad8421092004410876210f410f21030c020b410421040b024002402016450d004200210820024198096a211920024194096a211a2002418c096a211b41002107411c21034100210520162118034020024180096a200110b60120022d008009220d4102460d0a200541016a210620022d008309210e20022f008109210f2002419c096a290200210920192802002110201a280200211520024180096a41106a2802002117201b2802002114200229028409210a024020052018470d002007200620062007491b2218ad42247e220b422088a70d27200ba7221c4100480d2702402005450d002004200341646a201c101e22040d010c2b0b201c101f2204450d2a0b200420036a22052009370000200541676a200f200e41107472220e4110763a0000200541656a200e3b00002005417c6a2010360000200541786a2015360000200541746a2017360000200541706a2014360000200541686a200a370000200541646a200d3a000020084280808080107c2108200741026a2107200341246a21032006210520062016490d000c020b0b41002118420021080b2004450d4920082018ad8421092004410876210f410621030b0b0b0b0b200220022f01c00722013b018009200220013b01e806200041386a200b370000200041306a200a370000200041186a200c370000200041106a20093700002000200d3a0009200041086a20033a000020004105360200200041286a2008370000200041246a200e360000200041206a20053600002000410c6a200f410874200441ff017172360000200020022f01e8063b000a200241e0096a24000f0b410d21040c450b2018450d420c410b20180d400c410b2006450d002010101d0b2003450d00200f101d0b02402007450d002004210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200541686a22050d000b0b2015450d010b2004101d0b2000410f360200200241e0096a24000f0b4101210d41002003460d420b2003450d00200d101d0b0c470b4101210d41002003460d3e0b2003450d38200d101d0c380b20052004102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b102e000b1021000b20052007102a000b200541011020000b201c41041020000b201741041020000b41e00041081020000b200641011020000b200d2018102a000b200441011020000b20052007102a000b200341011020000b20062010102a000b41e00041081020000b200d2007102a000b41e00041081020000b20032007102a000b20042007102a000b20042007102a000b200541011020000b20062007102a000b200341011020000b2005200d102a000b200541011020000b20062007102a000b200541011020000b20062007102a000b20032006102a000b20032006102a000b41e00041081020000b41e00041081020000b20062004102a000b20072003102a000b20032006102a000b200341011020000b2007200f102a000b200341011020000b2007200f102a000b2004101d0b200220022f01c0073b0180092000410f360200200241e0096a24000f0b0c0c0b20024180096a41086a2201200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe0802402004410d470d002000410f360200200241e0096a24000f0b200241d8066a41086a220e20012d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d606200020063a0009200041086a20043a000020004106360200200041186a2008370200200041146a2003360200200041106a20073602002000410c6a20053602002000200d3a0029200020022f01e4063b000a200041206a20022903d806370200200041286a200e2d00003a0000200020022f01d6063b012a200241e0096a24000f0b2005ad22084220862008842108410321060c0d0b2005ad22084220862008842108410521060c0c0b200641087621052003ad22094220862009842109410221040c080b200241f8066a41026a20024198076a41026a2d00003a00002002200c3703a008200220022f0198073b01f806200220113703b0082002200b3703a808200dad422086201284210b2003ad220c422086200c84210c410421040c070b200241b0086a200c370300200220113703a808200220033602a0082003ad422086200dad84210c2012422088a721072012a72103410321040c060b2006450d09200020063602042000410b360200200041086a2004ad2208422086200884370200200241e0096a24000f0b0b0b20024180096a41086a2207200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe08024020044106470d002000410f360200200241e0096a24000f0b200241d8066a41086a220e20072d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d6062000200d3a0009200041086a20043a000020004108360200200041186a2008370200200041146a2001360200200041106a20063602002000410c6a2005360200200020033a0029200020022f01e4063b000a200041206a20022903d806370200200041286a200e2d00003a0000200020022f01d6063b012a200241e0096a24000f0b0b0b20024198076a41026a220d200241f8066a41026a2d00003a000020024180096a41086a220e200241a0086a41086a29030037030020024180096a41106a220f200241a0086a41106a290300370300200220022f01f8063b019807200220022903a00837038009024020044105470d002000410f360200200241e0096a24000f0b200241e8066a41026a2210200d2d00003a0000200241c0076a41086a220d200e290300370300200241c0076a41106a220e200f290300370300200220022f0198073b01e80620022002290380093703c0072000410f6a20054110763a00002000410d6a20053b0000200041086a20043a00002000410d360200200041306a200c370200200041286a200b370200200041206a200a370200200041186a2008370200200041106a20093702002000410c6a20063a0000200020022f01e8063b00092000410b6a20102d00003a0000200041386a20022903c007370200200041c0006a200d290300370200200041c8006a200e290300370200200041d8006a2001360200200041d0006a2007ad4220862003ad84370200200241e0096a24000f0b2000410f360200200241e0096a24000f0b2005ad22084220862008842108410121060b20004101360200200041106a20083702002000410c6a2004360200200041086a2006360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b2000410f360200200241e0096a24000b130020004101360204200041b0d8c2003602000b9f0803037f017e077f0240024002400240024002400240024002400240024002402001280200417f6a220241064b0d0002400240024002400240024002400240024002400240024002400240024020020e0700040203010506000b2001410c6a2802002202417f4c0d17200128020421034101210102402002450d002002101f2201450d100b20012003200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002202417f4c0d16200128020421012002450d052002101f22030d06200241011020000b2001410c6a2802002202417f4c0d15200128020421012002450d062002101f22030d07200241011020000b20004104360200200041086a200141086a2903003703000f0b200041023602000f0b2001410c6a2802002204ad42187e2205422088a70d122005a72203417f4c0d12200128020421022003450d052003101f2206450d0b2004450d060c100b2001410c6a2802002207ad420c7e2205422088a70d112005a72202417f4c0d11200128020421032002450d062002101f2204450d0b410c21092007450d070c0c0b410121030b20032001200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041053602000f0b410121030b20032001200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210620040d0a0b410021080c0a0b41042104410c210920070d050b410021080c050b41e8d0c200102c000b200241011020000b200341041020000b200241041020000b2003200720096c6a210c41002108200421020340200341086a2802002201417f4c0d052003280200210a024002402001450d002001101f220b0d010c040b4101210b0b200b200a200110ce03210a200241086a2001360200200241046a20013602002002200a360200200220096a2102200841016a2108200320096a2203200c470d000b0b2000200436020420004107360200200020096a2008360200200041086a20073602000f0b200141011020000b2002200441186c6a210741002108200621010340200241086a2802002203417f4c0d0220022802002109024002402003450d002003101f220a0d010c050b4101210a0b200a2009200310ce03210a200241146a2802002209417f4c0d022002410c6a280200210b024002402009450d002009101f220c0d010c060b4101210c0b200c200b200910ce03210b200141146a2009360200200141106a20093602002001410c6a200b360200200141086a2003360200200141046a20033602002001200a360200200141186a2101200841016a2108200241186a22022007470d000b0b20002006360204200041063602002000410c6a2008360200200041086a20043602000f0b102e000b200341011020000b200941011020000bcb0703037f047e077f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e00102400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e0013703184115101f2204450d012004410d6a41002900c89b40370000200441086a41002900c39b40370000200441002900bb9b40370000200441154135101e2204450d0220042002290318370015200420093a00342004412c6a2002412f6a220a290000370000200441256a200241186a41106a220b2903003700002004411d6a200241186a41086a290300370000200241e0016a41086a220c4200370300200242003703e00120044135200241e0016a1001200241e0006a41086a200c290300370300200220022903e001370360200241e0016a200241e0006a105c20022d0081024102460d03200241e0006a200241e0016a41e30010ce031a200241386a41206a220c200241e0006a41206a2d00003a0000200241386a41186a220d200241e0006a41186a290300370300200241386a41106a220e200241e0006a41106a290300370300200241386a41086a220f200241e0006a41086a29030037030020022002290360370338200241e0016a200241e0006a41216a41c20010ce031a200141046a220141206a200241e0016a41c1006a2d00003a0000200141186a200241e0016a41396a290000370000200141106a200241e0016a41316a290000370000200141086a200241e0016a41296a290000370000200120022900810237000020002002290318370001200041096a200241186a41086a290300370000200041116a200b290300370000200041186a200a290000370000200041206a20093a0000200041013a0000200041216a2002290338370000200041296a200f290300370000200041316a200e290300370000200041396a200d290300370000200041c1006a200c2d00003a00002004101d200324000f0b200041003a0000200324000f0b411541011020000b413541011020000b41a49ac20041d700103a000b13002000410c36020420004198ddc2003602000b13002000410936020420004195a5c0003602000b130020004110360204200041e0e4c2003602000bb70101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a2205420037030020024200370300024002404120101f2206450d0020062002290300370000200641186a2003290300370000200641106a2004290300370000200641086a20052903003700002006412041c000101e2206450d01200042c0808080900437020420002006360200200641003a0020200241206a24000f0b412041011020000b41c00041011020000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021062200041086a200228020836020020002002290300370200200241106a24000bd10301047f230041d0006b2202240002400240410f101f2203450d00200341076a41002900b39b40370000200341002900ac9b403700002003410f412f101e2203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241306a41086a22014200370300200242003703302003412f200241306a1001200241206a41086a200129030037030020022002290330370320024002400240200241206a411041f8b3c200410041001002417f460d00200241306a41186a4200370300200241306a41106a42003703002001420037030020024200370330200241206a4110200241306a4120410010022201417f460d022001411f4d0d02200241186a2201200241306a41186a290300370300200241106a2204200241306a41106a290300370300200241086a2205200241306a41086a29030037030020022002290330370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b2003101d200241d0006a24000f0b41df88c0004133103a000b410f41011020000b412f41011020000bf70401027f02400240024020012d0000417f6a2202410b4b0d004109210302400240024002400240024002400240024002400240024020020e0c000406020809070b05030a01000b41e000101f2202450d0c2002200141046a28020010c201200041046a2002360200200041106a200141106a290300370300200041086a200141086a290300370300200041013a00000f0b2000410c3a00000f0b200020012d00013a0001200041046a200141046a280200360200200041043a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700002000410a3a00000f0b200041046a200141046a280200360200410221030b200020033a00000f0b200020012d00013a0001200041046a200141046a280200360200200041033a00000f0b200041086a200141086a290300370300200041046a200141046a280200360200200041073a00000f0b41e000101f2202450d052002200141046a28020010c201200041046a2002360200200041086a200141086a290300370300200020012d00013a0001200041053a00000f0b200041046a200141046a280200360200200041063a00000f0b20002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00002000410b3a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041083a00000f0b41c8f3c200102c000b41e00041081020000b41e00041081020000bb91c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b90120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10c301200041086a200241206a41d80010ce031a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10c40121010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003101f22040d0f200341011020000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e000101f2204450d2e20042001410c6a28020010c501410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10c60120004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a10c4012101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10c10120004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10c70120004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310ce0321012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bcd0803047f037e017f230041306b220224000240024020012d0000417f6a220341034b0d00024002400240024002400240024002400240024020030e0400030102000b200041d0006a200141d0006a280200360200200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041013a0000200241306a24000f0b41012104200141046a2d00004101470d02200141086a28020021050c030b200141386a2903002106200141306a2903002107200141c0006a2903002108200241286a200141196a290000370300200241206a200141116a290000370300200241186a200141096a290000370300200220012900013703102001412c6a2802002203417f4c0d08200141246a28020021012003450d032003101f22040d04200341011020000b2001410c6a2802002203417f4c0d07200141046a2802002104200141106a29030021062003450d042003101f22010d05200341011020000b2002410e6a200141076a2d00003a0000200241106a41086a200141146a290000370300200241206a2001411c6a290000370300200241286a200141246a2d00003a00002002200141056a2f00003b010c20022001410c6a290000370310200141086a2800002105410021040b200141306a2802002203417f4c0d05200141c0006a2903002106200141386a2903002107200141286a2802002109200141c8006a2903002108024002402003450d002003101f22010d01200341011020000b410121010b20012009200310ce032101200041c0006a2006370300200041386a2007370300200041046a20043a0000200041086a2005360200200041c8006a2008370300200041306a20033602002000412c6a2003360200200041286a2001360200200041056a20022f010c3b0000200041076a2002410e6a2d00003a00002000410c6a2002290310370200200041146a200241106a41086a2903003702002000411c6a200241206a290300370200200041246a200241286a280200360200200041033a0000200241306a24000f0b410121040b20042001200310ce032101200041386a2006370300200041306a2007370300200041c0006a20083703002000412c6a2003360200200041286a2003360200200041246a2001360200200041043a000020002002290310370001200041096a200241186a290300370000200041116a200241206a290300370000200041196a200241286a290300370000200241306a24000f0b410121010b20012004200310ce0321012000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2006370300200041023a0000200241306a24000f0b41a4a4c400102c000b102e000bd91c04057f027e027f027e23004180016b22012400024002400240024002400240024002400240024041e000101f2202450d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002200280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002c05090d0a0608040b030c0102000b200141086a200041086a10b90120024101360200200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200141086a200041086a10c301200241086a200141086a41d80010ce031a2002410d36020020014180016a240020020f0b200028020422044102460d0b4101210320044101470d2a200041086a10c40121000c160b2000410c6a2802002203417f4c0d2a200028020421002003450d0e2003101f22040d0f200341011020000b4102210320002d000422044102460d0a20044101470d2a200041086a280200210541e000101f2204450d2f20042000410c6a28020010c501410121030c0b0b200041086a28020022034102460d0b20034101470d2a2000410c6a22032d00004101470d14200041106a2802002104410121030c150b200141086a200041086a10c60120024107360200200241c0006a200141086a41386a290300370300200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200241003602002002200041086a29030037030820014180016a240020020f0b200041086a22042d0000417f6a220341044b0d28024020030e05001d191b17000b2000410c6a10c4012100410121030c1d0b41032103200041086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d28200141e4006a200441066a2f00003b0100200141106a200041206a290000370300200141086a41106a200041286a2d00003a00002001200441026a2800003602602001200041186a290000370308200041106a2900002106200041096a2d000021000c0c0b200141086a200041086a10c10120024106360200200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200041086a29030021062002410a3602002002200637030820014180016a240020020f0b200041086a280200417f6a220341044b0d26024020030e05001b161814000b200041386a2903002106200041306a2903002107410121032000410c6a2d00004101470d1b200041106a28020021000c1c0b200141086a200041086a10c70120024105360200200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b41012103200041086a2d00004101470d082000410c6a2802002104410021050c090b200141e0006a41026a200041046a220441036a2d00003a0000200141086a41086a200041186a290000370300200141156a2000411d6a290000370000200120042f00013b01602001200041106a290000370308200041256a2d00004100472108200041286a28020021092000410c6a2800002104200041086a28000021050b200220012f01603b0005200220033a00042002200436020c200220053602082002200129030837021020022009360228200220083a002520024109360200200241076a200141e2006a2d00003a0000200241186a200141106a2903003702002002411d6a200141156a29000037000020014180016a240020020f0b410121032000410c6a22042d00004101470d0a200041106a28020021040c0b0b410121040b20042000200310ce0321002002200336020c20022003360208200220003602042002410b36020020014180016a240020020f0b200041106a29030021060c010b20042d000141004721000b200220003a0009200220033a00082002200128026036010a2002200637031020022001290308370318200241043602002002410e6a200141e0006a41046a2f01003b0100200241206a200141106a290300370300200241286a200141186a29030037030020014180016a240020020f0b200141086a41086a200041186a290000370300200141086a41106a200041206a290000370300200141086a41186a200041286a2d00003a00002001200041106a290000370308200041096a2f00002000410b6a2d00004110747241087421052000410c6a2800002104410021030b200141e0006a41186a200141086a41186a280200360200200141e0006a41106a200141086a41106a290300370300200141e0006a41086a200141086a41086a2903003703002001200129030837036020032005722100410221030b2002200436020c2002200036020820022003360204200220012903603702102002410e360200200241186a200141e8006a290300370200200241206a200141f0006a290300370200200241286a200141e0006a41186a28020036020020014180016a240020020f0b200141fe006a200341036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120032f00013b017c2001200041146a290200370308200041106a2802002104410021030b200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041386a2903002106200041306a2903002107410121050c020b200141fe006a200441036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120042f00013b017c2001200041146a290200370308200041106a2802002104410021030b41022105200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041c8006a290300210a200041c0006a290300210b200041386a2903002106200041306a29030021070b2002200b37034020022007370330200220033a000c20022005360208200220012f01043b000d200220043602102002200129036037021420024103360200200241c8006a200a370300200241386a20063703002002410f6a200141066a2d00003a00002002411c6a200141e8006a290300370200200241246a200141f0006a2903003702002002412c6a200141f8006a28020036020020014180016a240020020f0b200041106a2903002106410521030c060b2000410c6a28020022034108762104410521000c090b41032103200141fe006a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041106a29000021062000410c6a28000021000c040b200141086a41106a200041206a2903003703002001200041186a2903003703102001200041106a2802003602082000410c6a28020022034108762104200041286a290300210b410321000c070b200041106a2903002106410421030c020b2000410c6a28020022034108762104410421000c050b41022103200141fc006a41026a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041296a2d00004100472104200041106a29000021062000410c6a28000021000b200220012f017c3b0009200220033a0008200220063703102002200036020c20022001290308370318200220043a00292002200128016036012a2002410b6a200141fe006a2d00003a0000200241206a200141086a41086a290300370300200241286a200141186a2d00003a00002002412e6a200141e4006a2f01003b01002002410836020020014180016a240020020f0b2001200041186a2903003703102001200041106a29030037030841022100410021030c020b200141e8006a2000411c6a290200370300200141e0006a41106a200041246a2802003602002001200041146a290200370360200041286a3502002000412c6a31000042208684210b2000410d6a2f00002000410f6a2d0000411074722104200041106a2802002100410021030b200141146a200141e8006a2903003702002001411c6a200141f0006a2802003602002001200129036037020c20012000360208410121000b2002200737033020022000360208200220012903083703102002200b3703282002410c360200200241386a200637030020022004410874200341ff01717236020c200241186a200141086a41086a290300370300200241206a200141186a29030037030020014180016a240020020f0b41e00041081020000b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bb91c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b90120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10c301200041086a200241206a41d80010ce031a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10c40121010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003101f22040d0f200341011020000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e000101f2204450d2e20042001410c6a28020010c501410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10c60120004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a10c4012101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10c10120004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10c70120004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310ce0321012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bb20a01047f230041206b2202240002400240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d124101210402402003450d00200128020421052003101f2204450d1420042005200310ce031a0b20002004360204200041013602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210441012103200141086a22052d00004101470d062001410c6a28020021050c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c2003450d09200128020421052003101f2204450d0e20042005200310ce031a0c0a0b4101210320012d00044101470d06200141086a28020021040c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200541036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220052f00013b011c2002200141106a2902003703002001410c6a2802002105410021030b20002004360204200020022f011c3b0009200041086a20033a00002000410c6a2005360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002104410021030b200020033a0004200020022f011c3b0005200041086a20043602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20002004360204200041023602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b41a8a9c300102c000b102e000b200341011020000b200341011020000be70d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410e4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0f00090607030a0c080d050e02040b01000b41012103200141046a2d00004101470d0e200141086a28020021040c0f0b2001410c6a2802002205ad2206421b88a70d162006420586a72203417f4c0d16200141046a28020021072003450d112003101f2208450d172005450d120c1b0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2000410d3a0000200020012d00014100473a0001200241206a24000f0b2000410a3a0000200041086a200141086a290300370300200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0d2006a72204417f4c0d0d200141046a28020021032004450d0a2004101f220b450d0f200a450d0b0c100b2000410e3a0000200041046a200141046a280200360200200241206a24000f0b200041073a0000200241206a24000f0b41012103200141046a2d00004101470d03200141086a28020021010c040b2000410b3a0000200041086a200141086a290300370300200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41a880c400102c000b102e000b200341011020000b200441041020000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410f3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b0a004198dac300102c000ba9830105037f027e047f017e057f23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410b4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c00070405020809060c030b01000b200141106a2903002106200141086a2903002107200141046a280200210420022d0001210820022d00002105200341d8026a22092002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d1d410121090c1e0b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d0c410121040c0d0b200141046a280200210420022d000120022d000072450d0e2004103c2004101d20012d00002104410021090c070b200341d8016a41186a200141196a290000370300200341d8016a41106a200141116a290000370300200341d8016a41086a200141096a290000370300200320012900013703d80120022d0001210920022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d0e410121040c0f0b200141046a280200210920012d0001210820022d0001210a20022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d10410121040c110b200141046a280200210a20012d0001210b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d12410121040c130b200341f0036a41186a200141196a290000370300200341f0036a41106a200141116a290000370300200341f0036a41086a200141096a290000370300200320012900013703f00320022d0001210920022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d14410121040c150b200141046a280200210820022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d19410121040c1a0b4101210920022d000120022d0000720d01200141046a28020010a5010c740b4101210920022d000120022d000072450d1a0b41c9b4c000210241282105200441ff017122044101460d0220044105470d772009450d77200141046a2201280200103c2001280200101d0c770b200141216a2d00002109200341286a41186a200141196a290000370300200341286a41106a200141116a290000370300200341286a41086a200141096a2900003703002003200129000137032820022d0001210820022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d19410121040c1a0b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d1b410121040c1c0b200141046a2201280200103c2001280200101d0c740b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2209200341f0036a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d30200341b3026a2008290300370000200341b8026a200341b0036a410d6a290000370000200320032f01b8013b01a002200320053600a702200320023600a302200320032903b0033700ab02200320092d00003a00a2024115101f2202450d3d2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d3e200220032903a0023700152002412d6a200341b8026a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a29030037000020034180056a41086a2205420037030020034200370380052002413520034180056a1001200341d8046a41086a200529030037030020032003290380053703d804200341d8046a411041f8b3c20041004100100221052002101d2005417f460d214115101f2202450d4b2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d4c200220032903a0023700152002412d6a200341a0026a41186a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a2903003700004200210c20034180056a41086a2205420037030020034200370380052002413520034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341c0026a200341f0046a105c024020032d00e102220941024622050d00200341f0046a411010090b200341d0036a41086a2208200341ea026a290100370300200341d0036a41106a200341f2026a290100370300200341d0036a41186a200341fa026a290100370300200341b0036a41086a220a2003418b036a290000370300200341b0036a41106a20034193036a290000370300200341b0036a41186a2003419b036a290000370300200320032901e2023703d003200320034183036a2900003703b00320034182036a2d0000210420033000e00221062002101d20050d6b200341d8016a41186a200341d0036a41186a290300370300200341d8016a41106a200341d0036a41106a290300370300200341d8016a41086a200829030037030020034188016a41086a200a29030037030020034188016a41106a200341b0036a41106a29030037030020034188016a41186a200341b0036a41186a290300370300200320032903d0033703d801200320032903b00337038801410021020240200441ff01714101470d004115101f2202450d5e2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d5f20022003290388013700152002412d6a200341a0016a290300370000200241256a20034198016a2903003700002002411d6a20034188016a41086a2903003700000b20094101470d2a4115101f2205450d5f2005410d6a41002900c89b40370000200541086a41002900c39b40370000200541002900bb9b40370000200541154135101e2205450d60200520032903d8013700152005412d6a200341d8016a41186a290300370000200541256a200341d8016a41106a2903003700002005411d6a200341d8016a41086a29030037000020034180056a41086a2208420037030020034200370380052005413520034180056a1001200341f0046a41086a200829030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d61200341f0036a200341c0026a41c20010ce031a200341f0036a41c2006a20043a0000200341b3046a200329038801370000200341bb046a20034188016a41086a290300370000200341c3046a20034188016a41106a290300370000200341cb046a20034188016a41186a29030037000020034180056a41086a2204420037030020034200370380052005413520034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341003602c802200342013703c0024120101f2204450d62200420032903f003370000200441086a200341f0036a41086a290300370000200441106a200341f0036a41106a290300370000200441186a200341f0036a41186a290300370000200342a080808080043702c402200320043602c0022004412041c000101e2204450d63200420034190046a2d00003a0020200342c080808090043702c402200320043602c00220034191046a200341c0026a10ca0120032802c4022104200341f0046a411020032802c0022208200341c8026a280200100302402004450d002008101d0b2005101d410121082002450d340c680b200141086a290300210720012d0001210220034180056a41086a220542003703002003420037038005418cb9c000410d20034180056a1001200341f0046a41086a200529030037030020032003290380053703f004420021060240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d3a20032903c00221060b20034180056a41086a22054200370300200342003703800541869bc000411620034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d23200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d3a20032903c002210c0c240b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c702210520034188016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b018801200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341e8006a41026a220920034188016a41026a2d00003a0000200341d0036a41086a2208200341c0026a41086a290300370300200341d0036a41106a200341c0026a41106a290300370300200320032f0188013b0168200320032903c0023703d00320040d2c20034183046a200829030037000020034188046a200341d0036a410d6a290000370000200320032f01683b01f003200320053600f703200320023600f303200320032903d0033700fb03200320092d00003a00f203200341c0026a200341d8016a10c0014101210420032d00c0024101470d18200341ba016a20032d00c3023a0000200341b0036a41086a200341d4026a290200370300200341b0036a410d6a200341d9026a290000370000200320032f00c1023b01b8012003200341cc026a2902003703b003200341c0026a41086a28020021054100210420032802c40221020c190b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220b2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200a41ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200b290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a220a200341f0036a41026a2d00003a0000200341b0036a41086a220b200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d29200341c8006a41026a2204200a2d00003a0000200341a0026a41086a220a200b290300370300200341a0026a410d6a220b200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002200341d3026a200a290300370000200341d8026a200b290000370000200320053600c702200320023600c302200320042d00003a00c202200320032f01483b01c002200320032903a0023700cb02200341186a200341c0026a2009200810cb01200328021c2105200328021821020c290b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341f0036a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d2620034183046a200829030037000020034188046a200341b0036a410d6a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320092d00003a00f203200341c0026a200341f0036a10c0014101210420032d00c0024101470d14200341ca006a20032d00c3023a000020034188016a41086a200341d4026a29020037030020034188016a410d6a200341d9026a290000370000200320032f00c1023b01482003200341cc026a29020037038801200341c0026a41086a28020021054100210420032802c40221020c150b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01d801200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341d8016a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320040d23200341c8006a41026a20092d00003a0000200341a0026a41086a2008290300370300200341a0026a410d6a200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002410f101f2204450d32200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2204450d33200420032903f00337000f200441276a200341f0036a41186a22082903003700002004411f6a200341f0036a41106a220a290300370000200441176a200341f0036a41086a220b29030037000020034180056a41086a2209420037030020034200370380052004412f20034180056a1001200341d8046a41086a200929030037030020032003290380053703d804200341d8046a411041f8b3c20041004100100221092004101d2009417f460d16419fb3c0002102410f21050c230b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2009290000370000200320032f01c0023b018005200320032900cb023703d80441012109200841ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01d801200320032903d8043703c002410021090c010b41f1b4c0002102412a21050b200341b8016a41026a2208200341d8016a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320090d0b20034183046a200a290300370000200341f0036a41186a200341bd036a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320082d00003a00f20320034180056a41086a2202420037030020034200370380054189b2c000411820034180056a1001200341f0046a41086a200229030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d0a200342003703c802200342003703c002200341f0046a4110200341c0026a4110410010022202417f460d2c2002410f4d0d2c20032903c002200756200341c8026a290300220c200656200c2006511b450d0a41a1b2c0002102410d21050c0b0b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01d801200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341d8016a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320040d1d20034183046a200a290300370000200341f0036a41186a200341bd036a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320092d00003a00f203200341c0026a200810920120032802d002220a450d0f200341dc026a280200210b200341c0026a41186a280200210220032802d4022104200341106a200341f0036a20032902c402220642208620033502c002842207200341cc026a350200422086200642208884220610cc012003280210450d144185b3c0002102411a21052004450d1d200a101d0c1d0b200141046a2802002102200341f0036a200141086a290300220610ad01024020032802f803220520024d0d00024020032802f003200241e8006c6a2202280200410f460d002002103c0b2002410f360200200241046a200341c0026a41e40010ce031a0b4117101f2202450d342002410f6a41002900f89c40370000200241086a41002900f19c40370000200241002900e99c4037000020024117412e101e2202450d352002200637001720034180056a41086a2204420037030020034200370380052002411f20034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341103602c4022003200341f0046a3602c002200341f0036a200341c0026a10ae012002101d20032802f003210402402005450d00200541e8006c210520042102034002402002280200410f460d002002103c0b200241e8006a2102200541987f6a22050d000b0b20032802f403450d582004101d0c580b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200841ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2208200341f0036a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d19200341fb006a200a290300370000200341e8006a41186a2204200341b0036a410d6a290000370000200320032f01b8013b01682003200536006f2003200236006b200320032903b003370073200320082d00003a006a200341a0026a41186a2004290300370300200341a0026a41106a200341e8006a41106a290300370300200341a0026a41086a200341e8006a41086a290300370300200320032903683703a00220034188016a41186a200341286a41186a29030037030020034188016a41106a200341286a41106a29030037030020034188016a41086a200341286a41086a290300370300200320093a00a80120032003290328370388014115101f2202450d2a2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d2b200220032903a0023700152002412d6a200341a0026a41186a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a29030037000020034180056a41086a2204420037030020034200370380052002413520034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341f0036a200341f0046a105c20032d00910422044102470d0920034180056a41086a22044200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a2209200429030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d12200341d8026a4200370300200341c0026a41106a4200370300200341c0026a41086a4200370300200342003703c002200341f0046a4110200341c0026a4120410010022204417f460d362004411f4d0d3620034180056a41026a220b20032d00c2023a0000200341d8046a41086a2204200341d3026a290000370300200341d8046a410d6a2209200341d8026a290000370000200320032f01c0023b018005200320032900cb023703d80420032800c302210820032800c702210a200341d0016a41026a220d200b2d00003a0000200341b8016a41086a220b2004290300370300200341b8016a410d6a220e2009290000370000200320032f0180053b01d001200320032903d8043703b801200341d4016a41026a200d2d00003a00002004200b2903003703002009200e290000370000200320032f01d0013b01d401200320032903b8013703d8044115101f2204450d3a2004410d6a41002900c89b40370000200441086a41002900c39b40370000200441002900bb9b40370000200441154135101e2204450d3b200420032f01d4013b00152004200a36001c20042008360018200420032903d804370020200441176a200341d4016a41026a2d00003a0000200441286a200341d8046a41086a2903003700002004412d6a200341e5046a29000037000020034180056a41086a2209420037030020034200370380052004413520034180056a1001200341f0046a41086a220b200929030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d3c200341d0036a41186a220d200341c0026a41186a290300370300200341d0036a41106a220e200341c0026a41106a290300370300200341d0036a41086a220f200341c0026a41086a290300370300200320032903c0023703d00320032d00e0022110200341d8016a200341e1026a41c20010ce031a200341b0036a41186a2211200d290300370300200341b0036a41106a220d200e290300370300200341b0036a41086a220e200f290300370300200320032903d0033703b003200341c0026a200341d8016a41c20010ce031a200341d8016a41186a220f2011290300370300200341d8016a41106a2211200d290300370300200341d8016a41086a200e290300370300200320032903b0033703d80120032d00e102210d2009420037030020034200370380052004413520034180056a1001200b200929030037030020032003290380053703f0044120101f2209450d3d200920032903d801370000200941186a200f290300370000200941106a2011290300370000200941086a200341d8016a41086a2903003700002009412041c000101e2209450d3e200941013a0021200920103a0020200941c000418001101e2209450d3f200920032903a0023700222009413a6a200341a0026a41186a290300370000200941326a200341a0026a41106a2903003700002009412a6a200341a0026a41086a290300370000200341e2026a4100200d4101461b220b450d15200941c2006a41013a0000200941db006a200b41186a290000370000200941d3006a200b41106a290000370000200941cb006a200b41086a2900003700002009200b29000037004341e300210b0c160b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2209200341f0036a41026a22082d00003a0000200341b0036a41086a220a200341c0026a41086a220b290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d16200341c8006a41026a220420092d00003a0000200341a0026a41086a2209200a290300370300200341a0026a410d6a220a200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002200820042d00003a0000200b2009290300370300200341c0026a410d6a200a290000370000200320032f01483b01f003200320032903a0023703c002410f101f2204450d29200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2204450d2a200420032f01f0033b000f2004200536001620042002360012200420032903c00237001a200441116a200341f2036a2d00003a0000200441226a200341c0026a41086a290300370000200441276a200341cd026a29000037000020034180056a41086a2202420037030020034200370380052004412f20034180056a1001200341d8046a41086a200229030037030020032003290380053703d804200341d8046a411010092004101d41012109410121080c4d0b200341086a200341f0036a2007200610cc012003280208450d0b41aeb2c0002102411a21050b2004103c2004101d410021084101210920012d000022044101470d540c530b410b2105419a80c10021020b200341c8006a41026a2209200341b8016a41026a2d00003a000020034188016a41086a2208200341b0036a41086a29030037030020034188016a41106a200341b0036a41106a290300370300200320032f01b8013b0148200320032903b0033703880120040d12200341d3026a2008290300370000200341c0026a41186a220420034195016a290000370000200320032f01483b01c002200320053600c702200320023600c30220032003290388013700cb02200320092d00003a00c202200341c0026a200341f0036a412010d003450d0a41aeb3c0002102410b21050c120b410b2105419a80c10021020b200341e8006a41026a2209200341c8006a41026a2d00003a0000200341d0036a41086a220820034188016a41086a290300370300200341d0036a41106a20034188016a41106a290300370300200320032f01483b016820032003290388013703d00320040d10200341d8016a41026a220420092d00003a0000200341a0026a41086a22092008290300370300200341a0026a410d6a2208200341d0036a410d6a290000370000200320032f01683b01d801200320032903d0033703a002200341d3026a2009290300370000200341d8026a2008290000370000200320053600c702200320023600c302200320042d00003a00c202200320032f01d8013b01c002200320032903a0023700cb02200341206a200341c0026a200a200b10cb0120032802242105200328022021020c100b200341c8006a41186a200341aa046a290100370300200341c8006a41106a200341a2046a290100370300200341c8006a41086a2003419a046a290100370300200341d0036a41026a200341b5046a2d00003a0000200341d8016a41086a200341c6046a290100370300200341e5016a200341cb046a29000037000020032003290192043703482003200341b3046a2f00003b01d0032003200341be046a2901003703d801200341ba046a280100210a200341b6046a2801002108200341b2046a2d000021090c0e0b41b9b3c0002102410d21050c0e0b41e1b2c0002102412421050c0d0b200341c0026a41186a2008290300370300200341c0026a41106a200a290300370300200341c0026a41086a200b290300370300200320032903f0033703c00220034188016a41026a200341c8006a41026a2d00003a0000200341d8016a41086a200341a0026a41086a290300370300200341d8016a410d6a200341a0026a410d6a290000370000200320032f01483b018801200320032903a0023703d801410f101f2204450d2a200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2209450d2b200920032903c00237000f200941276a200341c0026a41186a2903003700002009411f6a200341c0026a41106a290300370000200941176a200341c0026a41086a29030037000020034180056a41086a2204420037030020034200370380052009412f20034180056a1001200341f0046a41086a200429030037030020032003290380053703f0044120101f2204450d2c200420032f0188013b00002004200536000720042002360003200420032903d80137000b200441026a20034188016a41026a2d00003a0000200441136a200341d8016a41086a290300370000200441186a200341e5016a290000370000200341f0046a41102004412010032004101d2009101d0c480b42e807210c0b200341c0026a200441e00010ce031a200341f0036a200c20067c200341c0026a20022007109501200341f8036a280200210520032802f403210220032802f003210a2004101d410121084100210920024100200a4101461b210220012d000022044101470d4a0c490b20034180056a41086a22024200370300200342003703800541c8b2c000411920034180056a1001200341f0046a41086a200229030037030020032003290380053703f004410021090240200341f0046a411041f8b3c200410041001002417f460d00200341003602c002200341f0046a4110200341c0026a41044100100241016a41044d0d2120032802c00221090b20034180056a41086a22054200370300200342003703800541c8b2c000411920034180056a1001200341f0046a41086a2208200529030037030020032003290380053703f0042003200941016a3602c002200341f0046a4110200341c0026a410410034120101f2202450d31200220032903f003370000200341d4026a428180808010370200200241186a200341f0036a41186a290300370000200241106a200341f0036a41106a290300370000200241086a200341f0036a41086a290300370000200320073703c002200320023602d002200320063703c8022009200341c0026a10cd0120054200370300200342003703800541939cc000411520034180056a10012008200529030037030020032003290380053703f00441002102200341f0046a411041f8b3c200410041001002417f460d0a200342103702dc012003200341f0046a3602d801200341c0026a200341d8016a10910120032802c0022208450d35200341c8026a280200210220032802c402210a0c0b0b200341c8006a41186a2209200341f0036a41186a290300370300200341c8006a41106a220d200341f0036a41106a290300370300200341c8006a41086a220e200341f0036a41086a290300370300200320032903f00337034820042002470d03200441016a22052004490d222004410174220f20052005200f491b220fad420586220c422088a70d22200ca722054100480d222004450d0f200a20044105742005101e220a0d100c3c0b2004200341d8016a41186a290300370300200341c0026a41106a200341d8016a41106a290300370300200341c0026a41086a200341d8016a41086a290300370300200320032903d8013703c002410f101f2205450d3041002102200541076a41002900b39b40370000200541002900ac9b403700002005410f412f101e2205450d31200520032903c00237000f200541276a200341d8026a2903003700002005411f6a200341c0026a41106a290300370000200541176a200341c0026a41086a29030037000020034180056a41086a2204420037030020034200370380052005412f20034180056a1001200341d8046a41086a200429030037030020032003290380053703d804200341d8046a411010092005101d0c440b20044200370300200342003703800541939dc000411d20034180056a10012009200429030037030020032003290380053703f0044120101f2204450d31200420032903a002370000200441186a200341a0026a41186a290300370000200441106a200341a0026a41106a290300370000200441086a200341a0026a41086a290300370000200341f0046a41102004412010032004101d410021090c040b200441ff01714101470d0820034180056a41086a22054200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a200529030037030020032003290380053703f0044120101f2205450d3a2005200329038801370000200541186a20034188016a41186a290300370000200541106a20034188016a41106a290300370000200541086a20034188016a41086a290300370000200341f0046a41102005412010032005101d410021054100210820020d3d0c090b2004210f0c0c0b200941c2006a41003a000041c300210b0b200341f0046a41102009200b10032009101d2004101d20034180056a41086a22044200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a200429030037030020032003290380053703f0044120101f2204450d29200420032903a002370000200441186a200341a0026a41186a290300370000200441106a200341a0026a41106a290300370000200441086a200341a0026a41086a290300370000200341f0046a41102004412010032004101d200341d0036a41026a200341d4016a41026a2d00003a0000200341d8016a41086a200341d8046a41086a290300370300200341d8016a410d6a200341d8046a410d6a290000370000200320032f01d4013b01d003200320032903d8043703d801410121090b410021040b200341e5026a20093a0000200341ed026a200a360000200341e9026a2008360000200341c0026a410d6a200341c8006a41086a290300370000200341d5026a200341c8006a41106a290300370000200341dd026a200341c8006a41186a290300370000200341e6026a20032f01d0033b0100200341e8026a200341d2036a2d00003a0000200341f1026a20032903d801370000200341f9026a200341d8016a41086a290300370000200341fe026a200341d8016a410d6a290000370000200320043a00c402200320032903483700c502200320034188016a3602c00220034180056a41086a2204420037030020034200370380052002413520034180056a1001200341d8046a41086a200429030037030020032003290380053703d804200341003602f803200342013703f0034120101f2204450d152004200329038801370000200441086a20034188016a41086a290300370000200441106a20034188016a41106a290300370000200441186a20034188016a41186a290300370000200342a080808080043702f403200320043602f0032004412041c000101e2204450d162004200341a8016a2d00003a0020200342c080808090043702f403200320043602f003200341c0026a410472200341f0036a10ca0120032802f4032104200341d8046a411020032802f0032209200341f0036a41086a280200100302402004450d002009101d0b2002101d200342e4cab5fbb6ccdcb0e3003703b001200341b0016a200341e8006a427f109d01200341c0026a41086a41073a0000200341c9026a2003290368370000200341d1026a200341e8006a41086a290300370000200341d9026a200341e8006a41106a290300370000200341e1026a200341e8006a41186a290300370000200341e9026a2003290328370000200341f1026a200341286a41086a290300370000200341f9026a200341286a41106a29030037000020034181036a200341286a41186a290300370000200341053a00c002200341c0026a108b01410021020b410121094101210820012d000022044101460d3e0c3f0b410821084100210a0b200341c0026a200410c201200341c8006a41186a220b200341f0036a41186a290300370300200341c8006a41106a220d200341f0036a41106a290300370300200341c8006a41086a220e200341f0036a41086a290300370300200320032903f003370348200a2002470d33200241016a22052002490d172002410174220a20052005200a491b220aad4288017e220c422088a70d17200ca722054100480d172002450d02200820024188016c2005101e2208450d030c330b20034180056a41086a22054200370300200342003703800541939dc000411d20034180056a1001200341d8046a41086a200529030037030020032003290380053703d804200341d8046a41101009410021054100210820020d340b41002104200820054572450d340c350b2005101f22080d300b200541081020000b2005101f220a450d2c0b200a20024105746a22052003290348370000200541186a2009290300370000200541106a200d290300370000200541086a200e29030037000041012109200341c0026a41186a200241016a360200200341d4026a200f360200200320063703c802200320073703c0022003200b3602dc022003200a3602d0022008200341c0026a10cd01410021020c350b200341d4026a4101360200200341183602f403200341c0adc4003602f003200342013702c402200341c8adc4003602c0022003200341f0036a3602d002200341c0026a41e0f3c20010cf01000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411541011020000b413541011020000b410f41011020000b412f41011020000b411541011020000b413541011020000b410f41011020000b412f41011020000b412041011020000b41c00041011020000b41df88c0004133103a000b411741011020000b412e41011020000b1021000b411541011020000b413541011020000b41df88c0004133103a000b410f41011020000b412f41011020000b412041011020000b411541011020000b413541011020000b4193f1c100419f01103a000b412041011020000b41c00041011020000b41800141011020000b412041011020000b412041011020000b410f41011020000b412f41011020000b412041011020000b41df88c0004133103a000b411541011020000b413541011020000b411541011020000b413541011020000b41f5d7c10041d300103a000b412041011020000b41c00041011020000b200541011020000b412041011020000b200820024188016c220f6a200341c0026a41e00010ce0322052009360260200541fc006a200b290300370200200541f4006a200d290300370200200541ec006a200e290300370200200520032903483702642003200241016a22023602c8022003200a3602c402200320083602c00220034180056a41086a22054200370300200342003703800541939cc000411520034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341103602dc012003200341f0046a3602d801200341c0026a200341d8016a10930102402002450d00200f4188016a21052008210203402002103c20024188016a2102200541f87e6a22050d000b0b0240200a450d002008101d0b200341d8026a2006370300200341d0026a2007370300200341cc026a200936020041002108200341c8026a41003a0000200341053a00c002200341c0026a108b012004103c2004101d410121090b4100210220012d000022044101470d080c070b20034180056a41086a2204420037030020034200370380052002413520034180056a1001200341f0046a41086a220a200429030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d0b200341f0036a200341c0026a41e30010ce031a20034192046a20032903d8013701002003419a046a200341d8016a41086a290300370100200341a2046a200341d8016a41106a290300370100200341aa046a200341d8016a41186a290300370100200320093a0091042004420037030020034200370380052002413520034180056a1001200a200429030037030020032003290380053703f004200341003602c802200342013703c0024120101f2204450d0c200420032903f003370000200441086a200341f0036a41086a290300370000200441106a200341f0036a41106a290300370000200441186a200341f0036a41186a290300370000200342a080808080043702c402200320043602c0022004412041c000101e2204450d0d200420034190046a2d00003a0020200342c080808090043702c402200320043602c00220034191046a200341c0026a10ca0120032802c4022104200341f0046a411020032802c0022209200341c0026a41086a280200100302402004450d002009101d0b2002101d410121042008200545720d010b2005101d0b02402002452004720d002002101d0b2006210c0b4200210620034180056a41086a22024200370300200342003703800541a89cc000411520034180056a1001200341f0046a41086a200229030037030020032003290380053703f004420021070240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d0720032903c00221070b20034180056a41086a220242003703002003420037038005418cb9c000410d20034180056a1001200341f0046a41086a200229030037030020032003290380053703f0040240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d0820032903c00221060b200342e4cab5fbb6ccdcb0e300370368200341e8006a200341a0026a427f427f200c20077e20067c410210d001200341c0026a41086a41083a0000200341c9026a20032903a002370000200341d1026a200341a0026a41086a290300370000200341d9026a200341b0026a290300370000200341e1026a200341b8026a290300370000200341053a00c002200341c0026a108b010b410021020b410121090b4101210820012d000022044101470d010b2008450d01200141046a2201280200103c2001280200101d0c010b20044105470d002009450d00200141046a2201280200103c2001280200101d0b200020053602042000200236020020034190056a24000f0b41df88c0004133103a000b41df88c0004133103a000b41f5d7c10041d300103a000b412041011020000b41c00041011020000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d03200128020020032004101e2202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d04200128020020032004101e2202450d050c060b200128020021020c080b200128020021020c050b2004101f22020d050b200441011020000b2004101f22020d010b200441011020000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d01200128020020022003101e2202450d020c030b200128020021020c030b2003101f22020d010b200341011020000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d03200128020020032004101e2202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d04200128020020032002101e2200450d050c060b200128020021020c080b200128020021000c050b2004101f22020d050b200441011020000b2002101f22000d010b200241011020000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d01200128020020022003101e2202450d020c040b200128020021020c040b2003101f22020d020b200341011020000b1021000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000b980f03087f017e077f230041d0006b22042400200441306a41086a220542003703002004420037033041c6b3c0004118200441306a1001200441c0006a41086a2005290300370300200420042903303703404100210502400240024002400240024002400240024002400240024002400240200441c0006a411041f8b3c200410041001002417f460d00200441003a0010200441c0006a4110200441106a41014100100241016a41014d0d0120042d001021050b0240024002400240200341187441187541077620037341187441808080086a41187520054118744118754c0d0041deb3c0002105411d21060c010b411a101f2205450d04200541186a41002f00e89b403b0000200541106a41002900e09b40370000200541086a41002900d89b40370000200541002900d09b403700002005411a4134101e2205450d052005200236001a200441306a41086a22064200370300200442003703302005411e200441306a1001200441c0006a41086a200629030037030020042004290330370340200441c0006a411041f8b3c20041004100100221062005101d0240024002400240024002402006417f460d00200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a290000370300200420012900003703104110101f2205450d0c200541086a41002900a49b403700002005410029009c9b40370000200541104120101e2205450d0d200520023600102005412041c000101e2205450d0e200520042903103700142005412c6a200441106a41186a2207290300370000200541246a200441106a41106a22082903003700002005411c6a200441106a41086a2209290300370000200441306a41086a220642003703002004420037033020054134200441306a1001200441c0006a41086a200629030037030020042004290330370340200441c0006a411041f8b3c20041004100100221062005101d2006417f470d05200420021099012007200141186a2900003703002008200141106a2900003703002009200141086a29000037030020042001290000370310200428020822052004280204220a470d01200541016a22062005490d072005410174220b20062006200b491b220aad420586220c422088a70d07200ca722064100480d072005450d02200428020020054105742006101e220d0d030c150b41fbb3c0002105412221060c050b2004280200210d0c020b2006101f220d450d120b2004200a3602042004200d3602000b200441086a200541016a220b360200200d20054105746a22062004290310370000200641186a200441106a41186a290300370000200641106a200441106a41106a290300370000200641086a200441106a41086a2903003700004113101f2206450d0e2006410f6a410028008f9d40360000200641086a41002900889d40370000200641002900809d40370000200641134126101e220e450d0f200e2002360013200441306a41086a2206420037030020044200370330200e4117200441306a1001200441c0006a41086a20062903003703002004200429033037034020044100360218200442013703102004200b360230200441306a200441106a106202400240200b450d00200541057441206a210f4100200441106a41086a28020022066b21102004280210211120042802142112200d210503400240201220106a411f4b0d00200641206a220b2006490d0620124101742213200b200b2013491b220b4100480d06024002402012450d0020112012200b101e22110d010c090b200b101f2211450d080b200b21120b201120066a220b2005290000370000200b41186a200541186a290000370000200b41106a200541106a290000370000200b41086a200541086a290000370000201041606a2110200641206a2106200541206a2105200f41606a220f0d000b200441186a200636020020042012360214200420113602100c010b200441106a41086a280200210620042802142112200428021021110b200441c0006a411020112006100302402012450d002011101d0b200e101d200a450d00200d101d0b2007200141186a2900003703002008200141106a2900003703002009200141086a290000370300200420012900003703104110101f2205450d09200541086a41002900a49b403700002005410029009c9b40370000200541104120101e2205450d0a200520023600102005412041c000101e2205450d0b200520042903103700142005412c6a200441286a290300370000200541246a200441106a41106a2903003700002005411c6a200441106a41086a290300370000200441306a41086a220642003703002004420037033020054134200441306a1001200441c0006a41086a2006290300370300200420042903303703404101101f2206450d0c200620033a0000200441c0006a41102006410110032006101d2005101d410021050b2000200636020420002005360200200441d0006a24000f0b1021000b200b41011020000b41df88c0004133103a000b411a41011020000b413441011020000b411041011020000b412041011020000b41c00041011020000b411041011020000b412041011020000b41c00041011020000b410141011020000b411341011020000b412641011020000b200641011020000ba90604027f017e017f037e230041306b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41086a220742003703002004420037032020054134200441206a1001200441106a41086a200729030037030020042004290320370310024002400240200441106a411041f8b3c200410041001002417f460d002004420037032820044200370320200441106a4110200441206a4110410010022207417f460d022007410f4d0d02200441286a2903002108200429032021060c010b420021080b2005101d0240024020062002542205200820035420082003511b450d0041d4d4c0002105411521010c010b200441086a20014104200620027d2206200820037d2005ad7d2208103d024020042802082205450d00200428020c21010c010b4118101f2205450d05200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002109200441206a41086a220742003703002004420037032020054138200441206a1001200441106a41086a20072903003703002004200429032037031002400240200441106a411041f8b3c200410041001002417f460d002004420037032820044200370320200441106a4110200441206a4110410010022207417f460d062007410f4d0d06200441286a290300210a200429032021090c010b4200210a0b2005101d2001200920027c2202200a20037c2002200954ad7c10e70120012006200810e201410021050b2000200136020420002005360200200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411841011020000b413841011020000bfd0403037f027e067f230041306b220224000240024002404113101f2203450d002003410f6a41002800f99b40360000200341086a41002900f29b40370000200341002900ea9b40370000200341134126101e2204450d0120042000360013200241186a41086a220342003703002002420037031820044117200241186a1001200241086a41086a2003290300370300200220022903183703082002410036022020024201370318200141086a2903002105200129030021064110101f2203450d02200320063700002003200537000820024290808080800237021c20022003360218200128021021072002200141186a280200220336022c2002412c6a200241186a106202400240024002402003450d0020034105742108200241186a41086a280200210020022802182109200228021c210a2007210303400240024002400240200a20006b41204f0d00200041206a220b2000490d07200a410174220c200b200b200c491b220c4100480d07200a450d012009200a200c101e22090d020c080b200041206a210b0c020b200c101f2209450d060b200c210a0b200920006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000200b2100200341206a2103200841606a22080d000b200241206a200b3602002002200a36021c200220093602180c010b200241206a280200210b200228021c210a200228021821090b200241086a41102009200b10030240200a450d002009101d0b2004101d0240200141146a280200450d002007101d0b200241306a24000f0b1021000b200c41011020000b411341011020000b412641011020000b411041011020000b110020012000280200200028020410ef020b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241e8b1c400360204200241f8b3c200360200200210bb03000b95140f017f017e027f017e057f017e0a7f037e077f037e027f027e027f027e027f230041a0016b2206240042002107200641086a41086a2208420037030020064200370308418cb9c000410d200641086a1001200641f8006a41086a200829030037030020062006290308370378024002400240024002400240024002400240200641f8006a411041f8b3c200410041001002417f460d0020064200370308200641f8006a4110200641086a41084100100241016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210a20064201370308200641f8006a200110ea012006280278210b200628027c210c200628028001220d450d02200641f8006a41186a220e2000460d01200d41286c210f4201210a200b21050340200541086a2903002104200541106a2903002102200541186a290300210320052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a2003370300200641f8006a41106a22112002370300200641f8006a41086a2004370300200620103703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378211042014201520d030c020b200641e8006a41086a200941086a290300370300200629030821044200210a2006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310211020044201510d010c020b42004201520d010b200541286a2111200a21040c050b200541286a2105200f41586a220f0d000c030b0b41df88c0004133103a000b200d41286c2105200b41286a2111200641206a290300210220062903182103200629031021102006290308210a0340200641e8006a41086a200941086a290300370300420021042006420037030820062009290300370368200a4201510d02201141286a21114200210a200541586a22050d000b0b4100210e0240200c450d00200b101d0b4108211241002113200a4201510d010c040b200641d8006a41086a2205200641e8006a41086a29030037030020062006290368370358200641c8006a41086a220f200529030037030020062006290358370348200641386a41086a2205200f2903003703002006200629034837033802400240024002404128101f2212450d00201220062903383703182012201037030020122003370308201241206a2005290300370300201241106a2002370300024002402011200b200d41286c6a460d00200641f8006a41186a220f2000460d0141282114200b200d41286c6a221541586a21164101211741202118411021194108211a4201211b4228211c4220211d4100211e4101210e41012113410021050c030b4101210e41012113200c0d030c040b41282122200b200d41286c6a222341586a2124200641086a41186a290300212520062903182126200629031021272006290308210441012128410821294200212a4201212b4110212c200641f8006a41106a212d4228212e4220212f41002130412021314101210e41012113410121050c010b412841081020000b03400240024002400240024020050e020001010b201121050340200641f8006a20186a221f200520186a290300370300200f200541186a290300370300200641f8006a20196a220d200520196a290300370300200641f8006a201a6a22202005201a6a290300370300200620052903003703780240024002400240200f2900002000290000510d00200d2903002007580d01200641e8006a201a6a200f201a6a2903003703002006200f290300370368200d29030021022006290380012103200629037821104201201b520d030c020b200641e8006a201a6a2009201a6a2903003703002006290308210a420021042006420037030820062009290300370368200641086a41186a29030021022006290318210320062903102110200a201b510d010c020b4200201b520d010b200641d8006a201a6a2211200641e8006a201a6a29030037030020062006290368370358200641c8006a201a6a2221201129030037030020062006290358370348200d2002370300200f2006290348370300200f201a6a202129030037030020062003370380012006201037037802402013200e470d00200e20176a2211200e490d0b200e2017742213201120112013491b2213ad201c7e2202201d88a70d0b2002a72211201e480d0b0240200e450d002012200e20146c2011101e22120d010c060b2011101f2212450d050b200520146a21112012200e20146c6a22212006290378370300202120186a201f290300370300202141186a200f290300370300202120196a200d2903003703002021201a6a2020290300370300200e20176a210e20162005460d03410021050c060b2015200520146a2205470d000c020b0b2011210502400340200641e8006a20296a2211200920296a2903003703002006202a370308200620092903003703682004202b510d01420021042023200520226a2205470d000c020b0b200641d8006a20296a220d201129030037030020062006290368370358200641c8006a20296a2211200d29030037030020062006290358370348202d2025370300200f2006290348370300200f20296a201129030037030020062026370380012006202737037802402013200e470d00200e20286a2211200e490d08200e202874220d20112011200d491b2213ad202e7e2204202f88a70d082004a722112030480d080240200e450d002012200e20226c2011101e22120d010c030b2011101f2212450d020b200520226a21112012200e20226c6a220d2006290378370300200d20316a200641f8006a20316a290300370300200d41186a200f290300370300200d202c6a202d290300370300200d20296a200641f8006a20296a290300370300200e20286a210e4200210420242005470d020b200c450d040c030b201141081020000b410121050c000b0b200b101d0b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a220f200841186a290300370300200641f8006a41106a2200200841106a290300370300200641f8006a41086a221a200841086a29030037030020062008290300370378200e2013470d01200e41016a2205200e490d00200e4101742211200520052011491b2213ad42287e2204422088a70d002004a722054100480d0002400240200e450d002012200e41286c2005101e2212450d010c030b2005101f22120d020b200541081020000b1021000b2012200e41286c6a22052006290378370300200541206a2009290300370300200541186a200f290300370300200541106a2000290300370300200541086a201a290300370300200e41016a210e0b2006200e360280012006201336027c200620123602782001200641f8006a10f101200641a0016a24000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b200128020020022004101e2203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d06200128020020022004101e2203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d07200128020020022004101e2203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a200128020020022004101e2203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004101f22030d0b0b200441011020000b2004101f22030d070b200441011020000b2004101f22030d090b200441011020000b2004101f22030d010b200441011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d01200128020020022000101e2202450d020c040b200128020021020c040b2000101f22020d020b200041011020000b1021000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bd61701267f230041900d6b2203240020034100360210419bb5c0004110200341106a41041003200341086a2204420037030020034200370300418cb9c000410d20031001200341106a41086a2205200429030037030020032003290300370310200320003703f00c200341106a4110200341f00c6a41081003200442003703002003420037030041eab8c0004111200310012005200429030037030020032003290300370310200341106a4110200141201003024002404110101f2204450d00200441086a410029009dba4037000020044100290095ba40370000200441104120101e2205450d0120052000427f7c370010200341086a22044200370300200342003703002005411820031001200341106a41086a2206200429030037030020032003290300370310200341106a41102001412010032005101d20044200370300200342003703004199b9c0004115200310012006200429030037030020032003290300370310200341106a41102002412010032004420037030020034200370300418cb9c000410d2003100120062004290300370300200320032903003703100240200341106a411041f8b3c200410041001002417f460d00200342003703f00c02400240200341106a4110200341f00c6a41084100100241016a41084d0d0020032903f00c4200510d02200341086a2204420037030020034200370300418cb9c000410d20031001200341106a41086a20042903003703002003200329030037031041002107427f21000240200341106a411041f8b3c200410041001002417f460d00200342003703f00c200341106a4110200341f00c6a41084100100241016a41084d0d0220032903f00c427f7c21000b200341106a410041e00c10cd031a41002108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f41002120410021214100212241002123410021244100212541002126410021270340200341f00c6a42002000427f7c2000501b220010af01200341106a202722014103704105746a220441186a200341f00c6a41186a290200370000200441106a200341f00c6a41106a290200370000200441086a200341f00c6a41086a290200370000200420032902f00c370000200141016a21274100210541002102024003402001200141036e2206417d6c6a4102470d01200341106a20056a220441df006a2d000022262004411f6a2d000022287120262028722004413f6a2d00007172211c200441de006a2d000022262004411e6a2d000022287120262028722004413e6a2d00007172211b200441dd006a2d000022262004411d6a2d000022287120262028722004413d6a2d00007172211a200441dc006a2d000022262004411c6a2d000022287120262028722004413c6a2d000071722119200441db006a2d000022262004411b6a2d000022287120262028722004413b6a2d000071722118200441da006a2d000022262004411a6a2d000022287120262028722004413a6a2d000071722117200441d9006a2d00002226200441196a2d00002228712026202872200441396a2d000071722116200441d8006a2d00002226200441186a2d00002228712026202872200441386a2d000071722115200441d7006a2d00002226200441176a2d00002228712026202872200441376a2d000071722114200441d6006a2d00002226200441166a2d00002228712026202872200441366a2d000071722113200441d5006a2d00002226200441156a2d00002228712026202872200441356a2d000071722112200441d4006a2d00002226200441146a2d00002228712026202872200441346a2d000071722111200441d3006a2d00002226200441136a2d00002228712026202872200441336a2d000071722110200441d2006a2d00002226200441126a2d00002228712026202872200441326a2d00007172210f200441d1006a2d00002226200441116a2d00002228712026202872200441316a2d00007172210e200441d0006a2d00002226200441106a2d00002228712026202872200441306a2d00007172210d200441cf006a2d000022262004410f6a2d000022287120262028722004412f6a2d00007172210c200441ce006a2d000022262004410e6a2d000022287120262028722004412e6a2d00007172210b200441cd006a2d000022262004410d6a2d000022287120262028722004412d6a2d00007172210a200441cc006a2d000022262004410c6a2d000022287120262028722004412c6a2d000071722109200441cb006a2d000022262004410b6a2d000022287120262028722004412b6a2d000071722108200441ca006a2d000022262004410a6a2d000022287120262028722004412a6a2d000071722107200441c9006a2d00002226200441096a2d00002228712026202872200441296a2d00007172211d200441c8006a2d00002226200441086a2d00002228712026202872200441286a2d00007172211e200441c7006a2d00002226200441076a2d00002228712026202872200441276a2d00007172211f200441c6006a2d00002226200441066a2d00002228712026202872200441266a2d000071722120200441c5006a2d00002226200441056a2d00002228712026202872200441256a2d000071722121200441c4006a2d00002226200441046a2d00002228712026202872200441246a2d000071722122200441c3006a2d00002226200441036a2d00002228712026202872200441236a2d000071722123200441c2006a2d00002226200441026a2d00002228712026202872200441226a2d000071722124200441c1006a2d00002226200441016a2d00002228712026202872200441216a2d000071722125200441c0006a2d0000222620042d00002228712026202872200441206a2d000071722126200541800c460d01200341106a20052006410574200141096e41e0006c6b6a6a220441ff006a201c3a0000200441fe006a201b3a0000200441fd006a201a3a0000200441fc006a20193a0000200441fb006a20183a0000200441fa006a20173a0000200441f9006a20163a0000200441f8006a20153a0000200441f7006a20143a0000200441f6006a20133a0000200441f5006a20123a0000200441f4006a20113a0000200441f3006a20103a0000200441f2006a200f3a0000200441f1006a200e3a0000200441f0006a200d3a0000200441ef006a200c3a0000200441ee006a200b3a0000200441ed006a200a3a0000200441ec006a20093a0000200441eb006a20083a0000200441ea006a20073a0000200441e9006a201d3a0000200441e8006a201e3a0000200441e7006a201f3a0000200441e6006a20203a0000200441e5006a20213a0000200441e4006a20223a0000200441e3006a20233a0000200441e2006a20243a0000200441e1006a20253a0000200441e0006a20263a0000200541e0006a210520062101200241016a22024111490d000b0b202741d100470d000b2003201c3a008f0d2003201b3a008e0d2003201a3a008d0d200320193a008c0d200320183a008b0d200320173a008a0d200320163a00890d200320153a00880d200320143a00870d200320133a00860d200320123a00850d200320113a00840d200320103a00830d2003200f3a00820d2003200e3a00810d2003200d3a00800d2003200c3a00ff0c2003200b3a00fe0c2003200a3a00fd0c200320093a00fc0c200320083a00fb0c200320073a00fa0c2003201d3a00f90c2003201e3a00f80c2003201f3a00f70c200320203a00f60c200320213a00f50c200320223a00f40c200320233a00f30c200320243a00f20c200320253a00f10c200320263a00f00c200341086a220442003703002003420037030041fbb8c000411120031001200341106a41086a2205200429030037030020032003290300370310200341106a4110200341f00c6a41201003200442003703002003420037030041a5bac000410d200310012005200429030037030020032003290300370310200341106a41101009200341900d6a24000f0b41df88c0004133103a000b41df88c0004133103a000b41f0f3c200102c000b411041011020000b412041011020000bc41905027f017e157f017e097f230041f0026b22022400200241186a200110d501024002400240024002400240024002400240024002402002280218450d00200228021c2203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d012005101f2206450d032003450d020c040b20004100360200200241f0026a24000f0b4108210620030d020b41002116410021130c020b200541081020000b200241ec016a2105200241d8016a41086a2107200241d8016a41047221082002419d016a2109200241d8016a41076a210a200241206a410172210b200241a0026a210c200241eb016a220d41056a210e20024190026a210f410021104100211141002112200321130340200241003a00d8012001280200200141046a2214280200200241d8016a4101200141086a22152802001002211620152015280200201641016a41014b22166a22173602002016450d0220022d00d801221641044b0d0202400240024002400240024002400240024002400240024002400240024020160e050004020301000b200241086a200110d5012002280208450d10200228020c2216417f4c0d142016450d04201610792218450d0a20152016410020012802002014280200201820162015280200100222142014417f461b2214201420164b1b221420152802006a36020020142016460d050c090b20142802002116200241003602d8012015410020012802002016200241d8016a41042017100222162016417f461b22164104201641044922161b20152802006a36020020160d0f20022802d8012116200241106a200110d5012002280210450d0f20022802142217417f4c0d132017450d06201710792219450d0a20152017410020012802002014280200201920172015280200100222142014417f461b2214201420174b1b221420152802006a36020020142017470d070c0b0b200241d8016a41186a221b4200370300200241d8016a41106a2219420037030020074200370300200242003703d8012015410020012802002014280200200241d8016a41202017100222162016417f461b2216412020164120491b20152802006a3602002016411f4d0d0e200241c8016a41086a200a41086a2800003602002002200a2900003703c8012002200d290000370390012002200e2900003700950120022f01d801211520022d00da01211620022800db0121182009411f6a200241d8016a411f6a290000370000200941186a201b290000370000200941106a2019290000370000200941086a2007290000370000200920022900d8013700002018410876211b20152016411074722116410121190c0b0b200242003703d8012015410020012802002014280200200241d8016a41082017100222162016417f461b2216410820164108491b20152802006a2217360200201641074d0d0d20022903d8012104200f4200370300200241d8016a41306a4200370300200241d8016a41286a4200370300200241d8016a41206a4200370300200241d8016a41186a4200370300200241d8016a41106a420037030020074200370300200242003703d8012015410020012802002014280200200241d8016a41c0002017100222162016417f461b221641c000201641c000491b20152802006a3602002016413f4d0d0d200241c8016a41086a200a41086a28000036020020024190016a41086a200d41086a29000037030020024190016a41106a200d41106a29000037030020024190016a41186a200d41186a29000037030020024190016a41206a200d41206a29000037030020024190016a41256a200d41256a2900003700002002200a2900003703c8012002200d2900003703900120022800db012218410876211b20022f01d80120022d00da01411074722116410221190c0a0b200241a8026a2001105e20022802a8022218450d0c20022902ac022104200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220043703c80120022008290200370390012018410876211b410021190c020b410121182001280200201428020041014100201528020010021a41002016470d040b200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220082902003703900120022016ad22044220862004843703c8012018410876211b410421190b0c060b410121192001280200201428020041014100201528020010021a41002017460d040b2017450d072019101d0c070b2016450d062018101d0c060b201641011020000b201741011020000b2019450d032016411876211820022017ad221a422086201a843702cc01200220193602c801410321190b200241e0026a41086a221c200241c8016a41086a280200360200200241a8026a41086a221520024190016a41086a290300370300200241a8026a41106a221420024190016a41106a290300370300200241a8026a41186a221720024190016a41186a290300370300200241a8026a41206a221d20024190016a41206a290300370300200241a8026a41286a221e20024190016a41286a290300370300200241a8026a41306a221f20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a80220024180016a41086a2220201c280200360200200241c8006a41086a221c2015290300370300200241c8006a41106a22212014290300370300200241c8006a41186a22222017290300370300200241c8006a41206a2223201d290300370300200241c8006a41286a221d201e290300370300200241c8006a41306a221e201f280200360200200220022903e00237038001200220022903a8023703482007200229038001370000200741086a202028020036000020052002290348370000200541086a201c290300370000200541106a2021290300370000200541186a2022290300370000200541206a2023290300370000200541286a201d290300370000200541306a201e2802003600002002201b410874201841ff0171723602dc01200220193a00d801200220163b00d901200220164110763a00db01200c2004370300200241206a200241d8016a10b70220022d00202118200241a8026a411f6a2219200b411f6a2900003700002017200b41186a2900003703002014200b41106a2900003703002015200b41086a2900003703002002200b2900003703a80220184103460d03201241016a2116200241d8016a411f6a221c2019290000370000200241d8016a41186a22192017290300370300200241d8016a41106a2217201429030037030020072015290300370300200220022903a8023703d801024020122013470d002010201620162010491b2213ad42287e221a422088a70d05201aa722154100480d0502402012450d00200620112015101e22060d010c070b2015101f2206450d060b200620116a221520183a0000201541206a201c290000370000201541196a2019290300370000201541116a2017290300370000201541096a2007290300370000201541016a20022903d801370000201041026a2110201141286a21112016211220162003490d000b0b2000201336020420002006360200200041086a2016360200200241f0026a24000f0b200241e0026a41086a200241c8016a41086a280200360200200241a8026a41086a220520024190016a41086a290300370300200241a8026a41106a220120024190016a41106a290300370300200241a8026a41186a221520024190016a41186a290300370300200241a8026a41206a20024190016a41206a290300370300200241a8026a41286a20024190016a41286a290300370300200241a8026a41306a20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a802200241033a0020200241a8026a411f6a200b411f6a2900003700002015200b41186a2900003703002001200b41106a2900003703002005200b41086a2900003703002002200b2900003703a8020b2000410036020002402012450d00200621050340024020052d00002201450d00024020014101470d00200541086a280200450d01200541046a280200101d200541286a2105201141586a22110d020c030b200541106a280200450d002005410c6a280200101d0b200541286a2105201141586a22110d000b0b02402013450d002006101d0b200241f0026a24000f0b1021000b201541081020000b102e000bd90f03047f017e037f230041206b2202240002400240024020012d000022034101460d0020030d0241012103200141016a21010c010b2001410c6a2802002104200141046a2802002101410021030b200241106a20043602002002200136020c200220033602082000200241086a107f200241206a24000f0b20024100360210200242013703080240024002400240024002400240024002404101101f2203450d002002410136020c200241086a41086a22042004280200220541016a36020020022003360208200320056a41023a00000240024002400240024002400240200141086a2802004101470d00200228020c20042802002203470d01200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d03200228020820032005101e2204450d040c0a0b200228020c20042802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d04200228020820032005101e2204450d050c070b200228020821040c090b200228020821040c060b2005101f22040d060b200541011020000b2005101f22040d020b200541011020000b410141011020000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41003a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0820044101742203200520052003491b22034100480d082004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a10622001450d022003200141286c6a21080240024003400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0a20044101742205200120012005491b22014100480d0a2004450d01200228020820042001101e22050d020c050b200228020821050c020b2001101f2205450d030b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0720044101742201200920092001491b22014100480d07024002402004450d00200520042001101e22050d010c050b2001101f2205450d040b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000c050b0b200141011020000b200141011020000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41013a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2205200341086a360200200420036a2006370000200141206a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a10622001450d002003200141286c6a210803400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0620044101742205200120012005491b22014100480d062004450d01200228020820042001101e22050d020c070b200228020821050c020b2001101f2205450d050b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0320044101742201200920092001491b22014100480d03024002402004450d00200520042001101e22050d010c070b2001101f2205450d060b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000b0b200228020c210120022802082103200241106a220420042802003602002002200336020c200241043602082000200241086a107f02402001450d002003101d0b200241206a24000f0b1021000b200141011020000b200141011020000bc90301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081002210420012001280208200441016a41014b22046a22053602080240024002402004450d0002400240024020022d000f220641037122044102460d0020044101460d0120040d0220064102762104410121030c050b20024100360208200220063a000841012103200141086a220441002001280200200141046a280200200241086a41017241032005100222012001417f461b22014103200141034922011b20042802006a36020020010d03200228020841027621040c040b41002103200241003b0106200220063a00062001280200200141046a280200200241066a4101724101200510022104200141086a22012001280200200441016a220141014b6a36020020014102490d0120022f01064102762104410121030c030b200641034b0d02200141046a28020021044100210320024100360200200141086a2206410020012802002004200241042005100222012001417f461b22014104200141044922011b20062802006a36020020010d0020022802002104410121030c020b0c010b410021030b2000200436020420002003360200200241106a24000bf19601060a7f027e057f027e037f087e230041d0026b22022400200241003a001020012802002001280204200241106a410120012802081002210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00102203410c4b0d0a024020030e0d00090607030a0c080e050d0204000b41002105200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22012001280200200341016a41014b22016a3602002001450d10024020022d00102201450d004101210520014101470d110b200020053a0001200041003a0000200041026a200241106a41ee0010ce031a200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d4a20022d0010220341054b0d4a024020030e06003836373539000b200241286a4200370300200241206a22064200370300200241106a41086a2207420037030020024200370310200141086a220841002001280200200141046a2209280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a220a3602002003411f4d0d4a20022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200642003703002007420037030020024200370328200242003703102008410020012802002009280200200241106a4120200a100222062006417f461b2206412020064120491b20082802006a22113602002006411f4d0d4a2002412e6a2f010021122002412a6a2801002107200241286a2f01002109200241276a2d0000210a200241106a410f6a2900002113200229001721142002280013210620022f0011211520022d00102116200242003703182002420037031041002108200141086a221741002001280200200141046a280200200241106a41102011100222012001417f461b2201411020014110491b20172802006a3602002001410f4d0d4a2012ad42ffff03832118200241106a41086a29030021192002290310211a0c4e0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1620022d001022034102460d1420034101460d1320030d1620024200370318200242003703104100210b200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d16200241106a41086a290300210d200229031021132002350097022002419b026a310000422086842118200241a8026a290300210c20022903a0022114200228029c022101200228009302210e20022f009102210f20022d00900221100c150b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1020022d001022034101460d0e20030d1041002103200241003a00102001280200200141046a280200200241106a4101200410022104200141086a22012001280200200441016a41014b22016a3602002001450d1020022d001021010c0f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d4e20022d0010450d0c0c4e0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d164103210520022d0010220341034b0d16024020030e040015164d000b20024188026a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d162005290300210d200241fb016a3100002118200229038002210c20022802fc01210920022800f301210720022f00f101210620022d00f001210820023500f70121132002420037031820024200370310200341002001280200200b280200200241106a4110200e100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d1620132018422086842118200241186a2903002213422088a7210a2002290310211b2013a7210b4200211341002105420021140c4c0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d0820022d00100d0820024200370310200141086a220341002001280200200141046a280200200241106a41082004100222012001417f461b2201410820014108491b20032802006a360200200141074d0d0820022903102118200041033a0000200041086a2018370300200020022800a801360001200041046a200241a8016a41036a280000360000200041106a200241106a41e00010ce031a200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1e20022d001022034101460d0d20030d1e20024188026a220e420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f00141002105200141086a220b41002001280200200141046a280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22043602002003411f4d0d1920023500f701200241fb016a310000422086842118200e290300210c200229038002210d20022802fc01210320022800f301210b20022f00f101210e20022d00f001210f410121050c1a0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d0520022d00100d0520024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d05200241f0016a410b6a310000211820022800f301210f20022f00f101211020022d00f001210820022802fc012104200229038002210c20023500f701210d200241e1016a22062005290300370000200220183c00d4012002200d3e02d0012002200c3700d901200220043600d501200b2802002104200241003602102003410020012802002004200241106a4104200e100222012001417f461b2201410420014104491b20032802006a360200200141034d0d0520022802102101200241d0016a41096a29000021182006290000210c20022800d501210320023502d001210d200041136a20023100d4013c00002000410f6a200d3e0000200041206a200c370000200041186a2018370000200041013a0000200041146a20033600002000410b6a200f360000200041096a20103b0000200041086a20083a0000200041046a2001360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041286a200241106a41c80010ce031a200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d3d20022d0010220341084b0d3d024020030e090037333432383a363c000b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d3d20022802102103420021182002420037031820024200370310200541002001280200200b280200200241106a41102004100222012001417f461b2201411020014110491b20052802006a3602002001410f4d0d3d2002290214220c422088a72105200228021c210f20022802102101200ca721104100210b420021130c3c0b2000410d3a0000200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d3d20022d0010220341034b0d3d024020030e0400141213000b20024188026a220e420037030020024180026a4200370300200241f0016a41086a220f4200370300200242003703f001200141086a220b41002001280200200141046a2210280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22083602002003411f4d0d3d200241fb016a2207310000210d200e290300211820022802fc01210620022800f301210320022f00f101210420022d00f001210520023500f7012113200229038002210c200e4200370300200f42003703002002420037038002200242003703f001200b410020012802002010280200200241f0016a41202008100222012001417f461b2201412020014120491b200b2802006a3602002001411f4d0d3d20073100002114200241fc016a2802002101200241f0016a41106a290300211920022d00f001210b20022f00f101210e20022800f301210f20023500f701211a200241e1016a200241f0016a41186a290300370000200220193700d901200220013600d5012002411f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220143c00d4012002201a3e02d0012002200f3600132002200e3b00112002200b3a0010200220022903d00137001720024190026a41186a2201200241106a41186a29030037030020024190026a41106a220b200241106a41106a29030037030020024190026a41086a220e200241106a41086a290300370300200220022903103703900220024180016a411f6a220f201842188822144220883c0000200220063b018c012002418e016a20064110763a00002002200ca722103b01900120024192016a20104110763a0000200241b5016a200e290300370000200241bd016a200b290300370000200241c5016a200129030037000020022013200d42208684220d3e0087012002200d4220883c008b01200220064118763a008f01200220143e009b012002200c4218882018422886842218370093012002200336008301200220043b008101200220053a008001200220143e02a80120022002290390023700ad012002200f2d00003a00ac01200228008b01210f200228008f01210e200da7210b410021100c140b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d2620022d0010220341044b0d26024020030e0500231e201b000b200141046a28020021054100210320024100360210200141086a220b410020012802002005200241106a41042004100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d2620022802102101420021130c240b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d2720022d0010220341044b0d27024020030e0500271e201b000b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d27200241fb016a310000211820023100f001211920023300f101211c20023500f301211d200229038002211b20023500f701210c20022802fc012104200241e1016a2005290300221a370000200220043600d501200220183c00d4012002200c3e02d0012002201b3700d901200241d0016a41086a310000211e20022903d0012118200b2802002104200241003602102003410020012802002004200241106a4104200e100222042004417f461b2204410420044104491b20032802006a2205360200200441034d0d272002280210210e20024188026a2204420037030020024180026a220b4200370300200241f0016a41086a4200370300200242003703f001200141086a220f41002001280200200141046a2210280200200241f0016a41202005100222032003417f461b2203412020034120491b200f2802006a22083602002003411f4d0d272004290300210d200b2903002113200241fc016a2802002103200241fb016a310000210c20022800f301210420022f00f101210520022d00f001210b20023500f701211f2010280200211020024100360210200f410020012802002010200241106a41042008100222012001417f461b2201410420014104491b200f2802006a360200200141034d0d27201e42388620184208888421142018423886201d42188684201c420886842019842119201f200c422086842118201b421888201a42288684210c201a421888211a201ea741ff0171211020022802102108201ba72101410021060c1b0b2000410d3a0000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241106a200110a40120022802102201450d4120022902142118200041093a0000200041086a2018370000200041046a2001360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041106a200241106a41e00010ce031a200241d0026a24000f0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000210d20022800f301210f20022f00f101211020022d00f0012101200229038002210c20023500f701211320022802fc012103200241e1016a20052903002218370000200220033600d5012002200d3c00d401200220133e02d0012002200c3700d901200c423888201842088684a7210e2018423088a721042018421088a7210520022903d001210d20022903d801210c2018a7210b410121030b200020033a00012000410c3a0000200041206a20043b00002000411c6a20053600002000411a6a200b3b0000200041196a200e3a0000200041116a200c370000200041096a200d370000200041056a200f360000200041036a20103b0000200041026a20013a0000200041226a200241106a41ce0010ce031a200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b20024188026a220e420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f00141002105200141086a220b41002001280200200141046a280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a220b3602002003411f4d0d0d200229038002221842ffffff0783210c2018428080807883210d20022802fc01220341ffffff077121052003418080807871210320023500f701200241fb016a310000422086842118200e290300211320022800f301210e20022f00f101210f20022d00f0012110410121040c0e0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220b41002001280200200141046a220e280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a220f3602002003411f4d0d022005290300210c200241f0016a410b6a310000210d200229038002211820022802fc01211020022800f301210320022f00f101210420022d00f001210520023500f7012113200e280200210e20024100360210200b41002001280200200e200241106a4104200f100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d0220022802102101200220103b018c012002418e016a20104110763a000020022013200d42208684220d3e00870120024180016a410b6a200d4220883c000020022018a7220b3b01900120024192016a200b4110763a00002002419f016a200c4238883c00002002419b016a200c4218883e000020022018421888200c4228868437009301200220104118763a008f012002200336008301200220043b008101200220053a0080012018423888200c42088684a72110200c4230882118200c421088a7210e2002290087012113200229008f01210d200ca7210f4101210b0c010b20024188026a220e4200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220b41002001280200200141046a220f280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22103602002003411f4d0d01200241fb016a310000211820022800f301210320022f00f101210420022d00f001210520022802fc012108200229038002210c20023500f701210d200241c1026a200e290300370000200220183c00b4022002200d3e02b0022002200c3700b902200220083600b502200242003703b001200242003703a801200b41002001280200200f280200200241a8016a41102010100222012001417f461b2201411020014110491b200b2802006a3602002001410f4d0d01200241a8016a41086a290300210c20022903a8012114200241106a410f6a2201200241b0026a41086a2903003700002002412f6a200241c8026a2d00003a000020022003360013200220043b0011200220053a0010200220022903b0023700172002200241c0026a2903003700272001290000210d20022900172113200233012e2118200228012a210e20022f0128210f20022d002721104102210b0b200020022800a801360001200041043a00002000412b6a20184220883c0000200041276a20183e0000200041386a200c370000200041306a20143700002000412c6a2001360000200041236a200e360000200041216a200f3b0000200041206a20103a0000200041186a200d370000200041106a20133700002000410c6a20033600002000410a6a20043b0000200041096a20053a0000200041086a200b3a0000200041c0006a2002290310370300200041046a200241ab016a280000360000200041c8006a200241106a41086a290300370300200041d0006a200241106a41106a290300370300200041d8006a200241106a41186a290300370300200041e0006a200241106a41206a290300370300200041e8006a200241386a290300370300200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f0014100210b200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000211820022d00f001210120022f00f101210320022800f301210420023500f701210c20022802fc01210e200229038002210d200241e1016a20052903003700002002200d3700d9012002200e3600d5012002419f026a200241d0016a41086a290300370000200241a7026a200241d0016a41106a29030037000020024190026a411f6a200241d0016a41186a2d00003a0000200220183c00d4012002200c3e02d0012002200436009302200220033b009102200220013a009002200220022903d00137009702200229039002221342388820024190026a41086a290300220c420886842118200c422088a721092013421888a721072013420888a7210620024190026a41186a290300210d20022903a002210c2013a72108410121054100210a0c370b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220341002001280200200141046a220e280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d00200241fb016a2207310000211820022d00f001210420022f00f101211020022800f301210820023500f701210c20022802fc012106200229038002210d200241d0016a41116a20052903003700002002200d3700d901200220063600d501200241106a410f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220183c00d4012002200c3e02d00120022008360013200220103b0011200220043a0010200220022903d001370017200241106a41186a290300210d200241106a41086a290300211a2002290320210c2002290310211920054200370300200b42003703002002420037038002200242003703f001200341002001280200200e280200200241f0016a4120200f100222042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d00200241fc016a2802002103200241f0016a41106a29030021182007310000211320022800f301211020022f00f101210f20022d00f001210e20023500f7012114200241b0026a41116a20024188026a290300370000200220133c00b402200220143e02b002200220183700b902200220033600b5022002420037031820024200370310200141086a220341002001280200200141046a220b280200200241106a41102005100222042004417f461b2204411020044110491b20032802006a22053602002004410f4d0d00200241106a41086a2903002114200229031021132002420037031820024200370310200341002001280200200b280200200241106a41102005100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d002019423888201a4208868421182019421888a721072019420888a721062019a72108200241106a41086a290300211c2002290310211e2002419f016a2201200241c8026a2d00003a000020022010360083012002200f3b0081012002200e3a008001200220022903b002370087012002200241b0026a41086a29030037008f012002200241c0026a29030037009701201a422088a7418080807871201a422088a741ffffff07717221092001310000211a2002290097012119200228009301210a200228008f01210b200229008701211b410221050c360b2000410d3a0000200241d0026a24000f0b200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b2201410420014104491b20052802006a360200200141034d0d2b20022802102103200241a8016a411d6a200241106a411d6a290000370000200241a8016a41186a200241106a41186a290200370300200241a8016a41106a200241106a41106a290200370300200241a8016a41086a200241106a41086a290200370300200220022902103703a801410221100c020b200241106a2001105e20022802102203450d2a2002290214210c200241106a2001105e200ca7210b2002280210220e450d2920022902142118200241a8016a411d6a200241106a411d6a290000370000200241a8016a41186a200241106a41186a290200370300200241a8016a41106a200241106a41106a290200370300200241a8016a41086a200241106a41086a290200370300200220022902103703a801200c422088a7210f410321100c010b200241f0016a41186a220b4200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d29200241fb016a310000210d20022800f301210320022f00f101210420022d00f001210520023500f701210c200229038002211820022802fc012101200241c1026a200b2903002213370000200241b5016a200241106a41086a290000370000200241bd016a200241106a41106a290000370000200241c5016a200241106a41186a290000370000200220013600b5022002200d3c00b402200220183700b9022002200c3e02b002200220022900103700ad01200220022802c4023602a8012002200241b0026a41186a2d00003a00ac012018421888201342288684211820022802b402210f20022802b802210e200ca7210b410121100b200241106a411d6a2208200241a8016a411d6a290000370000200241106a41186a2201200241a8016a41186a290300370300200241106a41106a2206200241a8016a41106a290300220c370300200241106a41086a2207200241a8016a41086a290300220d37030020024180016a41086a2209200d37030020024180016a41106a220a200c37030020024180016a41186a2215200129030037030020024180016a411d6a22162008290000370000200220022903a801220c370380012002200c370310200041063a0000200041186a2018370000200041146a200e360000200041106a200f3600002000410c6a200b360000200041086a2003360000200041066a20043b0000200041056a20053a0000200041046a20103a0000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041206a200229038001370000200041286a2009290300370000200041306a200a290300370000200041386a20152903003700002000413d6a2016290000370000200041e8006a200241106a41206a290300370300200041e0006a2001290300370300200041d8006a2006290300370300200041d0006a2007290300370300200041c8006a2002290310370300200241d0026a24000f0b0b200241e1016a200c3700002002200d3700d901200220033600d501200220183e02d001200220184220883c00d4012005450d03200141046a2208280200211020024100360210200141086a2205410020012802002010200241106a41042004100222042004417f461b2204410420044104491b20052802006a2210360200200441034d0d032002280210210620082802002104200241003602102005410020012802002004200241106a41042010100222042004417f461b2204410420044104491b20052802006a2210360200200441034d0d0320022802102104200141046a28020021084100210520024100360210200141086a2207410020012802002008200241106a41042010100222012001417f461b2201410420014104491b20072802006a360200200141034d0d03200228021021012002419b016a200c42188822133e00002002419f016a20134220883c00002002200da722103b01900120024192016a20104110763a0000200220033b018c012002418e016a20034110763a0000200220183e0087012002418b016a20184220883c00002002200d421888200c422886843700930120024190026a41186a20024180016a41186a29030037030020024190026a41106a200229039001370300200220034118763a008f0120024190026a41086a20024180016a41086a2903003703002002200b360083012002200e3b0081012002200f3a0080012002200229038001370390020c020b4200210c4200210d4200211341002103410021040b200241e1016a20134200843700002002200d200c843700d901200220032005723600d501200220183e02d001200220184220883c00d4012004450d01200241b0026a41186a200241d0016a41186a2d00003a0000200241b0026a41106a200241d0016a41106a290300370300200241b0026a41086a200241d0016a41086a290300370300200220022903d0013703b002200141046a22052802002104200241003602a801200141086a2203410020012802002004200241a8016a4104200b100222042004417f461b2204410420044104491b20032802006a220b360200200441034d0d0120022802a801210620052802002104200241003602a8012003410020012802002004200241a8016a4104200b100222042004417f461b2204410420044104491b20032802006a2205360200200441034d0d0120022802a8012104200141046a2802002103200241003602a801200141086a220b410020012802002003200241a8016a41042005100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d0120022802a80121012002411f6a200241b0026a41086a290300370000200241276a200241b0026a41106a2903003700002002412f6a200241b0026a41186a2d00003a00002002200e3600132002200f3b0011200220103a0010200220022903b00237001720024190026a41186a200241106a41186a29030037030020024190026a41106a200241106a41106a29030037030020024190026a41086a200241106a41086a2903003703002002200229031037039002410121050b200241a8016a41186a20024190026a41186a2903002218370300200241a8016a41106a20024190026a41106a290300220c370300200241a8016a41086a20024190026a41086a290300220d37030020024180016a41086a2203200d37030020024180016a41106a220b200c37030020024180016a41186a220e20183703002002200229039002221837038001200220183703a801200041073a0000200041046a20053a0000200041306a20013600002000412c6a2004360000200041286a2006360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041056a2002290380013700002000410d6a2003290300370000200041156a200b2903003700002000411d6a200e290300370000200041346a20022902103702002000413c6a200241106a41086a290200370200200041c4006a200241106a41106a290200370200200041cc006a200241106a41186a290200370200200041d4006a200241306a290200370200200041dc006a200241106a41286a290200370200200041e4006a200241106a41306a290200370200200041ec006a200241c8006a280200360200200241d0026a24000f0b200241a8016a41186a20024190026a41186a290300370300200241a8016a41106a20024190026a41106a290300370300200241a8016a41086a20024190026a41086a29030037030020022002290390023703a8012000410d3a0000200241d0026a24000f0b4200210c20024200370318200242003703104104210341002105200141086a220b41002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b200b2802006a3602002001410f4d0d0b200241106a41086a2903002113200229031021144200210d0c080b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d0c200241f0016a410b6a310000211820022d00f001210f20022f00f101211020022800f301210820023500f701210c20022802fc012104200229038002210d200241b0026a41186a200529030022134238883c0000200241c4026a20134218883e02002002200da722053b00b902200241b0026a410b6a20054110763a0000200241106a410b6a20183c00002002200d4218882013422886843702bc02200241106a41186a200241c1026a290000370300200220044118763a00b802200220044110763a00b702200220043b00b502200220183c00b4022002200c3e02b0022002200c3e001720022008360013200220103b00112002200f3a0010200220022800b50236021c200220022900b902370320200241003a00a8012001280200200b280200200241a8016a4101200e1002210120032003280200200141016a41014b22016a3602002001450d0c20022d00a801210b200241206a2903002218421888200241286a290300220d42288684210c200d421888211a200241186a2903002214423888a72110200229031021192018a72101410421060b0c270b200141046a220b280200210520024100360210200141086a2203410020012802002005200241106a41042004100222042004417f461b2204410420044104491b20032802006a220e360200200441034d0d08200228021021052002420037031820024200370310200341002001280200200b280200200241106a4110200e100222042004417f461b2204411020044110491b20032802006a220b3602002004410f4d0d08200241106a41086a290300210d2002290310210c20024188026a22044200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a4120200b100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d08200241fb016a310000211320022800f301210120022f00f101210f20022d00f001211020023500f701211420022802fc0121032002290380022118200241c1026a20042903002219370000200220183700b902200220033600b502200220133c00b402200220143e02b0022018423888201942088684a7210e201942308821182019421088a72104200241b0026a41086a290300211320022903b00221142019a7210b410221030c070b200241f0016a41186a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d092005290300211820022d00f001210320022f00f101210420022800f301210520022802fc012101200229038002210d20023500f701211320024190026a410b6a200241f0016a410b6a31000022143c000020024190026a41186a2018370300200220133e0097022002200d3703a0022002200136029c022002200536009302200220043b009102200220033a009002200d421888201842288684210c2001ad4220862013201442208684221342088884211420134238862005ad421886842004ad42ffff0383420886842003ad42ff0183842119200141187621102018421888211a200da72101410221060c020b2002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d06200241106a41086a29030021132002290310211420023502d00120023100d401422086842118200241e1016a290000210d20022900d901210c20022800d5012105410321030c030b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0720052903002118200241f0016a410b6a310000210d20022d00f001210420022f00f101210520022900f3012113200229038002210c2002418e016a220b20022802fc0122034110763a000020024180016a410b6a200d3c000020024180016a411f6a20184238883c00002002419b016a2018421888221a3e000020024192016a200ca722014110763a0000200220033b018c012002201337008301200220053b008101200220043a008001200220013b0190012002200341187622103a008f012002200c421888201842288684220c3700930120024180016a41086a350200200233018c01200b310000421086844220868421142002290380012119410321060b0c220b200242003703b001200242003703a801200141086a220341002001280200200141046a280200200241a8016a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d03200241a8016a41086a290300211320022903a801211420023500172002411b6a310000422086842118200241286a290300210d2002290320210c200228021c21052002280013210420022f0011210b20022d0010210e410121030b0b0b200020022800a8013600012000410a3a00002000412b6a20184220883c0000200041276a20183e0000200041386a200d370000200041306a200c3700002000412c6a2005360000200041236a2004360000200041216a200b3b0000200041206a200e3a0000200041186a2013370000200041106a20143700002000410c6a20013600002000410a6a200f3b0000200041096a20103a0000200041086a20033a0000200041c0006a2002290310370300200041046a200241ab016a280000360000200041c8006a200241106a41086a290300370300200041d0006a200241106a41106a290300370300200041d8006a200241106a41186a290300370300200041e0006a200241106a41206a290300370300200041e8006a200241386a290300370300200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220341002001280200200141046a220e280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d002005290300211a200241fb016a22103100002114200229038002211b20022802fc01210820022800f301210620022f00f101210720022d00f001210920023500f701211920054200370300200b42003703002002420037038002200242003703f001200341002001280200200e280200200241f0016a4120200f100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d0020024188026a290300210d20024180026a2903002113200241fc016a28020021032010310000211820022800f301210420022f00f101210520022d00f001210b20023500f701210c200241003a00102001280200200141046a2210280200200241106a4101200e1002210f200141086a220e200e280200200f41016a41014b220f6a220a360200200f450d0020022d0010210f2010280200211020024100360210200e410020012802002010200241106a4104200a100222102010417f461b2210410420104104491b200e2802006a220a360200201041034d0d002002280210210e200141046a280200211020024100360210200141086a2215410020012802002010200241106a4104200a100222012001417f461b2201410420014104491b20152802006a360200200141034d0d00200c2018422086842118201b421888201a42288684210c2008ad422086201920144220868442ffffffffff1f83221942088884211420194238862006ad421886842007ad42ffff0383420886842009ad42ff018384211920084118762110201a421888211a20022802102108201ba72101410121060c1c0b2000410d3a0000200241d0026a24000f0b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220841002001280200200141046a2206280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a22073602002003411f4d0d1520022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200241003a001020012802002006280200200241106a410120071002210120082008280200200141016a41014b22016a3602002001450d1520022d00102116410421080c190b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220341002001280200200141046a280200200241106a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1420022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110410221080c180b200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b2201410420014104491b20052802006a36020041032108200141034d0d132002280210210e0c170b200241286a4200370300200241206a22064200370300200241106a41086a2207420037030020024200370310200141086a220841002001280200200141046a2209280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a220a3602002003411f4d0d1220022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200642003703002007420037030020024200370328200242003703102008410020012802002009280200200241106a4120200a100222012001417f461b2201412020014120491b20082802006a3602002001411f4d0d122002412e6a33010021182002412a6a2801002107200241286a2f01002109200241276a2d0000210a2002411f6a2900002113200229001721142002280013210620022f0011211520022d00102116410121080c160b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220541002001280200200141046a280200200241106a41202004100222032003417f461b2203412020034120491b20052802006a3602002003411f4d0d1120022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200241086a200110d5012002280208450d11200228020c2208417f4c0d122008450d0f200810792206450d13200141086a2207200841002001280200200141046a280200200620082007280200100222012001417f461b2201200120084b1b220120072802006a36020020012008470d100c140b4104210b200141046a28020021034100210520024100360210200141086a220e410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200e2802006a360200200141034b0d020c0b0b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d0a20022802102103200241003a00102001280200200b280200200241106a410120041002210120052005280200200141016a41014b22016a3602002001450d0a20022d0010220441034f0d0a4102210b0c070b200141046a28020021034100210520024100360210200141086a220b410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200b2802006a3602004103210b200141034d0d090b200228021021030c030b20024188026a220b420037030020024180026a4200370300200241f0016a41086a220f4200370300200242003703f001200141086a220541002001280200200141046a2210280200200241f0016a41202004100222032003417f461b2203412020034120491b20052802006a22083602002003411f4d0d07200241fb016a2207310000210d200b290300211820022802fc01210620022800f301210320022f00f101210e20022d00f001210420023500f7012113200229038002210c200b4200370300200f42003703002002420037038002200242003703f0012005410020012802002010280200200241f0016a41202008100222012001417f461b2201412020014120491b20052802006a3602002001411f4d0d0720073100002114200241fc016a2802002101200241f0016a41106a290300211920022d00f001210520022f00f101210b20022800f301210f20023500f701211a200241e1016a200241f0016a41186a290300370000200220193700d901200220013600d501200241106a410f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220143c00d4012002201a3e02d0012002200f3600132002200b3b0011200220053a0010200220022903d00137001720024190026a41186a200241106a41186a29030037030020024190026a41106a200241106a41106a29030037030020024190026a41086a200241106a41086a2903003703002002200229031037039002200220063b018c012002418e016a20064110763a00002002200ca722013b01900120024192016a20014110763a00002002200c421888201842288684221b370093012002419b016a201842188822143e000020024180016a411f6a20144220883c000020022013200d42208684221a3e0087012002201a4220883c008b01200220064118763a008f0120022003360083012002200e3b008101200220043a008001200c423888201842088684210c2018423888200235029002200233019402200231009602421086844220868442088684210d20024190026a410f6a290000211320024190026a411f6a3100002119200229009702211820022900a7022114200228008b012110200228008f012105201ba7210f201aa721014107210b0c060b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d06200228021021032002420037031820024200370310200541002001280200200b280200200241106a41102004100222042004417f461b2204411020044110491b20052802006a3602002004410f4d0d06200241186a290300210d2002290310210c200241106a2001105e20022802102201450d0620022902142218422088a721052018a72110420021184101210b420021130c050b200141046a28020021034100210520024100360210200141086a220b410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d05200228021021034105210b0b0c030b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d0320022802102103200241003a00102001280200200b280200200241106a410120041002210120052005280200200141016a41014b22016a3602002001450d0320022d001021044106210b0b410021050c010b20024188026a2205420037030020024180026a42003703004108210b200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000210c20022800f301210320022f00f101210e20022d00f001210420023500f701211320022802fc0121012002290380022118200241c1026a2005290300220d370000200220183700b902200220013600b5022002200c3c00b402200220133e02b0022018423888200d42088684210c200d423888210d2018421888a7210f20022902b4022218422088a721052013a721012018a721100b200020022800a801360001200041053a0000200041c8006a2019370000200041c0006a2014370000200041386a2013370000200041306a2018370000200041286a200d370000200041206a200c3700002000411c6a200f360000200041106a20013600002000410c6a20033600002000410a6a200e3b0000200041096a20043a0000200041086a200b3a0000200041d0006a2002290310370300200041046a200241ab016a280000360000200041d8006a200241106a41086a290300370300200041e0006a200241106a41106a290300370300200041e8006a200241286a290300370300200041146a2005ad4220862010ad84370000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200b450d002003101d0b200241106a411d6a200241a8016a411d6a290000370000200241106a41186a200241a8016a41186a290300370300200241106a41106a200241a8016a41106a290300370300200241106a41086a200241a8016a41086a290300370300200220022903a8013703102000410d3a0000200241d0026a24000f0b410121062001280200200141046a28020041014100200141086a28020010021a41002008460d040b2008450d002006101d0b2000410d3a0000200241d0026a24000f0b102e000b200841011020000b2008ad22184220862018842114410521080b200020022800a8013600012000410b3a0000200041cb006a20184220883c0000200041c7006a20183e0000200041d8006a2019370000200041d0006a201a370000200041c3006a2007360000200041c1006a20093b0000200041c0006a200a3a0000200041386a2013370000200041306a20143700002000412c6a20063600002000412a6a20153b0000200041296a20163a0000200041276a20033b0000200041236a2004360000200041216a20053b0000200041206a200b3a0000200041186a200c370000200041106a200d3700002000410c6a200e3600002000410a6a200f3b0000200041096a20103a0000200041086a20083a0000200041046a200241ab016a280000360000200041e8006a200241106a41086a290300370300200041e0006a2002290310370300200241d0026a24000f0b200020022f00a8013b0001200041083a0000200041306a20184220883c00002000412c6a20183e00002000413d6a200d370000200041356a2013370000200041056a2019370000200041cc006a2008360000200041c8006a200e360000200041c5006a200f3a0000200041316a2003360000200041286a2004360000200041266a20053b0000200041256a200b3a0000200041046a20063a0000200041d0006a2002290310370300200041036a200241aa016a2d00003a0000200041d8006a200241106a41086a290300370300200041e0006a200241206a290300370300200041e8006a200241286a2903003703002000411d6a201a421886200c42288884370000200041156a200c4218862001ad42ffffff0783843700002000410d6a2010ad423886201442ffffffffffffffff008384370000200241d0026a24000f0b20002002280010360001200041023a0000200041146a20184220883c0000200041106a20183e0000200041e8006a201c370000200041e0006a201e370000200041d8006a2014370000200041d0006a2013370000200041c8006a201a370000200041c0006a2019370000200041306a201b370000200041216a200d370000200041196a200c3700002000412c6a20103600002000412a6a200f3b0000200041296a200e3a0000200041156a20093600002000410c6a20073600002000410a6a20063b0000200041096a20083a0000200041086a20053a0000200041046a200241136a280000360000200041386a200aad422086200bad84370000200241d0026a24000f0b2000410d3a0000200241d0026a24000bc40101017f024020002d0000417b6a220141064b0d00024002400240024020010e0700010404020403000b200041086a2d00004101470d03200041146a280200450d03200041106a280200101d0f0b200041046a2d00004103470d0202402000410c6a280200450d00200041086a280200101d0b200041186a280200450d02200041146a280200101d0f0b200041086a280200450d01200041046a280200101d0f0b200041086a2d00004105490d00200041306a280200450d002000412c6a280200101d0b0bf8d20105067f017e017f017e027f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410b4b0d0002400240024020030e0c0008050602090a070c040b01000b200141046a280200200141086a2802002203470d13200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d27200128020020032005101e2204450d280c500b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d18200128020020032005101e2204450d190c4a0b200141046a2205280200200141086a22042802002203470d0b200341016a22062003490d5020034101742207200620062007491b22074100480d502003450d19200128020020032007101e2206450d1a0c450b200141046a280200200141086a2802002203470d0b200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d1a200128020020032005101e2204450d1b0c420b200141046a280200200141086a2802002203470d0b200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d1b200128020020032005101e2204450d1c0c3f0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d1c200128020020032005101e2204450d1d0c3c0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1d200128020020032005101e2204450d1e0c390b200141046a280200200141086a2802002203470d0b200341016a22042003490d4620034101742205200420042005491b22054100480d462003450d1e200128020020032005101e2204450d1f0c360b200141046a280200200141086a2802002203470d0c200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d21200128020020032005101e2204450d220c330b200141046a280200200141086a2802002203470d0c200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d22200128020020032005101e2204450d230c300b200141046a280200200141086a2802002203470d0c200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d23200128020020032005101e2204450d240c2d0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4220034101742205200420042005491b22054100480d422003450d24200128020020032005101e2204450d250c2a0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4120034101742205200420042005491b22054100480d412003450d25200128020020032005101e2204450d260c270b200128020021040c3f0b200128020021060c3a0b200128020021040c370b200128020021040c340b200128020021040c310b200128020021040c2e0b200128020021040c2b0b200128020021040c3d0b200128020021040c270b200128020021040c240b200128020021040c210b200128020021040c1e0b200128020021040c1b0b2005101f22040d310b200541011020000b2007101f22060d2b0b200741011020000b2005101f22040d270b200541011020000b2005101f22040d230b200541011020000b2005101f22040d1f0b200541011020000b2005101f22040d1b0b200541011020000b2005101f22040d170b200541011020000b2005101f22040d280b200541011020000b2005101f22040d110b200541011020000b2005101f22040d0d0b200541011020000b2005101f22040d090b200541011020000b2005101f22040d050b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1d20034101742205200420042005491b22044100480d1d2003450d01200128020020032004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a200110622000450d142003200041286c6a2109200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000101e22060d020c050b200128020021060c020b2000101f2206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002108024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000101e22060d020c060b200128020021060c020b2000101f2206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20083700002009200341286a2203470d000c170b0b200041011020000b200041011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d11200128020020032005101e2204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d3820034101742205200420042005491b22054100480d382003450d0a200128020020032005101e2204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d0b200128020020032005101e2204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d0c200128020020032005101e2204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d3520034101742205200420042005491b22054100480d352003450d0f200128020020032005101e2204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d3420034101742205200420042005491b22054100480d342003450d10200128020020032005101e2204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005101f22040d130b200541011020000b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d0f0b200541011020000b2005101f22040d050b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2520044101742203200020002003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2320044101742203200520052003491b22034100480d232004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2120044101742203200520052003491b22034100480d212004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1f20044101742203200520052003491b22034100480d1f2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d1d20004101742204200520052004491b22044100480d1d2000450d01200128020020002004101e2200450d020c030b200128020021000c030b2004101f22000d010b200441011020000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a2006200310ce031a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000200041056a2104200141046a28020021062005280200210302400240024002400240024002400240024002400240200041046a2d00004101470d0020062003470d01200341016a22052003490d1f20034101742206200520052006491b22064100480d1f2003450d03200128020020032006101e2205450d040c090b20062003470d01200341016a22052003490d2320034101742206200520052006491b22064100480d232003450d04200128020020032006101e2205450d050c060b200128020021050c080b200128020021050c050b2006101f22050d050b200641011020000b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d2020054101742203200620062003491b22034100480d202005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41013a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1920054101742203200620062003491b22034100480d192005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d1920044101742203200520052003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2e20034101742205200420042005491b22054100480d2e2003450d0b200128020020032005101e2204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d06200128020020032005101e2204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d07200128020020032005101e2204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0a200128020020032005101e2204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d090b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a200110620240024002402004450d0020044105742107200141046a21090340024002400240024020092802002206200528020022046b41204f0d00200441206a220b2004490d1f20064101742204200b200b2004491b22044100480d1f2006450d01200128020020062004101e22060d020c060b200128020021060c020b2004101f2206450d040b2001200636020020092004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a200110622004450d1020044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22092004490d1e20054101742204200920092004491b22044100480d1e2005450d01200128020020052004101e22050d020c060b200128020021050c020b2004101f2205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c110b0b200441011020000b200441011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2c20034101742200200420042000491b22004100480d2c2003450d0b200128020020032000101e2204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d06200128020020032005101e2204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d07200128020020032005101e2204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0a200128020020032005101e2204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2000101f22040d090b200041011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2020044101742203200020002003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a370000200041e8006a2903002108200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1c20044101742203200020002003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0f200128020020032005101e2204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d08200128020020032005101e2204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d09200128020020032005101e2204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2820034101742205200420042005491b22054100480d282003450d0a200128020020032005101e2204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0d200128020020032005101e2204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1920044101742203200520052003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041256a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1720044101742203200520052003491b22034100480d172004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200636000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a200041c5006a2d00003a0000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d07200128020020032005101e2204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d04200128020020032005101e2204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d07200128020020032005101e2204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005101f22040d070b200541011020000b2005101f22040d070b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1a20044101742203200020002003491b22034100480d1a2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1820044101742203200520052003491b22034100480d182004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1620044101742203200020002003491b22034100480d162004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041086a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22002003490d1420044101742203200020002003491b22034100480d142004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2520034101742205200420042005491b22054100480d252003450d0f200128020020032005101e2204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d08200128020020032005101e2204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d09200128020020032005101e2204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a200128020020032005101e2204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0d200128020020032005101e2204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1320044101742203200020002003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1120044101742203200020002003491b22034100480d112004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0d20044101742203200020002003491b22034100480d0d2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d1620034101742200200420042000491b22004100480d162003450d03200128020020032000101e2204450d040c090b20042003470d01200341016a22042003490d1520034101742200200420042000491b22004100480d152003450d04200128020020032000101e2204450d050c060b200128020021040c080b200128020021040c050b2000101f22040d050b200041011020000b2000101f22040d010b200041011020000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341074b0d000240024002400240024002400240024020030e080005020301060704000b200528020020042802002203470d0c200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d19200128020020032007101e2206450d1a0c330b200528020020042802002203470d07200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d10200128020020032007101e2206450d110c300b200528020020042802002203470d07200341016a22062003490d3c20034101742207200620062007491b22074100480d3c2003450d11200128020020032007101e2206450d120c2d0b200528020020042802002203470d07200341016a22062003490d3b20034101742207200620062007491b22074100480d3b2003450d12200128020020032007101e2206450d130c2a0b200528020020042802002203470d07200341016a22062003490d3a20034101742207200620062007491b22074100480d3a2003450d13200128020020032007101e2206450d140c270b200528020020042802002203470d08200341016a22062003490d3920034101742207200620062007491b22074100480d392003450d16200128020020032007101e2206450d170c240b200528020020042802002203470d08200341016a22062003490d3820034101742207200620062007491b22074100480d382003450d17200128020020032007101e2206450d180c210b200528020020042802002203470d08200341016a22062003490d3720034101742207200620062007491b22074100480d372003450d18200128020020032007101e2206450d190c1e0b200528020020042802002203470d08200341016a22062003490d3620034101742207200620062007491b22074100480d362003450d19200128020020032007101e2206450d1a0c1b0b200128020021060c290b200128020021060c260b200128020021060c230b200128020021060c200b200128020021060c270b200128020021060c1c0b200128020021060c190b200128020021060c160b200128020021060c130b2007101f22060d1f0b200741011020000b2007101f22060d1b0b200741011020000b2007101f22060d170b200741011020000b2007101f22060d130b200741011020000b2007101f22060d190b200741011020000b2007101f22060d0d0b200741011020000b2007101f22060d090b200741011020000b2007101f22060d050b200741011020000b2007101f22060d010b200741011020000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1e20064101742203200920092003491b22034100480d1e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002108200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1e20004101742203200520052003491b22034100480d1e2000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120083700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1c20064101742203200720072003491b22034100480d1c2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1c20054101742203200620062003491b22034100480d1c2005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1a20064101742203200920092003491b22034100480d1a2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1a20034101742206200520052006491b22064100480d1a2003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41023a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1820064101742203200920092003491b22034100480d182006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d2420034101742205200020002005491b22054100480d242003450d07200128020020032005101e2200450d080c0f0b200528020020042802002203470d01200341016a22002003490d2320034101742205200020002005491b22054100480d232003450d04200128020020032005101e2200450d050c0c0b200528020020042802002203470d02200341016a22002003490d2220034101742205200020002005491b22054100480d222003450d07200128020020032005101e2200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005101f22000d070b200541011020000b2005101f22000d070b200541011020000b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0e0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1620054101742203200620062003491b22034100480d162005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1420004101742203200520052003491b22034100480d142000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1220004101742203200520052003491b22034100480d122000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1020004101742203200520052003491b22034100480d102000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d0e20064101742203200920092003491b22034100480d0e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002108200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0e20064101742203200720072003491b22034100480d0e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320083700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a200110622000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22092000490d0e20064101742200200920092000491b22004100480d0e2006450d01200128020020062000101e22060d020c060b200128020021060c020b2000101f2206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b200041011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d0b20034101742205200020002005491b22054100480d0b2003450d03200128020020032005101e2200450d040c090b20062003470d01200341016a22002003490d0a20034101742205200020002005491b22054100480d0a2003450d04200128020020032005101e2200450d050c060b200128020021000c080b200128020021000c050b2005101f22000d050b200541011020000b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d0720034101742205200020002005491b22054100480d072003450d01200128020020032005101e2200450d020c030b200128020021000c030b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a0000024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d0320004101742203200520052003491b22034100480d032000450d01200128020020002003101e2200450d020c040b200128020021000c040b2003101f22000d020b200341011020000b1021000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d01200128020020042003101e2204450d020c040b200128020021040c040b2003101f22040d020b200341011020000b1021000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b130020004106360204200041efbbc0003602000bce0101047f230041206b22002400024002400240419bb5c000411041f8b3c200410041001002417f460d002000410036021041012101419bb5c0004110200041106a41044100100241016a41044d0d0220002802102102419bb5c000411010090c010b410021010b200041106a41086a2203420037030020004200370310419db4c0004115200041106a1001200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041003200041206a24000f0b41df88c0004133103a000b13002000410b360204200041dcf5c2003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120101f2206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011020000bd31206037f017e057f017e037f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b00141fbb8c0004111200141b0016a100120014190016a41086a22032002290300370300200120012903b0013703900120014190016a4110100920024200370300200142003703b001419db4c0004115200141b0016a100120032002290300370300200120012903b0013703900120014190016a4110100920024200370300200142003703b00141b2b4c0004117200141b0016a100120032002290300370300200120012903b0013703900120014190016a411010092001418cb9c000410d108f01200129030821042001280200210520024200370300200142003703b00141eab8c0004111200141b0016a1001200141f0006a41086a2002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041f8b3c200410041001002417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010022202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a2903003703002002200329030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b410821064200210a200141b0016a41086a22024200370300200142003703b00141ddb8c000410d200141b0016a1001200141f0006a41086a2002290300370300200120012903b0013703700240200141f0006a411041f8b3c200410041001002417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a10d30120012802b0012206450d0420012902b401210a200141f0006a411010090b200141b0016a41086a22024200370300200142003703b0014199b9c0004115200141b0016a1001200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041f8b3c200410041001002417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010022202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a100d200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a41202004420020051b2204427f7c200141f0006a100e450d0620014190016a41186a2205200229030037030020014190016a41106a220c200329030037030020014190016a41086a220d20092903003703002001200129037037039001200220052903003703002003200c2903003703002009200d29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220ea72202200aa7470d00200241016a22032002490d05200ea74101742209200320032009491bad220f42287e220e422088a70d05200ea722034100480d052002450d012006200241286c2003101e2206450d020c070b200a210f0c070b2003101f22060d050b200341081020000b41df88c0004133103a000b41df88c0004133103a000b1021000b41df88c0004133103a000b200a422088220ea721020b2006200241286c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200241216a200128009001360000200241246a20014193016a280000360000200f42ffffffff0f83200e4220864280808080107c84210a0b2000200129031037001420002004370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000b9e0a06037f027e017f017e027f017e230041c0006b220724002004a72108024002400240024002400240024002400240024002400240024002400240024020014201520d004101210920084101470d01427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210a427f200120081b210b4100210c4201210d200450450d060c070b4101210c20084101470d012002200556200320065620032006511b450d02200320067d2002200554ad7d210a200220057d210b4200210d4100210c41012109200150450d030c040b200741086a20042005200642012002200310de01200741186a290300210a2007290310210b2007290308210d0c0a0b427f200320067c200220057c220b2002542208ad7c220a2008200a200354200a2003511b22081b210a427f200b20081b210b4200210d41002109200150450d010c020b200620037d2005200254ad7d210a200520027d210b4201210d4100210c410121092001500d010b200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220e20082903003703002007200729033037032002400240200741206a411041f8b3c200410041001002417f460d002007420037033820074200370330200741206a4110200741306a411041001002220f417f460d0a200f410f4d0d0a200741386a2903002101200729033021100c010b42002110420021010b200842003703002007420037033041aeb9c0004116200741306a1001200e20082903003703002007200729033037032020074200200120037d2010200254ad7d2203201020027d2202201056200320015620032001511b22081b37033820074200200220081b370330200741206a4110200741306a411010030b2004500d010b200c450d05200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220c200829030037030020072007290330370320200741206a411041f8b3c200410041001002417f460d012007420037033820074200370330200741206a4110200741306a4110410010022209417f460d072009410f4d0d07200741386a2903002103200729033021020c020b2009450d04200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220c200829030037030020072007290330370320200741206a411041f8b3c200410041001002417f460d022007420037033820074200370330200741206a4110200741306a4110410010022209417f460d072009410f4d0d07200741386a2903002103200729033021020c030b42002102420021030b200842003703002007420037033041aeb9c0004116200741306a1001200c20082903003703002007200729033037032020074200200320067d2002200554ad7d2204200220057d2205200256200420035620042003511b22081b37033820074200200520081b370330200741206a4110200741306a411010030c020b42002102420021030b200842003703002007420037033041aeb9c0004116200741306a1001200c2008290300370300200720072903303703202007427f200320067c200220057c22052002542208ad7c22022008200220035420022003511b22081b3703382007427f200520081b370330200741206a4110200741306a411010030b2000200b3703082000200d370300200041106a200a370300200741c0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bd20503027f037e017f230041206b220424004101210502402001a74101470d00200041086a2205427f2005290300220620037c2000290300220720027c22082007542205ad7c22072005200720065420072006511b22051b3703002000427f200820051b370300410021050b0240024002400240024002400240024020014201510d004200210620014200510d03200441106a41086a220042003703002004420037031041aeb9c0004116200441106a1001200441086a22052000290300370300200420042903103703002004411041f8b3c200410041001002417f460d01200442003703182004420037031020044110200441106a4110410010022209417f460d062009410f4d0d06200441186a2903002101200429031021060c020b2005450d02200441106a41086a220042003703002004420037031041aeb9c0004116200441106a1001200441086a22052000290300370300200420042903103703002004411041f8b3c200410041001002417f460d03200442003703182004420037031020044110200441106a4110410010022209417f460d062009410f4d0d06200441186a2903002101200429031021060c040b420021010b200042003703002004420037031041aeb9c0004116200441106a100120052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030b200441206a24000f0b42002106420021010b200042003703002004420037031041aeb9c0004116200441106a100120052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a41101003200441206a24000f0b41df88c0004133103a000b41df88c0004133103a000b130020004102360204200041d0ffc2003602000bc20806027f017e017f047e017f037e230041d0006b22022400024002400240024002404110101f2203450d00200341086a41002900d3c740370000200341002900cbc740370000200341104130101e2203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241c0006a41086a220542003703002002420037034020034130200241c0006a1001200241306a41086a200529030037030020022002290340370330024002400240024002400240200241306a411041f8b3c200410041001002417f460d002002420037034820024200370340200241306a4110200241c0006a4110410010022205417f460d052005410f4d0d05200241c8006a2903002106200229034021072002420037034820024200370340200241306a4110200241c0006a4110411010022205417f460d052005410f4d0d05200241c0006a41086a2903002108200229034021092003101d4114101f2203450d09200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241c0006a41086a220142003703002002420037034020034134200241c0006a1001200241306a41086a2205200129030037030020022002290340370330200241306a411041f8b3c200410041001002417f460d012002420037034820024200370340200241306a4110200241c0006a411041001002220a417f460d08200a410f4d0d08200241c8006a290300210b2002290340210c0c020b2003101d4200210b0c020b4200210c4200210b0b2003101d2001420037030020024200370340418cb9c000410d200241c0006a100120052001290300370300200220022903403703300240200241306a411041f8b3c200410041001002417f460d0020024200370340200241306a4110200241c0006a41084100100241016a41084d0d02200229034021040b4200210d2002420042002009420010d203200241106a200842002004420010d203200241206a200442002009420010d2034200210402404200420052200842005271200229030842005272200229031842005272200241286a2903002209200229030020022903107c7c2208200954720d00200620082002290320220d200754200820065420082006511b22011b20087d2007200d20011b2208200d54ad7d21042008200d7d210d0b2004200b200c200d56200b200456200b2004511b22011b210b200d200c20011b21040b200020043703002000200b370308200241d0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b411041011020000b413041011020000b41df88c0004133103a000b411441011020000b413441011020000bbf1b05017f017e017f017e067f230041d0016b220324004200210420034190016a41086a22054200370300200342003703900141c4b9c000411b20034190016a1001200341a0016a41086a200529030037030020032003290390013703a0010240024002400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022205417f460d022005410f4d0d02200341286a290300210620032903202104411421074114101f2205450d010c030b42002106411421074114101f22050d020b200741011020000b41df88c0004133103a000b200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba4037000002400240024002400240024002400240024002400240024002400240200520074134101e2205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413420034190016a1001200341a0016a41086a200729030037030020032003290390013703a0012003200137032020032002370328200341a0016a4110200341206a411010032005101d2004200158200620025820062002511b0d0c4114101f2205450d02200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410e301200341086a41106a290300210120032903102102200328020821082005101d410e101f2205450d04200541066a41002900f7ba40370000200541002900f1ba403700002005410e412e101e2205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d02402002200184500d002008450d0020034190016a41086a22054200370300200342003703900141aeb9c000411620034190016a1001200341a0016a41086a2207200529030037030020032003290390013703a00102400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022208417f460d0b2008410f4d0d0b200341286a2903002106200329032021040c010b42002104420021060b20054200370300200342003703900141aeb9c000411620034190016a10012007200529030037030020032003290390013703a00120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b370320200341a0016a4110200341206a411010030b410e101f2205450d06200541066a41002900b3c541370000200541002900adc5413700002005410e412e101e2205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c00102400240200341c0016a411041f8b3c200410041001002417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341c0016a4110200341206a4120410010022207417f460d032007411f4d0d03200341a0016a41186a2207200341206a41186a2208290300370300200341a0016a41106a2209200341206a41106a220a290300370300200341a0016a41086a220b200341206a41086a220c290300370300200320032903203703a001200341c0016a411010092005101d20082007290300370300200a2009290300370300200c200b290300370300200320032903a001370320410e101f2205450d0b200541066a41002900e5c541370000200541002900dfc5413700002005410e412e101e2205450d0c2005200329032037000e200541266a200341386a2903003700002005411e6a200341206a41106a290300370000200541166a200341206a41086a29030037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d410d2107410d101f2205450d010c0d0b2005101d410d2107410d101f22050d0c0b200741011020000b413441011020000b41df88c0004133103a000b411441011020000b413441011020000b410e41011020000b412e41011020000b410e41011020000b412e41011020000b41df88c0004133103a000b410e41011020000b412e41011020000b200541056a41002900e1ee41370000200541002900dcee41370000024002400240024002400240024002400240024020052007412d101e2205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412d20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d4112101f2205450d01200541106a41002f0087d7413b0000200541086a41002900ffd641370000200541002900f7d641370000200541124132101e2205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413220034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d200010e401200010e5014113101f2205450d032005410f6a41002800d5f341360000200541086a41002900cef341370000200541002900c6f341370000200541134133101e2205450d04200520002900003700132005412b6a200041186a290000370000200541236a200041106a2900003700002005411b6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413320034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d200341206a20001033024020032802282205450d00200328022c21072005200341206a41106a280200100f2007450d002005101d0b4112101f2205450d05200541106a41002f00cca8413b0000200541086a41002900c4a841370000200541002900bca841370000200541124132101e2205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413220034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d4118101f2205450d07200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413820034190016a1001200341a0016a41086a200729030037030020032003290390013703a00102400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022207417f460d012007410f4d0d01200341286a290300210220032903202101410021072005101d2001200284504101710d0d0c0b0b410121072005101d4100410171450d0a0c0c0b41df88c0004133103a000b412d41011020000b411241011020000b413241011020000b411341011020000b413341011020000b411241011020000b413241011020000b411841011020000b413841011020000b20070d010b200341d0016a24000f0b024002404113101f2205450d002005410f6a41002800c1ba40360000200541086a41002900baba40370000200541002900b2ba40370000200541134133101e2205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a220929000037000020034190016a41086a220a420037030020034200370390012005413320034190016a1001200341c0016a41086a200a29030037030020032003290390013703c001200341c0016a411010092005101d200341206a41086a41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a0020200341206a108b01200341d0016a24000f0b411341011020000b413341011020000bde0104017f017e017f027e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1001200341086a2005290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022201417f460d022001410f4d0d02200341186a290300210620032903102107200341101009420121040c010b0b2000200437030020002007370308200041106a2006370300200341206a24000f0b41df88c0004133103a000bec1201077f230041b0036b2201240002400240024002400240024002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e8016a41086a22004200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2000290300370300200120012903e8013703b00202400240200141b0026a411041f8b3c200410041001002417f460d002001421037026c2001200141b0026a360268200141d0026a200141e8006a10eb0220012d00e80222034102460d0420014188016a41186a20014181036a29000037030020014188016a41106a200141f9026a29000037030020014188016a41086a200141f1026a290000370300200141e8016a41086a20014192036a290100370300200141e8016a41106a2001419a036a290100370300200141e8016a41186a200141a2036a290100370300200120012900e9023703880120012001418a036a2901003703e80120014189036a2d00002104200141b0026a411010090c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002101d20034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d004112101f2202450d06200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d004112101f2200450d09200041106a41002f00ddc5413b0000200041086a41002900d5c541370000200041002900cdc541370000200041124132101e2200450d0a200020012903683700122000412a6a20014180016a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e8016a41086a22054200370300200142003703e80120004132200141e8016a1001200141b0026a41086a2005290300370300200120012903e8013703b002200141b0026a411041f8b3c200410041001002417f460d0b200142103702c4022001200141b0026a3602c002200141d0026a200141c0026a10eb0220012d00e80222054102460d0c20014188016a41106a200141d0026a41106a29030037030020014188016a41086a200141d0026a41086a290300370300200120012903d00237038801200141e8016a200141d0026a41196a41c70010ce031a200120053a00a00120014188016a41196a200141e8016a41c70010ce031a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141e0006a290300370100200141e8016a41086a22044200370300200142003703e80120004132200141e8016a1001200141b0026a41086a2004290300370300200120012903e8013703b002200141103602d4022001200141b0026a3602d00220014188016a200141d0026a10f9022000101d4101210420020d010c0e0b0240200441ff01714101470d00200141e8016a41086a22004200370300200142003703e80141c8d8c100411a200141e8016a1001200141b0026a41086a2000290300370300200120012903e8013703b0024120101f2200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a41102000412010032000101d410021004100210420020d010c0e0b200141e8016a41086a22004200370300200142003703e80141c8d8c100411a200141e8016a1001200141d0026a41086a2000290300370300200120012903e8013703d002200141d0026a4110100941002100410021042002450d0d0b200141e8016a41086a22054200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2005290300370300200120012903e8013703b002200141b0026a411041f8b3c200410041001002417f460d03200142103702c4022001200141b0026a3602c002200141d0026a200141c0026a10eb0220012d00e8024102460d0420014188016a41106a200141d0026a41106a29030037030020014188016a41086a200141d0026a41086a290300370300200120012903d00237038801200141e8016a200141d0026a41196a41c70010ce031a20014188016a41196a200141e8016a41c70010ce032001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a20014180016a290300370000200120033a00a001200141e8016a41086a22034200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2003290300370300200120012903e8013703b002200141103602d4022001200141b0026a3602d00220014188016a200141d0026a10f9022002101d410121032004200045720d0e0c0d0b411241011020000b413241011020000b41df88c0004133103a000b41f5d7c10041d300103a000b41df88c0004133103a000b411241011020000b413241011020000b411241011020000b413241011020000b41f5d7c10041d300103a000b41df88c0004133103a000b412041011020000b410021032004200045720d010b2000101d0b2002452003720d002002101d0b200141b0036a24000bd416010e7f230041c0026b220124000240024002400240024002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a29000037000020014190026a41086a2200420037030020014200370390022002413220014190026a100120014180026a41086a20002903003703002001200129039002370380020240024020014180026a411041f8b3c200410041001002417f460d002001421037029402200120014180026a36029002200141c0006a20014190026a105e20012802402203450d0520012802442104200141b0016a20014190026a105f20012d00b00122054102460d04200141e0006a41186a200141c9016a290000370300200141e0006a41106a200141c1016a290000370300200141e0006a41086a200141b9016a290000370300200141a0026a41086a200141da016a290100370300200141a0026a41106a200141e2016a290100370300200141a0026a41186a200141ea016a290100370300200120012900b1013703602001200141d2016a2901003703a002200141d1016a2d0000210020014180026a411010090c010b410221050b200141206a41186a200141e0006a41186a290300370300200141206a41106a2206200141e0006a41106a290300370300200141206a41086a2207200141e0006a41086a290300370300200141086a2208200141a0026a41086a2209290300370300200141106a220a200141a0026a41106a220b290300370300200141186a200141a0026a41186a29030037030020012001290360370320200120012903a0023703002002101d20054102460d0e200141a0026a41186a200141206a41186a290300370300200b200629030037030020092007290300370300200141c0006a41086a2008290300370300200141c0006a41106a200a290300370300200141c0006a41186a200141186a290300370300200120012903203703a002200120012903003703404100210c0240200041ff01714101470d004112101f2202450d06200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e220c450d07200c2001290340370012200c412a6a200141d8006a290300370000200c41226a200141c0006a41106a290300370000200c411a6a200141c0006a41086a2903003700000b0240024002400240024020054101470d004112101f2202450d0c200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e220d450d0d200d20012903a002370012200d412a6a200141a0026a41186a290300370000200d41226a200141a0026a41106a290300370000200d411a6a200141a0026a41086a29030037000020014190026a41086a220242003703002001420037039002200d413220014190026a100120014180026a41086a2002290300370300200120012903900237038002200141b0016a20014180026a105d20012d00bc014102460d0e200141e0006a200141b0016a41d00010ce031a2001418d016a20003a00002001418e016a200129034037010020014196016a200141c0006a41086a2903003701002001419e016a200141c0006a41106a290300370100200141a6016a200141c0006a41186a29030037010020014190026a41086a220242003703002001420037039002200d413220014190026a100120014180026a41086a2002290300370300200120012903900237038002200141003602b801200142013703b0012001280260210e2001200128026822023602900220014190026a200141b0016a106202402002450d00200241057421094100200141b0016a41086a28020022006b210720012802b001210a20012802b4012108200e210203400240200820076a411f4b0d00200041206a22062000490d052008410174220b20062006200b491b22064100480d05024002402008450d00200a20082006101e220a0d010c090b2006101f220a450d080b200621080b200a20006a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a290000370000200741606a2107200041206a2100200241206a2102200941606a22090d000b200141b8016a2000360200200120083602b4012001200a3602b0010b200141ec006a200141b0016a10ca0120012802b401210220014180026a411020012802b0012200200141b0016a41086a280200100302402002450d002000101d0b02402001280264450d00200e101d0b200d101d4101210e200c0d010c100b0240200041ff01714101470d0020014190026a41086a22024200370300200142003703900241adeec100411a20014190026a100120014180026a41086a20022903003703002001200129039002370380024120101f2202450d0f20022001290340370000200241186a200141c0006a41186a290300370000200241106a200141c0006a41106a290300370000200241086a200141c0006a41086a29030037000020014180026a41102002412010032002101d4100210d4100210e200c0d010c100b20014190026a41086a22024200370300200142003703900241adeec100411a20014190026a1001200141b0016a41086a200229030037030020012001290390023703b001200141b0016a411010094100210d4100210e200c450d0f0b20014190026a41086a220242003703002001420037039002200c413220014190026a100120014180026a41086a22002002290300370300200120012903900237038002200141b0016a20014180026a105d20012d00bc014102460d07200141e0006a200141b0016a41d00010ce031a200141ed006a20012903a002370000200141f5006a200141a0026a41086a290300370000200141fd006a200141a0026a41106a29030037000020014185016a200141a0026a41186a290300370000200120053a006c200242003703002001420037039002200c413220014190026a100120002002290300370300200120012903900237038002200141003602b801200142013703b001200128026021052001200128026822023602900220014190026a200141b0016a106202402002450d00200241057421094100200141b0016a41086a28020022006b210720012802b001210a20012802b40121082005210203400240200820076a411f4b0d00200041206a22062000490d032008410174220b20062006200b491b22064100480d03024002402008450d00200a20082006101e220a0d010c060b2006101f220a450d050b200621080b200a20006a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a290000370000200741606a2107200041206a2100200241206a2102200941606a22090d000b200141b8016a2000360200200120083602b4012001200a3602b0010b200141ec006a200141b0016a10ca0120012802b401210220014180026a411020012802b0012200200141b8016a280200100302402002450d002000101d0b02402001280264450d002005101d0b200c101d41012102200e200d45720d100c0f0b1021000b200641011020000b200641011020000b411241011020000b413241011020000b2004450d002003101d0b41df88c0004133103a000b41f5d7c10041d300103a000b411241011020000b413241011020000b411241011020000b413241011020000b41f5d7c10041d300103a000b412041011020000b41002102200e200d45720d010b200d101d0b02400240200c45200272450d002004450d020c010b200c101d2004450d010b2003101d0b200141c0026a24000b130020004108360204200041dbc7c0003602000b8f0d05017f017e017f017e057f230041b0016b2203240042002104200341a0016a41086a22054200370300200342003703a00141c4b9c000411b200341a0016a100120034190016a41086a2005290300370300200320032903a00137039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022205417f460d022005410f4d0d02200341286a290300210620032903202104411821074118101f2205450d010c030b42002106411821074118101f22050d020b200741011020000b41df88c0004133103a000b200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba403700000240024002400240024002400240024002400240200520074138101e2205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341a0016a41086a22074200370300200342003703a00120054138200341a0016a100120034190016a41086a2007290300370300200320032903a00137039001200320013703202003200237032820034190016a4110200341206a411010032005101d2004200158200620025820062002511b0d084118101f2205450d02200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810e301200341086a41106a290300210120032802082107200329031021022005101d02402002200184500d002007450d00200341a0016a41086a22054200370300200342003703a00141aeb9c0004116200341a0016a100120034190016a41086a22072005290300370300200320032903a001370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022208417f460d092008410f4d0d09200341286a2903002106200329032021040c010b42002104420021060b20054200370300200342003703a00141aeb9c0004116200341a0016a100120072005290300370300200320032903a0013703900120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b37032020034190016a4110200341206a411010030b4114101f2205450d04200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341a0016a41086a22074200370300200342003703a00120054134200341a0016a100120034190016a41086a2007290300370300200320032903a00137039001024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022207417f460d022007410f4d0d02200341286a290300210220032903202101410021072005101d2001200284504101710d0a0c080b410121072005101d4100410171450d070c090b413841011020000b41df88c0004133103a000b411841011020000b413841011020000b411441011020000b413441011020000b41df88c0004133103a000b20070d010b200341b0016a24000f0b024002404113101f2205450d002005410f6a41002800c1ba40360000200541086a41002900baba40370000200541002900b2ba40370000200541134133101e2205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a2209290000370000200341a0016a41086a220a4200370300200342003703a00120054133200341a0016a1001200341206a41086a220b200a290300370300200320032903a001370320200341206a411010092005101d200b41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a0020200341206a108b01200341b0016a24000f0b411341011020000b413341011020000b13002000410a360204200041a082c3003602000b3901017f02404110101f2202450d002002420037000820024200370000200042908080808002370204200020023602000f0b411041011020000b880807047f017e097f047e017f017e017f230041c0006b220224000240024002400240024002400240024002400240410e101f2203450d00200341066a41002900f7ba40370000200341002900f1ba403700002003410e412e101e2204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241306a41086a22014200370300200242003703302004412e200241306a1001200241086a41086a2001290300370300200220022903303703080240024002400240200241086a411041f8b3c200410041001002417f460d002002421037021c2002200241086a3602182002200241186a10d5012002280200450d0b20022802042205ad42287e2206422088a70d032006a72201417f4c0d032001450d012001101f2207450d062005450d020c070b20004100360208200042083702000c080b4108210720050d050b4100210e420021062007450d080c050b102e000b410e41011020000b412e41011020000b200141081020000b200241186a41086a22032802002108200228021c21092002280218210a200241336a210b420021064100210c4100210d410021012005210e03402002420037033020034100200a2009200241306a410820081002220f200f417f461b220f4108200f4108491b20086a2208360200200f41074d0d0320022903302110200242003703382002420037033020034100200a2009200241306a411020081002220f200f417f461b220f4110200f4110491b20086a2208360200200f410f4d0d03200241306a41086a2903002111200229033021122002420037033020034100200a2009200241306a410820081002220f200f417f461b220f4108200f4108491b20086a2208360200200f41074d0d0320022903302113200241003a003020032008200a2009200241306a41012008100241016a41014b220f6a2208360200200f450d03200141016a210f20022d003021142002200b28000036002b200220022800303602282002200228002b3600332002200228022836023002402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002007200d2016101e22070d010c080b2016101f2207450d070b2007200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a2002280033360000200141216a200228023036000020064280808080107c2106200c41026a210c200d41286a210d200f2101200f2005490d000b2007450d030b20002006200ead84370204200020073602000b2004101d200241c0006a24000f0b200e450d002007101d0b41df88c0004133103a000b1021000b201641081020000bdc0202027f027e230041206b22022400024002404114101f2203450d00200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241106a41086a220142003703002002420037031020034134200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022201417f460d022001410f4d0d02200241186a2903002105200229031021040c010b420021050b2003101d2000200537030820002004370300200241206a24000f0b41df88c0004133103a000b411441011020000b413441011020000bd10903037f037e017f23004190016b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000020044180016a41086a2206420037030020044200370380012005413420044180016a1001200441f0006a41086a200629030037030020042004290380013703700240024002400240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022206417f460d022006410f4d0d02200441086a2903002107200429030021080c010b42002108420021070b2005101d20044180016a41086a22054200370300200442003703800141c4b9c000411b20044180016a1001200441f0006a41086a200529030037030020042004290380013703700240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022205417f460d022005410f4d0d0220082007844200520d002004290300200258200441086a290300220920035820092003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b20044180016a41086a22054200370300200442003703800141c4b9c000411b20044180016a1001200441f0006a41086a2005290300370300200420042903800137037002400240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022205417f460d062005410f4d0d062004290300200256200441086a290300220920035620092003511b450d0020012002200310e201410121010c010b4114101f2205450d06200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d07200520012900003700142005412c6a200141186a220a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000020044180016a41086a2206420037030020044200370380012005413420044180016a1001200441086a200629030037030020042004290380013703002004411041f8b3c20041004100100221062005101d02402006417f470d00200110ed01200441386a2003370300200441306a2002370300200441086a41003a0000200441096a2001290000370000200441116a200141086a290000370000200441196a200141106a290000370000200441216a200a290000370000200441023a00002004108b010b20012002200310e201410021010b2000200220087d200820027d20082002582007200358200720035122051b22061b370308200020013a001820002008200256200720035620051bad370300200041106a200320077d2002200854ad7d200720037d2008200254ad7d20061b37030020044190016a24000f0b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411441011020000b413441011020000b9d0803037f017e077f23004190016b22012400200141106a41086a220242003703002001420037031041c8c2c1004113200141106a100120014180016a41086a20022903003703002001200129031037038001410021020240024002400240024020014180016a411041f8b3c200410041001002417f460d002001410036021020014180016a4110200141106a41044100100241016a41044d0d01200128021021020b4120101f2203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d000121052003101d20014180016a20054108742004a7220341c0017172410676220510b00102400240024002402003413f7122032001280288014f0d00200120012802800120034105746a2203109a012001290300200141086a290300844200510d010b0240200128028401450d00200128028001101d0b200141106a200210b001024020012802182203413f4d0d00200141186a21050340200241016a210202402001280214450d002001280210101d0b200141106a200210b0012005280200220341c0004f0d000b0b2001280210210620012802142107200141106a41186a2208200041186a290000370300200141106a41106a2209200041106a290000370300200141106a41086a220a200041086a29000037030020012000290000370310200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b101e2206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141106a41086a20014180016a41086a28020036020020012001290380013703102005200141106a10e70220014190016a24000f0b200b101f22060d040b200b41011020000b41df88c0004133103a000b412041011020000b1021000b200241067420036a210b200620034105746a22032001290310370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141106a41086a220342003703002001420037031041c8c2c1004113200141106a100120014180016a41086a200329030037030020012001290310370380012001200241016a36021020014180016a4110200141106a410410030b2001200536021820012007360214200120063602102002200141106a10e702200141106a41086a2000290000370300200141106a41106a200041086a290000370300200141106a41186a200041106a290000370300200141306a200041186a2900003703002001200b360214200141013a0010200141106a108b0120014190016a24000bcc0304027f017e017f027e230041306b2204240020042001109a0102400240024002400240024002402004290300200441086a290300844200510d004114101f2205450d05200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41086a220742003703002004420037032020054134200441206a1001200441106a41086a200729030037030020042004290320370310200441106a411041f8b3c200410041001002417f460d012004420037032820044200370320200441106a4110200441206a4110410010022207417f460d042007410f4d0d04200441286a2903002108200429032021060c020b20004184b8c000360204200041086a4122360200410121010c020b420021080b2005101d2001200620027c2209200820037c2009200654ad7c10e201200041106a2003370300200041086a2002370300410021010b20002001360200200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000be10604027f017e017f057e230041206b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441106a41086a220742003703002004420037031020054134200441106a1001200441086a2007290300370300200420042903103703000240024002402004411041f8b3c200410041001002417f460d00200442003703182004420037031020044110200441106a4110410010022207417f460d022007410f4d0d02200441186a2903002108200429031021090c010b42002109420021080b2005101d20012009200220092009200256200820035620082003511b22051b220a7d20082003200820051b220b7d2009200a54ad7d10e20102400240024002402002200a7d22092003200b7d2002200a54ad7d220c84500d004118101f2205450d08200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441106a41086a220742003703002004420037031020054138200441106a1001200441086a2007290300370300200420042903103703002004411041f8b3c200410041001002417f460d01200442003703182004420037031020044110200441106a4110410010022207417f460d072007410f4d0d07200441186a2903002103200429031021020c020b4200210c0c020b420021030b2005101d200120022009200220022009562003200c562003200c511b22051b22087d2003200c200320051b22067d2002200854ad7d10e701200c20067d2009200854ad7d210c2006200b7c2008200a7c2202200854ad7c2103200920087d21060b2000200637031020002002370300200041186a200c37030020002003370308200441206a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411841011020000b413841011020000bca0504027f017e017f027e230041306b2205240002400240024002404114101f2206450d00200641106a41002800d5ba40360000200641086a41002900cdba40370000200641002900c5ba40370000200641144134101e2206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541206a41086a220842003703002005420037032020064134200541206a1001200541106a41086a200829030037030020052005290320370310024002400240200541106a411041f8b3c200410041001002417f460d002005420037032820054200370320200541106a4110200541206a4110410010022208417f460d022008410f4d0d02200541286a2903002109200529032021070c010b420021090b2006101d024002400240200720027d220a200756200920037d2007200254ad7d220720095620072009511b450d00200041a6b8c000360204200041086a411d3602000c010b200541206a41086a220642003703002005420037032041c4b9c000411b200541206a1001200541106a41086a2006290300370300200520052903203703100240200541106a411041f8b3c200410041001002417f460d002005420037032820054200370320200541106a4110200541206a4110410010022206417f460d062006410f4d0d06200a20052903205a2007200541206a41086a29030022095a20072009511b0d00200041c3b8c000360204200041086a411a3602000c010b200541086a20012004200a2007103d20052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200a200710e201200041106a2003370300200041086a2002370300410021060c040b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b20002006360200200541306a24000be00702097f027e230041306b2202240002400240410e101f2203450d00200341066a41002900f7ba40370000200341002900f1ba403700002003410e412e101e2204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241186a41086a22054200370300200242003703182004412e200241186a1001200241086a41086a20052903003703002002200229031837030820024100360220200242013703182001280200210620022001280208220036022c2002412c6a200241186a106202400240024002400240024002402000450d00200041286c210720052802002108200228021c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802182000200a101e22030d020c080b200841086a2109200228021821030c020b200a101f2203450d060b2002200a36021c20022003360218200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a101e22030d020c090b200941106a21080c020b200a101f2203450d070b2002200a36021c20022003360218200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009101e22030d010c090b2009101f2203450d080b2002200936021c200220033602180b2005200841086a360200200320086a200b3700000240024002400240200228021c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228021820032000101e22090d020c0b0b200228021821090c020b2000101f2209450d090b2002200036021c200220093602180b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228021c2100200228021821090b200241086a411020092008100302402000450d002009101d0b2004101d0240200141046a280200450d002001280200101d0b200241306a24000f0b1021000b200a41011020000b200a41011020000b200941011020000b200041011020000b410e41011020000b412e41011020000b940304027f017e017f017e230041206b22042400024002404118101f2205450d00200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441106a41086a220742003703002004420037031020054138200441106a1001200441086a2007290300370300200420042903103703000240024002402004411041f8b3c200410041001002417f460d00200442003703182004420037031020044110200441106a4110410010022207417f460d022007410f4d0d02200441186a2903002108200429031021060c010b420021080b2005101d20012006200220062006200256200820035620082003511b22051b22027d20082003200820051b22037d2006200254ad7d10e7012000200337030820002002370300200441206a24000f0b41df88c0004133103a000b411841011020000b413841011020000bb70202047f027e230041206b22022400200241106a41086a220342003703002002420037031041aeb9c0004116200241106a1001200241086a22042003290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b200342003703002002420037031041aeb9c0004116200241106a1001200420032903003703002002200229031037030020024200200620017d2007200054ad7d2201200720007d2200200756200120065620012006511b22031b37031820024200200020031b37031020024110200241106a41101003200241206a24000f0b41df88c0004133103a000bba2504057f027e037f0a7e230041c0026b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022044101460d0020044102470d0f200341106a41026a200141076a2d00003a0000200341306a41086a2205200141186a290200370300200341306a410d6a22062001411d6a290000370000200320012f00053b01102003200141106a2902003703304128210720022d000020022d000172450d0141c9b4c00021040c190b200141306a2903002108200141286a29030021092003412c6a41026a200141076a2d00003a0000200341106a41086a200141186a290200370300200341106a410d6a2001411d6a290000370000200320012f00053b012c2003200141106a290200370310200141086a28020021052001410c6a280200210620012d0004210a200341a0026a41026a2201200241046a2d00003a000020034190016a41086a220b200241156a29000037030020034190016a410d6a220c2002411a6a2900003700002003200241026a2f01003b01a00220032002410d6a2900003703900120022d0000450d01410121010c020b200141c0006a2903002108200141386a2903002109200141306a290300210d200141286a290300210e2001410c6a2802002107200141086a280200210420012d00042101200341bc026a41026a2202200341106a41026a2d00003a0000200341a0026a41086a2005290300370300200341a0026a410d6a2006290000370000200320032f01103b01bc02200320032903303703a002200141ff01714101470d03200341d0006a200441067610b0012003280250210220032802582004413f7122014d0d0a2003419c026a41026a200220014105746a220141026a2d00003a000020034188026a200141136a2900003703002003418d026a200141186a290000370000200320012f00003b019c022003200129000b370380022001280007210720012800032104410121012003280254450d130c120b200241096a2800002107200241056a280000210420022d0001210220034180026a41026a20012d00003a0000200341f0006a41086a200b290300370300200341f0006a410d6a200c290000370000200320032f01a0023b018002200320032903900137037041012101200241ff01714101470d00200341a0026a41026a20034180026a41026a2d00003a000020034190016a41086a200341f0006a41086a29030037030020034190016a410d6a200341f0006a410d6a290000370000200320032f0180023b01a0022003200329037037039001410021010c010b412a210741f1b4c00021040b200341bc026a41026a2202200341a0026a41026a2d00003a0000200341d0006a41086a220b20034190016a41086a290300370300200341d0006a41106a20034190016a41106a290300370300200320032f01a0023b01bc02200320032903900137035020010d14200341c3006a200b290300370000200341c8006a200341d0006a410d6a290000370000200320032f01bc023b013020032007360037200320043600332003200329035037003b200320022d00003a003220022003412c6a41026a2d00003a0000200341a0026a41086a200341106a41086a290300370300200341a0026a410d6a2201200341106a410d6a290000370000200320032f012c3b01bc02200320032903103703a0020240200a41ff01714101470d0020034190016a200541067610b00120032802900121022003280298012005413f7122014d0d022003419c026a41026a200220014105746a220141026a2d00003a000020034188026a200141136a2900003703002003418d026a200141186a290000370000200320012f00003b019c022003200129000b370380022001280007210620012800032105410121012003280294010d030c040b2003419c026a41026a200341bc026a41026a2d00003a000020034180026a41086a200341a0026a41086a29030037030020034180026a410d6a2001290000370000200320032f01bc023b019c02200320032903a002370380020c040b2003419c026a41026a20022d00003a000020034180026a41086a200341a0026a41086a29030037030020034180026a410d6a200341a0026a410d6a290000370000200320032f01bc023b019c02200320032903a002370380020c100b41002101200328029401450d010b2002101d0b2001450d010b200341a0026a41026a2003419c026a41026a2d00003a000020034190016a41086a20034180026a41086a29030037030020034190016a410d6a20034180026a410d6a290000370000200320032f019c023b01a002200320032903800237039001410021010c010b4101210141d7c0c1002105411521060b2003418c016a41026a2202200341a0026a41026a2d00003a0000200341f0006a41086a220420034190016a41086a290300370300200341f0006a41106a20034190016a41106a290300370300200320032f01a0023b018c01200320032903900137037002402001450d0020062107200521040c0e0b200341e3006a2004290300370000200341e8006a200341fd006a290000370000200320032f018c013b015020032006360057200320053600532003200329037037005b200320022d00003a00524114101f2201450d05200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba40370000200141144134101e2201450d06200120032903303700142001412c6a200341c8006a290300370000200141246a200341306a41106a2903003700002001411c6a200341306a41086a2903003700004200210d200341f0006a41086a220242003703002003420037037020014134200341f0006a1001200341a0026a41086a2002290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0120034200370398012003420037039001200341a0026a411020034190016a4110410010022202417f460d042002410f4d0d0420034198016a290300210e200329039001210d2001101d411421024114101f2201450d020c070b4100210120032802540d070c080b4200210e2001101d411421024114101f22010d050b200241011020000b200341a4016a410136020020034118360254200341c0adc4003602502003420137029401200341c8adc400360290012003200341d0006a3602a00120034190016a41a08cc30010cf01000b41df88c0004133103a000b411441011020000b413441011020000b200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba4037000002400240024002400240200120024134101e2201450d00200120032903503700142001412c6a200341e8006a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341f0006a41086a220242003703002003420037037020014134200341f0006a1001200341a0026a41086a2002290300370300200320032903703703a002024002400240200341a0026a411041f8b3c200410041001002417f460d0020034200370398012003420037039001200341a0026a411020034190016a4110410010022202417f460d022002410f4d0d0220034198016a290300210f20032903900121100c010b420021104200210f0b2001101d200341f0006a41086a220142003703002003420037037002400240024002402010200f8422114200510d0041add5c0004114200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0220034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d062001410f4d0d0620034198016a29030021120c010b4199d5c0004114200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0120034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d062001410f4d0d0620034198016a29030021120b20032903900121130c010b42002113420021120b0240200920137c22142009542201200820127c2001ad7c221520085420152008511b450d004128210741aad6c00021040c0c0b0240200d20147d2216200d56200e20157d200d201454ad7d220d200e56200d200e511b450d00411d2107418dd6c00021040c0c0b20114200520d05200341f0006a41086a220142003703002003420037037041c4b9c000411b200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0520034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d042001410f4d0d0420032903900120095620034198016a290300220e200856200e2008511b450d05411f210741eed5c00021040c0b0b41df88c0004133103a000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200341086a200341306a41022016200d103d024020032802082204450d00200328020c21070c060b0240201020097c22152010542201200f20087c2001ad7c220e200f54200e200f511b450d00412d210741c1d5c00021040c060b200341306a200341d0006a412010d003450d04200341306a2016200d10e201024002404114101f2201450d00200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba40370000200141144134101e2201450d01200120032903503700142001412c6a200341e8006a2204290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a2903003700004200210d200341f0006a41086a220242003703002003420037037020014134200341f0006a100120034190016a41086a2002290300370300200320032903703703900120034190016a411041f8b3c20041004100100221022001101d02402002417f470d00200341d0006a10ed01200341c8016a200e370300200341c0016a201537030020034190016a41086a41003a000020034199016a2003290350370000200341a1016a200341d0006a41086a290300370000200341a9016a200341e0006a290300370000200341b1016a2004290300370000200341023a00900120034190016a108b010b200341d0006a2015200e10e201200341f0006a41086a220142003703002003420037037041aeb9c0004116200341f0006a1001200341a0026a41086a22022001290300370300200320032903703703a002024002400240200341a0026a411041f8b3c200410041001002417f460d0020034200370398012003420037039001200341a0026a411020034190016a4110410010022204417f460d022004410f4d0d0220034198016a290300210e200329039001210d0c010b4200210e0b200142003703002003420037037041aeb9c0004116200341f0006a100120022001290300370300200320032903703703a00220034200200e20127d200d201354ad7d2215200d20137d220f200d562015200e562015200e511b22011b3703980120034200200f20011b37039001200341a0026a411020034190016a4110100320034190016a41086a41023a000020034199016a2003290330370000200341a1016a200341306a41086a290300370000200341a9016a200341306a41106a290300370000200341b1016a200341306a41186a290300370000200341b9016a2003290350370000200341c1016a200341d0006a41086a290300370000200341c9016a200341d0006a41106a290300370000200341d1016a200341d0006a41186a290300370000200341023a009001200341f8016a2012370300200341f0016a2013370300200341e8016a2008370300200341e0016a200937030020034190016a108b010c070b41df88c0004133103a000b411441011020000b413441011020000b2002101d0b20010d00410121014115210741d7c0c10021040c010b200341a0026a41026a2003419c026a41026a2d00003a0000200341d0006a41086a20034180026a41086a290300370300200341d0006a410d6a20034180026a410d6a290000370000200320032f019c023b01a0022003200329038002370350410021010b2003418c016a41026a2202200341a0026a41026a2d00003a0000200341f0006a41086a2205200341d0006a41086a290300370300200341f0006a41106a200341d0006a41106a290300370300200320032f01a0023b018c012003200329035037037020010d01200341a3016a2005290300370000200341a8016a200341fd006a290000370000200320032f018c013b019001200320073600970120032004360093012003200329037037009b01200320022d00003a00920120034190016a200e200d10e20120034190016a2009200810e7010b410021040b2000200736020420002004360200200341c0026a24000bc70202047f047e230041206b22012400200141106a41086a220242003703002001420037031041aeb9c0004116200141106a1001200141086a22032002290300370300200120012903103703000240024002402001411041f8b3c200410041001002417f460d00200142003703182001420037031020014110200141106a4110410010022204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b200041086a290300210720002903002108200242003703002001420037031041aeb9c0004116200141106a100120032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101003200141206a24000f0b41df88c0004133103a000b1c0020012802184190cfc200410b2001411c6a28020028020c1100000b900501137f02400240200128020022064100480d00200641ffffffff07460d002001200641016a360200200141046a2107200141086a28020021080c010b103f000b410021060340024002400240024002400240024002400240024020060e020001010b2007280200220a41086a210b200a2f0106220941057421064100210c0240024003402006450d012002200b412010d003220d450d02200641606a2106200c41016a210c200b41206a210b200d417f4a0d000b200c417f6a21090b2008450d022008417f6a2108200a20094102746a4180096a2107410021060c0a0b200a41e8026a200c41c8006c6a2206450d01200641186a210e2006411c6a280200210f41082110410c2111417f21124102211341900221144101211541742116410021170c080b200e280200220920106a210620092f0106221820116c210b4100210c0240024002400340200c210d200b450d01024002400240200420062802002006280208220c2005200c2005491b10d003220e450d004101210a200e20174e0d010c020b200c2005460d0520122015200c20054b1b210a0b200620116a2106200d20156a210c200b20166a210b200a2012470d010b0b200f0d010c030b2018210d200f450d020b200f20126a210f2009200d2013746a20146a210e410121060c090b2009418c016a220b200d410c6c6a2206450d0020062802002205450d01200b200d410c6c6a2802082206417f4c0d062006450d022006101f220b0d03200641011020000b200020012802102002200320042005200141146a28020028020c1105000c040b4100210b0c020b4101210b0b200b2005200610ce031a0b200020063602042000200b360200200041086a20063602000b20012001280200417f6a3602000f0b102e000b410121060c000b0bca16050f7f017e1f7f017e067f230041a0036b2204240020022802082105200228020421062002280200210702400240024002402001280200220841f0c0c100460d00200128020421090c010b419002101f2208450d0141002109200841003b010620084100360200200841086a200441e8006a41880210ce031a20014100360204200120083602000b0c010b41900241041020000b41002102024003400240024002400240024002400240024020020e020001010b200841086a210220082f0106220b410c6c210c4100210d024002400240024002400340200d210a200c450d01024002400240200720022802002002280208220d20052005200d4b1b10d003220e450d004101210f200e41004e0d010c020b2005200d460d06417f41012005200d491b210f0b2002410c6a2102200a41016a210d200c41746a210c200f417f470d010b0b20090d010c020b200b210a2009450d010b2009417f6a21092008200a4102746a4190026a2802002108410021020c0a0b200441186a20083602002001200128020841016a3602082004411c6a200aad4220862001ad843702002004200636020c2004200736020820042005ad370310200441c8006a41086a220c200341086a2802003602002004200329020037034820082f0106220d410b4f0d01200841086a2202200a410c6c2210410c6a22116a200220106a2202200d200a6b410c6c10cf031a2002200536020820022006360204200220073602002008418c016a220220116a200220106a2202200841066a220d2f0100200a6b410c6c10cf031a200241086a200c28020036020020022004290348370200200d200d2f010041016a3b01000c0a0b02402006450d002007101d0b200441e8006a41086a22022008200a410c6c6a220c4194016a220d2802003602002004200c418c016a220c290200370368200d200341086a280200360200200c2003290200370200200441086a41086a220c200228020036020020042004290368370308200041013602002000410c6a200c28020036020020002004290308370204200441a0036a24000f0b419002101f2212450d04201241003b010620124100360200201241086a200441e8006a41880210ce03210c200441e8006a41086a220d200841dc016a280200360200200420082902d401370368200841d4006a290200211320082802502114200c200841dc006a200841066a22102f010041796a2202410c6c221110ce03210c2012418c016a200841e0016a201110ce032111201041063b0100201220023b0106200441d8006a41086a200d2802003602002004200429036837035802400240200a41064b0d00200841086a2202200a410c6c220d410c6a22106a2002200d6a220c200841066a22022f0100200a6b410c6c10cf031a200c2005360208200c2006360204200c20073602002008418c016a220c20106a200c200d6a220c20022f0100200a6b410c6c10cf031a200c41086a200441c8006a41086a280200360200200c20042903483702000c010b200c200a410c6c220d41b87f6a22106a200c200d41ac7f6a220d6a220c200241ffff0371200a41796a220a6b410c6c10cf031a200c2005360208200c2006360204200c2007360200201120106a2011200d6a220c201241066a22022f0100200a6b410c6c10cf031a200c41086a200441c8006a41086a280200360200200c20042903483702000b41012110200220022f010041016a3b010041082115200441386a41086a2216200441d8006a41086a221728020036020020042004290358370338200441286a41086a221820162802003602002004200429033837032820082802002219450d0120082f0104211a41ffff03211b410a211c41c002211d4100211e41b802211f41d400212041d000212141dc01212241d401212341dc0021244106212541792126410c212741e0012128418c01212941ac02212a419002212b417a212c4102212d419402212e4104211141ac7f212f41b87f2130416c213141f80121320c060b200441c8006a20156a2235201828020036020020042004290328370348201a201b71210f20192f01062202201c4d0d01201d101f220a450d02200a201e3b0106200a201e360200200a20156a200441e8006a201f10ce032102201920206a2902002133201920216a2802002134200441e8006a20156a220b201920226a2802003602002004201920236a2902003703682002201920246a201920256a22362f0100220c20266a220d20276c220e10ce032137200a20296a201920286a200e10ce032138200a202b6a2019202a6a200c202c6a220e202d7410ce032139203620253b0100200a200d3b01060240200e450d00410021022039210c0340200c280200220d20023b0104200d200a360200200c20116a210c200e200220106a2202470d000b0b2017200b28020036020020042004290368370358200b20172802003602002004200429035837036802400240201a201b71220220254b0d00201920156a220d200f20276c220c20276a220e6a200d200c6a220d20362f0100221a200f6b20276c223910cf031a200d2013370204200d2014360200201920296a220d200e6a200d200c6a220c203910cf031a200c20156a2035280200360200200c20042903483702002036201a20106a220c3b01002019202b6a220d200f202d7422366a20156a200d200f20106a220e202d746a221a200c201b71220d200e6b202d7410cf031a201a20123602002002200d4f0d01201920366a202e6a210203402002280200220c200f20106a220f3b0104200c2019360200200220116a2102200d200f470d000c020b0b2037200f20276c220220306a220e6a20372002202f6a221a6a220c200a20256a220d2f0100200f20266a22026b20276c10cf031a200c2013370204200c20143602002038200e6a2038201a6a220c200d2f0100220e20026b20276c10cf031a200c20156a2035280200360200200c2004290348370200200d200e20106a220e3b01002039200f202d74221a6a20316a2039200f202c6a220c202d746a220d200e201b71220f200c6b202d7410cf031a200d2012360200200c200f4b0d00200a201a6a20326a210c0340200c280200220d200220106a22023b0104200d200a360200200c20116a210c200f2002470d000b0b2016200b280200360200200420042903683703382018201628020036020020042004290338370328024020192802002202450d0020192f0104211a203321132034211420022119200a2112410121020c070b2033211320342114200a21120b41c002101f2202450d03200241003b010620024100360200200241086a200441e8006a41b80210ce03210d20022001280200220c36029002200120023602002001200128020441016a360204200c41003b0104200c2002360200200d20022f0106220c410c6c22106a220d2013370204200220106a22104194016a200441286a41086a2802003602002010418c016a2004290328370200200d201436020020024190026a200c41016a220c4102746a20123602002002200c3b01062012200c3b0104201220023602000c060b201941086a220d200f410c6c220c410c6a22106a200d200c6a220d2002200f6b410c6c220a10cf031a200d2013370204200d20143602002019418c016a220d20106a200d200c6a220c200a10cf031a200c41086a200441c8006a41086a280200360200200c2004290348370200201941066a200241016a220c3b010020194190026a220d200f4102746a41086a200d200f41016a22024102746a220d200c41ffff0371221020026b41027410cf031a200d2012360200201a41ffff037120104f0d0520192002417f6a22024102746a4194026a210c0340200c280200220d200241016a22023b0104200d2019360200200c41046a210c20102002470d000c060b0b41c00241041020000b41900241041020000b41c00241041020000b410121020c000b0b20004100360200200441a0036a24000b7701017f230041c0006b220024002000411036020c200041eca8c100360208200041346a411e360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000b13002000410a360204200041c08ec3003602000bed0201027f230041206b22022400024002404116101f2203450d002003410e6a41002900d7d940370000200341086a41002900d1d940370000200341002900c9d940370000200341164136101e2203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241106a41086a220142003703002002420037031020034136200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d002002410036021020024110200241106a41044100100241016a4105490d02200228021021012002410036021020024110200241106a41044104100241016a4105490d02200041086a200228021036020020002001360204200041013602000c010b200041003602000b2003101d200241206a24000f0b41df88c0004133103a000b411641011020000b413641011020000b130020004107360204200041a5edc0003602000b1300200041143602042000419896c3003602000b7801047f230041106b22022400200241003602082002420137030002404101101f2203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b410141011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241003600000f0b410441011020000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242053700000f0b410841011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241013600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241023600000f0b410441011020000b3901017f02404110101f2202450d002002420037000820024201370000200042908080808002370204200020023602000f0b411041011020000b3901017f02404110101f2202450d002002420037000820024209370000200042908080808002370204200020023602000f0b411041011020000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a101e22060d020c070b200541106a21090c020b200a101f2206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a101e22060d020c080b200941206a21050c020b200a101f2206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510032000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100320030d030c040b1021000b200a41011020000b200a41011020000b2006101d0b200241106a24000bcf0506027f017e0b7f017e027f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b102e000b200541081020000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001002220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1002220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f101e22060d010c060b200f101f2206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d002006101d0b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b1021000b200f41081020000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009101e22080d020c070b200041206a2107200228020021080c020b2009101f2208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009101e22080d020c080b200741086a21000c020b2009101f2208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1021000b200941011020000b200941011020000b2008101d0b200241106a24000b820101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a411f3602002004412c6a4102360200200441183602342004420237021c200441b8b1c4003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41c8b1c40010cf01000ba11102177f017e230041206b220224002000280204210320002802002104410121050240200128021841222001411c6a2802002802101106000d00024002402003450d00200420036a2106200141186a21072001411c6a2108200421094100210a4100210b024003402009210c200941016a2100024002400240024002400240024002400240024020092c0000220d4100480d00200d41ff0171210d0c010b02400240024020002006460d0020002d0000413f71210e200941026a22092100200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20062109200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020092006460d00200941016a2200211020092d0000413f71200e41067472210e200d41f001490d010c030b200621104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b2000210941022100200d41776a220f411e4d0d010c020b0240024020102006460d00201041016a210920102d0000413f71210d0c010b4100210d200021090b200e410674200f411274418080f0007172200d72220d418080c400460d0841022100200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d10ec020d0002400240200d41ffff034b0d00200d4180fe0371410876211141d8b7c200211241002113410021000c010b0240200d41ffff074b0d00200d4180fe037141087621164193bdc200211741002118410121000c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b024003400240024020000e020001010b201241026a2114201320122d000122006a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d05201341a8b8c2006a210e03402000450d022000417f6a2100200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d012010211320142112201441a8b8c200470d030c010b2010211320142112201441a8b8c200470d010b200d41ffff0371210e41d7bac20021004101210f02400340200041016a21100240024020002d000022144118744118752215417f4c0d0020102100200e20146b220e4100480d030c010b024020104193bdc200460d00200041016a2110200041026a2100200e201541ff007141087420102d0000726b220e41004e0d010c030b4190b3c400102c000b200f410173210f20004193bdc200470d000b0b200f410171450d070c0a0b410021000c040b410021000c030b201041af02102b000b20132010102a000b201741026a2114201820172d000122006a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d05201841d5bdc2006a210e03402000450d022000417f6a2100200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d012010211820142117201441d5bdc200470d030c010b2010211820142117201441d5bdc200470d010b200d41ffff0371210e41f3bec20021004101210f02400340200041016a21100240024020002d000022144118744118752215417f4c0d0020102100200e20146b220e4100480d030c010b0240201041f0c1c200460d00200041016a2110200041026a2100200e201541ff007141087420102d0000726b220e41004e0d010c030b4190b3c400102c000b200f410173210f200041f0c1c200470d000b0b200f410171450d050c080b410121000c020b410121000c010b0b2010419e01102b000b20182010102a000b200d41017267410276410773ad4280808080d000842119410321000b200d210e0b20022003360204200220043602002002200a3602082002200b36020c02400240200b200a490d000240200a450d00200a2003460d00200a20034f0d012004200a6a2c000041bf7f4c0d010b0240200b450d00200b2003460d00200b20034f0d012004200b6a2c000041bf7f4c0d010b20072802002004200a6a200b200a6b200828020028020c1100000d010340024002400240024002400240024020004101460d0041dc00210a024020004102460d0020004103470d062019422088a741ff0171417f6a220041044b0d06024020000e050006040503000b201942ffffffff8f608321194103210041fd00210a0c070b410121000c060b41002100200e210a0c050b201942ffffffff8f60834280808080c000842119410321000c040b201942ffffffff8f60834280808080208421194103210041fb00210a0c030b201942ffffffff8f60834280808080308421194103210041f500210a0c020b200e2019a7220f410274411c7176410f712200413072200041d7006a2000410a491b210a0240200f450d002019427f7c42ffffffff0f83201942808080807083842119410321000c020b201942ffffffff8f6083428080808010842119410321000c010b410121000240200d418001490d0041022100200d418010490d0041034104200d41808004491b21000b2000200b6a210a200b200c6b20096a210b20062009470d050c060b2007280200200a2008280200280210110600450d000b200241206a240041010f0b20022002410c6a3602182002200241086a36021420022002360210200241106a10ed02000b200241206a240041010f0b200b200c6b20096a210b20062009470d000b0b200a450d01200a2003460d010240200a20034f0d002004200a6a2c000041bf7f4a0d020b20042003200a200310ee02000b4100210a0b200141186a22002802002004200a6a2003200a6b2001411c6a220b28020028020c1100000d0020002802004122200b28020028021011060021050b200241206a240020050bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001108b02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b2004418001102a000b2004418001102a000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e220841017441aab4c2006a2f00003b00002005417e6a2008419c7f6c20076a41017441aab4c2006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff037141017441aab4c2006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a200541017441aab4c2006a2f00003b00000b2002200141f8b3c2004100200341096a20046a412720046b108c022104200341306a240020040be60601067f0240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b200020072002200310c9030d012000280218200420052000411c6a28020028020c1100000f0b0240024002400240024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b2101410120002d0030220920094103461b2209410371450d0220094102460d034100210b200121090c040b200020072002200310c9030d0b2000280218200420052000411c6a28020028020c1100000f0b41012101200041013a003020004130360204200020072002200310c9030d0a200920086b21014101200041306a2d0000220920094103461b2209410371450d0320094102460d0441002108200121090c050b410021092001210b0c010b20014101762109200141016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110600450d000c050b0b200041046a280200210a41012101200020072002200310c9030d07200041186a2209280200200420052000411c6a220328020028020c1100000d0720092802002100417f2109200328020041106a21030340200941016a2209200b4f0d06410121012000200a2003280200110600450d000c080b0b41002109200121080c010b20014101762109200141016a41017621080b417f2101200041046a210a200041186a21032000411c6a21020340200141016a220120094f0d022003280200200a2802002002280200280210110600450d000b0b410121010c030b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1100000d0220092802002100417f2109200328020041106a21030340200941016a220920084f0d02410121012000200a2003280200110600450d000c030b0b41000f0b41000f0b20010b1c002001280218419bcfc200410e2001411c6a28020028020c1100000bfab3010f0c7f017e027f027e0a7f027e037f017e067f027e067f037e027f027e407f230041e0036b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b2001410c6a2802002105200141086a2802002106200141106a280200210720012802042108200241096a2800002109200241056a280000210420022d0001210a20022d0000210b200341e4026a41026a220c200241046a2d00003a0000200341a8026a41086a220d200241156a290000370300200341a8026a410d6a220e2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d13410121020c140b20012802042105200241096a2800002109200241056a280000210420022d0001210620022d0000210b200341e4026a41026a2208200241046a2d00003a0000200341a8026a41086a2207200241156a290000370300200341a8026a410d6a220a2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d09410121020c0a0b20022d000120022d0000720d07200141086a290300210f200341e8026a41086a22024200370300200342003703e80241dafcc0004114200341e8026a100120034190016a41086a2002290300370300200320032903e802370390012003200f3703b80120034190016a4110200341b8016a410810030c580b200141306a280200210e2001412c6a280200211020012802042111200341b4016a41026a2001410b6a2d00003a0000200341f0006a41086a2001411c6a290200370300200341f0006a410d6a200141216a290000370000200320012f00093b01b4012003200141146a290200370370200141086a2d000021052001410c6a2802002106200141106a2802002108200241096a2800002109200241056a280000210420022d0001210720022d0000210b200341e4026a41026a220a200241046a2d00003a0000200341a8026a41086a220c200241156a290000370300200341a8026a410d6a220d2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d0a410121020c0b0b2001280204210a200241096a2800002109200241056a280000210420022d0001210520022d0000210b200341e4026a41026a2206200241046a2d00003a0000200341a8026a41086a2208200241156a290000370300200341a8026a410d6a22072002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d0c410121020c0d0b200341f0006a41026a2205200141076a2d00003a0000200341c8026a41086a220e200141186a290200370300200341c8026a410d6a22112001411d6a290000370000200320012f00053b01702003200141106a2902003703c80220022d000120022d0000720d042001410c6a2802002109200141086a280200210420012d00042102200341e4026a41026a20052d00003a0000200341b8016a41086a200e290300370300200341b8016a410d6a2011290000370000200320032f01703b01e402200320032903c8023703b801200241ff01714101470d1e200341b8036a200441067610b00120032802b803210520032802c0032004413f7122024d0d22200341e0026a41026a200520024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072109200228000321044101210220032802bc03450d4b0c4a0b2001410c6a280200210d200141086a2802002106200141106a280200210e20012802042108200241096a2800002109200241056a280000210420022d0001210520022d0000210b200341e4026a41026a2207200241046a2d00003a0000200341a8026a41086a220a200241156a290000370300200341a8026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d10410121020c110b200141386a2903002112200141306a2903002113200141286a2802002114200341b4016a41026a200141076a2d00003a0000200341f0006a41086a200141186a290200370300200341f0006a410d6a2001411d6a290000370000200320012f00053b01b4012003200141106a290200370370200141086a28020021152001410c6a280200211620012d00042117200241096a2800002109200241056a280000210420022d0001211820022d00002119200341e4026a41026a221a200241046a2d00003a0000200341a8026a41086a221b200241156a290000370300200341a8026a410d6a221c2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a8022019450d12410121020c130b20022d000120022d0000720d0120012802042102200341e8026a41086a22044200370300200342003703e80241b2fcc0004114200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001200320023602b80120034190016a4110200341b8016a410410030c520b20022d000120022d000072450d130b41c9b4c0002104412821090c550b200341e0026a41026a20082d00003a0000200341c8026a41086a2007290300370300200341c8026a410d6a200a290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200641ff01714101470d0020034190036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b019003200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b20034190036a41026a2d00003a000020034190016a41086a2206200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f0190033b01ac01200320032903b8013703900120020d49200341cb036a2006290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320093600bf03200320043600bb0320032003290390013700c3032003200b2d00003a00ba034116101f2202450d262002410e6a41002900d7d940370000200241086a41002900d1d940370000200241002900c9d940370000200241164136101e2202450d27200220032903b8033700162002412e6a200341d0036a290300370000200241266a200341b8036a41106a290300370000411e21092002411e6a200341b8036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024136200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002210b2002101d418e83c1002104200b417f470d49200341e8026a41086a22024200370300200342003703e80241e7fdc0004116200341e8026a100120034190016a41086a2002290300370300200320032903e802370390014100210a024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d2620032802b801210a0b200341e8026a41086a22024200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2002290300370300200320032903e802370390014100210c20034190016a411041f8b3c200410041001002417f460d1d2003421037029403200320034190016a36029003200341b8016a20034190036a105e20032802b801220d450d2a200341c0016a280200210220032802bc01210c200a2005460d1e0c1f0b200341e0026a41026a200a2d00003a0000200341c8026a41086a200c290300370300200341c8026a410d6a200d290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200741ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b2003418c016a41026a220b200341b8036a41026a2d00003a0000200341e8026a41086a2207200341b8016a41086a220a290300370300200341e8026a41106a200341b8016a41106a290300370300200320032f01b8033b018c01200320032903b8013703e80220020d46200341a3036a2007290300370000200341a8036a200341e8026a410d6a2202290000370000200320032f018c013b01900320032009360097032003200436009303200320032903e80237009b032003200b2d00003a009203200341e4026a41026a200341b4016a41026a2d00003a0000200a200341f0006a41086a290300370300200341b8016a410d6a2204200341f0006a410d6a290000370000200320032f01b4013b01e402200320032903703703b801200541ff01714101470d0d200341a8026a200641067610b00120032802a802210420032802b0022006413f7122024d0d16200341e0026a41026a200420024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072108200228000321064101210220032802ac02450d3b0c3a0b200341e0026a41026a20062d00003a0000200341c8026a41086a2008290300370300200341c8026a410d6a2007290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200541ff01714101470d0020034190036a41026a200341e0026a41026a2d00003a0000200341b8036a41086a200341c8026a41086a290300370300200341b8036a410d6a200341c8026a410d6a290000370000200320032f01e0023b019003200320032903c8023703b803410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b20034190036a41026a2d00003a000020034190016a41086a2205200341b8036a41086a29030037030020034190016a41106a200341b8036a41106a290300370300200320032f0190033b01ac01200320032903b8033703900120020d43200341cb016a2005290300370000200341d0016a2003419d016a290000370000200320032f01ac013b01b801200320093600bf01200320043600bb0120032003290390013700c3012003200b2d00003a00ba01200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a1001200341a8026a41086a2002290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002417f460d0f41a782c1002104411e21090c430b200341e0026a41026a200c2d00003a0000200341c8026a41086a200d290300370300200341c8026a410d6a200e290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200a41ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b200341b8036a41026a2d00003a000020034190016a41086a220a200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900102402002450d004100210b410121052006450d422008101d200128020022024102470d490c480b2003418c016a41026a2202200b2d00003a0000200341f0006a41086a220b200a290300370300200341f0006a410d6a220a20034190016a410d6a290000370000200320032f01ac013b018c012003200329039001370370200341cb016a200b290300370000200341d0016a200a290000370000200320093600bf01200320043600bb01200320022d00003a00ba01200320032f018c013b01b801200320032903703700c301200320053602c003200320063602bc03200320083602b8032003200341b8016a200341b8036a2007108f0220032802042109200328020021044100210b41012105200128020022024102470d480c470b200341e0026a41026a20072d00003a0000200341c8026a41086a200a290300370300200341c8026a410d6a200c290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200541ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b200341b8036a41026a2d00003a000020034190016a41086a2205200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900120020d07200341cb036a2005290300370000200341d0036a20034190016a410d6a290000370000200320032f01ac013b01b803200320093600bf03200320043600bb0320032003290390013700c3032003200b2d00003a00ba03200341b8016a200341b8036a10c0014101210220032d00b8014101470d052003418e016a20032d00bb013a0000200341e8026a41086a200341cc016a290200370300200341e8026a410d6a200341d1016a290000370000200320032f00b9013b018c012003200341c4016a2902003703e802200341b8016a41086a28020021094100210220032802bc0121040c060b200341e0026a41026a201a2d00003a0000200341c8026a41086a201b290300370300200341c8026a410d6a201c290000370000200320032f01e4023b01e002200320032903a8023703c80241012102201841ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b412a210941f1b4c00021040b2003418c016a41026a2219200341b8036a41026a2d00003a0000200341e8026a41086a2218200341b8016a41086a290300370300200341e8026a41106a200341b8016a41106a290300370300200320032f01b8033b018c01200320032903b8013703e80220020d3a200341a3036a2018290300370000200341a8036a200341e8026a410d6a290000370000200320032f018c013b01900320032009360097032003200436009303200320032903e80237009b03200320192d00003a0092032013201284500d08200341e4026a41026a2202200341b4016a41026a2d00003a0000200341b8016a41086a2204200341f0006a41086a290300370300200341b8016a410d6a200341f0006a410d6a290000370000200320032f01b4013b01e402200320032903703703b801201741ff01714101470d09200341a8026a201541067610b00120032802a802210420032802b0022015413f7122024d0d0c200341e0026a41026a200420024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072116200228000321154101210220032802ac02450d2b0c2a0b200141086a290300210f200341e8026a41086a22024200370300200342003703e80241eefcc000411c200341e8026a100120034190016a41086a2002290300370300200320032903e802370390012003200f3703b80120034190016a4110200341b8016a410810030c3d0b200341e0026a41026a200341e4026a41026a2d00003a0000200341e8026a41086a200341b8016a41086a29030037030020022004290000370000200320032f01e4023b01e002200320032903b8013703e8020c2e0b410b2109419a80c10021040b200341b4016a41026a220b2003418c016a41026a2d00003a000020034190036a41086a2205200341e8026a41086a29030037030020034190036a41106a200341e8026a41106a290300370300200320032f018c013b01b401200320032903e802370390032002450d010b4101210b410021052006450d362008101d200128020022024102470d3d0c3c0b200341b0016a41026a2202200b2d00003a0000200341f0006a41086a220b2005290300370300200341f0006a410d6a220520034190036a410d6a290000370000200320032f01b4013b01b0012003200329039003370370200341cb016a200b290300370000200341d0016a2005290000370000200320093600bf01200320043600bb01200320022d00003a00ba01200320032f01b0013b01b801200320032903703700c3012003200d3602c003200320063602bc03200320083602b803200341086a200341b8016a200341b8036a200e108f02200328020c2109200328020821044101210b41002105200128020022024102470d3c0c3b0b4114101f2202450d12200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d13200220032903b801370014411821092002412c6a200341b8016a41186a290300370000200241246a200341b8016a41106a2903003700002002411c6a200341b8016a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c20041004100100221042002101d2004417f460d06200341e8026a41086a22024200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d0a2003421037029403200320034190016a36029003200341b8036a20034190036a105e20032802b8032202450d1520032802bc03210b200341c0036a2802002204200a4d0d0b2002200a4105746a2209200341b8016a460d0d2009200341b8016a412010d003450d0d41f582c100210441192109200b0d0c0c330b200341e0026a41026a200341e4026a41026a2d00003a0000200341e8026a41086a200341b8016a41086a290300370300200341e8026a410d6a200341b8016a410d6a290000370000200320032f01e4023b01e002200320032903b8013703e8020c2d0b41e083c100210441d00021090c310b200341e0026a41026a20022d00003a0000200341e8026a41086a2004290300370300200341e8026a410d6a200341b8016a410d6a290000370000200320032f01e4023b01e002200320032903b8013703e8020c220b4100210220032802ac020d230c240b4100210220032802bc030d270c280b4100210220032802ac020d1d0c1e0b41c582c10021040c2c0b4101210d41002102200a2005470d010b20022005460d0e0b41ac83c100210441162109200220054d0d0e200341d0016a4200370300200341c8016a4200370300200341c0016a4200370300200342003703b801200d20054105746a220b200341b8016a460d0d200b200341b8016a412010d0030d0e0c0d0b41dd82c10021040c280b41dd82c100210441182109200b450d270b2002101d0c260b200320043602c0032003200b3602bc03200320023602b803200341b8016a200a200341b8036a1090024200210f200341e8026a41086a22024200370300200342003703e802418582c1004112200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001410021040240024020034190016a411041f8b3c200410041001002417f460d00200342003703c003200342003703b80320034190016a4110200341b8036a4110410010022202417f460d0a2002410f4d0d0a200341c0036a290300212320032903b803210f0c010b420021230b200341b8016a200f20231094010c2a0b200341cc016a4101360200200341183602bc03200341c0adc4003602b803200342013702bc01200341c8adc4003602b8012003200341b8036a3602c801200341b8016a41c0a9c30010cf01000b41df88c0004133103a000b411641011020000b413641011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b4200210f200341e8026a41086a22044200370300200342003703e802418efec0004115200341e8026a100120034190016a41086a2004290300370300200320032903e802370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022204417f460d042004410f4d0d04200341c0016a290300210f20032903b80121230c010b420921230b200341306a200341b8036a2023200f10cc012003280230450d0141c283c1002104411e21090b200c450d1a200d101d0c1a0b200341e8026a41086a22044200370300200342003703e80241fdfdc0004111200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100210b024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0220032802b801210b0b4116101f2204450d022004410e6a41002900d7d940370000200441086a41002900d1d940370000200441002900c9d940370000200441164136101e2204450d03200420032903b8033700162004412e6a200341d0036a290300370000200441266a200341c8036a2903003700002004411e6a200341b8036a41086a290300370000200341e8026a41086a22094200370300200342003703e80220044136200341e8026a100120034190016a41086a2009290300370300200320032903e802370390014104101f2209450d042009200b360000200941044108101e2209450d052009200536000420034190016a41102009410810032009101d2004101d02400240024020022005470d00200341b8016a41186a2204200341b8036a41186a290300370300200341b8016a41106a200341b8036a41106a290300370300200341b8016a41086a2209200341b8036a41086a290300370300200320032903b8033703b801200c2005470d0a200541016a22022005490d1a2005410174220b20022002200b491b220cad420586220f422088a70d1a200fa722024100480d1a2005450d01200d20054105742002101e220d450d020c0a0b200341b8016a41186a2209200341b8036a41186a290300370300200341b8016a41106a200341b8036a41106a290300370300200341b8016a41086a220b200341b8036a41086a290300370300200320032903b8033703b801200220054d0d08200d20054105746a220420032903b801370000200441186a2009290300370000200441106a200341b8016a41106a290300370000200441086a200b2903003700000c0a0b2002101f220d0d080b200241011020000b41df88c0004133103a000b41df88c0004133103a000b411641011020000b413641011020000b410441011020000b410841011020000b4198a9c30020052002104b000b200d20054105746a220220032903b801370000200241186a2004290300370000200241106a200341b8016a41106a290300370000200241086a2009290300370000200541016a21020b200341e8026a41086a22044200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001200341003602c001200342013703b801200320023602900320034190036a200341b8016a10620240024002402002450d00200d20024105746a21084100200341b8016a41086a28020022046b210b20032802b801210620032802bc012105200d2102034002402005200b6a411f4b0d00200441206a22092004490d1320054101742207200920092007491b22094100480d13024002402005450d00200620052009101e22060d010c060b2009101f2206450d050b200921050b200620046a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200b41606a210b200441206a2104200241206a2209210220082009470d000b200341c0016a2004360200200320053602bc01200320063602b8010c010b200341b8016a41086a280200210420032802bc01210520032802b80121060b20034190016a411020062004100302402005450d002006101d0b0240200c450d00200d101d0b200341e8026a41086a22024200370300200342003703e80241e7fdc0004116200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001410121052003200a41016a3602b80120034190016a4110200341b8016a410410030c090b200941011020000b2004101d0b20020d004101210241d7c0c1002115411521160c010b200341a8026a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01a802200320032903e8023703b801410021020b200341ac016a41026a2209200341a8026a41026a2d00003a000020034190016a41086a2204200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01a8023b01ac01200320032903b8013703900102402002450d0020162109201521040c0d0b200341cb036a2004290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320163600bf03200320153600bb0320032003290390013700c303200320092d00003a00ba03200341e8026a41086a22024200370300200342003703e80241fdfdc0004111200341e8026a100120042002290300370300200320032903e80237039001410021020240024002400240024002400240024002400240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0120032802b80121020b0240024002400240024002400240024020022014470d00200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a100120034190016a41086a22042002290300370300200320032903e80237039001200341b8016a20034190016a106020032802c401221b450d0120032903c801211e20024200370300200342003703e8024198fdc0004118200341e8026a100120042002290300370300200320032903e802370390014100211520034190016a411041f8b3c200410041001002417f460d02200342103702ec02200320034190016a3602e802200341e8006a200341e8026a10d5012003280268450d07200328026c221aad221f421c88a70d0b201f420486a72202417f4c0d0b2002450d032002101f22190d04200241081020000b41dd84c1002104411121090c230b41b084c1002104412d21090c220b410821194108212d410021020c020b410821190b02400240201a450d00200341e8026a41086a280200211620032802ec02211c20032802e8022117410021184100210941002104201a21150340200342003703c001200342003703b80141002017201c200341b8016a41102016100222022002417f461b2202411020024110491b20166a21162002410f4d0d04200441016a2102200341b8016a41086a290300211f20032903b8012132024020042015470d002018200220022018491b2215ad4204862233422088a70d212033a722144100480d2102402004450d00201920092014101e22190d010c090b2014101f2219450d080b201920096a2204201f37030820042032370300201841026a2118200941106a2109200221042002201a490d000b200341f0026a201636020020190d010c040b41002102410021152019450d030b2019212d0b200341e8026a41086a22044200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100211a0240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b801221c450d0e200341c0016a280200212e20032802bc01211a0c010b4101211c4100212e0b4200211f200341e8026a41086a22044200370300200342003703e80241c986c100411c200341e8026a100120034190016a41086a2004290300370300200320032903e802370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022204417f460d082004410f4d0d08200341c0016a290300211f20032903b80121320c010b420121320b200341d8006a2032201f202ead420010d2034114101f2204450d08200341d8006a41086a290300211f20032903582134200441106a41002800d5ba40360000200441086a41002900cdba40370000200441002900c5ba40370000200441144134101e2204450d0920042003290390033700142004412c6a200341a8036a290300370000200441246a20034190036a41106a2903003700002004411c6a20034190036a41086a29030037000042002133200341e8026a41086a22094200370300200342003703e80220044134200341e8026a1001200341a8026a41086a2009290300370300200320032903e8023703a80202400240200341a8026a411041f8b3c200410041001002417f460d00200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022209417f460d092009410f4d0d09200341c0016a290300213220032903b80121330c010b420021320b2004101d0240024002400240024020332034542032201f542032201f511b450d00419f85c1002104412e2109201a0d010c020b200341e8026a41086a22044200370300200342003703e80241c2fdc0004113200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a10860220032802b8012216450d15200341b8016a41086a2802002218450d1620032802bc01211741cd85c1002104412321092016290300201354201641086a290300223220125420322012511b450d0341082131200341e8026a41086a22044200370300200342003703e80241dfd9c0004115200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100213520034190016a411041f8b3c200410041001002417f460d01200342103702ec02200320034190016a3602e802200341b8016a200341e8026a10a40120032802b8012231450d17200341c0016a280200213620032802bc0121350c020b41ee84c100210441312109201a0d030c040b410021360b2031203641286c6a2130203121044100211402400240024002400340203020046b419f014d0d012004200341b8036a460d0220142004200341b8036a412010d003222f4100476a2114202f450d02200441286a222f200341b8036a460d022014202f200341b8036a412010d003222f4100476a2114202f450d02200441d0006a222f200341b8036a460d022014202f200341b8036a412010d003222f4100476a2114202f450d02200441f8006a222f200341b8036a460d02200441a0016a21042014202f200341b8036a412010d003222f4100476a2114202f0d000c020b0b20302004460d012031203641286c6a21300340200341b8036a2004460d0120142004200341b8036a412010d003222f4100476a2114202f450d012030200441286a2204470d000c020b0b2014201e422088a74f0d010b02402035450d002031101d0b200341b8016a200341b8036a10fb0141a686c100210420032802b8014101470d01200241ffffffff00712202202e41ffffff3f712204200420024b1b222f450d04200341c0016a280200213120032802bc012130201c210441002109420021374200213803404114101f2202450d11200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d12200220042900003700142002412c6a200441186a290000370000200241246a200441106a2900003700002002411c6a200441086a290000370000200341e8026a41086a22144200370300200342003703e80220024134200341e8026a100120034190016a41086a2014290300370300200320032903e8023703900102400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0e20032802b801212e41002114200941016a21092002101d202e20304f0d010c020b41012114200941016a21092002101d41002030490d010b20140d00200341b8016a200410910242002132420021330240200341b8016a41086a28020020314d0d00202d41086a290300420020032802b80120316a2d000022021b2133202d290300420020021b21320b024020032802bc01450d0020032802b801101d0b203320387c203220377c2237203254ad7c21380b200441206a2104202d41106a212d2009202f490d000c060b0b41f085c1002104413621092035450d002031101d0b02402017450d002016101d0b201a450d010b201c101d0b02402015450d002019101d0b201ea7450d200c130b42002137420021380b2016201841306c6a2114201621020240024002400340201420026b41bf014d0d0141012109200241106a2204200341b8036a460d022004200341b8036a412010d003450d02200241c0006a2204200341b8036a460d022004200341b8036a412010d003450d02200241f0006a2204200341b8036a460d022004200341b8036a412010d003450d02200241a0016a2204200341b8036a460d02200241c0016a21022004200341b8036a412010d0030d000c020b0b024020022014460d00034041012109200241106a2202200341b8036a460d022002200341b8036a412010d003450d02200241206a22022014470d000b0b4100210920372013852038201285844200520d00200341b8036a41086a290300211f200341b8036a41106a2903002132200341b8036a41186a290300213320032903b80321342016201237030820162013370300200341b8016a41186a2033370300200341b8016a41106a2032370300200341b8016a41086a201f37030020162034370310201641186a201f370300201641206a2032370300201641286a2033370300200320343703b801201841144b0d014101213a201841014d0d1f417f213b2018417f6a213c4130213d2016201841306c6a213e4102213f41082140411021414128214241182143412021444103214541e80021464150214741782148417021494168214a4160214b4158214c4138214d410121020c1d0b200341386a20034190036a2034201f10ef012003290338200341c0006a29030010f30102402017450d002016101d0b0240201a450d00201c101d0b02402015450d002019101d0b41e586c10041fb86c10020091b21044116410f20091b2109201ea70d120c1f0b2018410176224ead42307e220f422088a70d05200fa72202417f4c0d054108210b024002402002450d002002101f224f450d12204f21500c010b4108214f410821500b4150210c201641506a21514130210d201641306a2152201641f07e6a21534100215441042155417f215641012139420321234220210f4103215741022158417d21594158215a4128210a412021074118210641102108417e215b4174215c4164215d41a87f215e41a07f215f4109216041e80021614178216241702163416821644160216541382166410a216741042168410021694100216a2018216b410221020c1b0b200341f0026a20163602002015450d002019101d0b41df88c0004133103a000b41df88c0004133103a000b201441081020000b41df88c0004133103a000b102e000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b4188a9c30041004100104b000b41df88c0004133103a000b200241081020000b201b101d0c0c0b2004101d0b20020d004101210241d7c0c1002106411521080c010b200341a8026a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01a802200320032903e8023703b801410021020b200341ac016a41026a2204200341a8026a41026a2d00003a000020034190016a41086a2209200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01a8023b01ac01200320032903b8013703900102402002450d00410121054101210b2008210920062104200128020022024102470d110c100b200341cb036a2009290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320083600bf03200320063600bb0320032003290390013700c303200320042d00003a00ba03200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a1001200341a8026a41086a2002290300370300200320032903e8023703a8020240200341a8026a411041f8b3c200410041001002417f460d0041b980c1002104412621090c090b024002400240024002404114101f2202450d00200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d012002200329039003370014411821092002412c6a20034190036a41186a290300370000200241246a20034190036a41106a2903003700002002411c6a20034190036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d042002101d4114101f2202450d09200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d0a200220032903b803370014412c21092002412c6a200341d0036a290300370000200241246a200341b8036a41106a2903003700002002411c6a200341b8036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a100120034190016a41086a2004290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d01200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0520032802b801210b2002101d200341e8026a41086a22024200370300200342003703e80241fdfdc0004111200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d02200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0620032802b801200e470d030c0b0b2002101d41df80c10021040c130b2002101d41ac81c10021040c120b4100200e460d080b41f780c1002104411621090c100b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b411441011020000b413441011020000b200341e8026a41086a22024200370300200342003703e80241ea81c100411b200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0220032802b801200b6a200e4f0d010c030b4101200b6a200e490d020b418d81c1002104411f21090c0a0b41df88c0004133103a000b200341e8026a41086a22024200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001024002400240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b8012205450d0220032802bc01210641d881c1002104411221090240200341c0016a280200220720114d0d000240200520114105746a220220034190036a460d00200220034190036a412010d0030d010b419782c100210441102109200720104d0d00200520104105746a2202200341b8036a460d022002200341b8036a412010d003450d020b2006450d122005101d0c120b41d881c1002104411221090c110b200341a8026a200341b8036a10910220032802b002210220032802a8022109200341e8026a41086a22044200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001410021040240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b8012224450d03200341c0016a280200210420032802bc0121390c010b41012124410021390b02400240200441ffffff3f7122042002200220044b1b2208450d0041002104200341d0016a210a200341c8016a210c200341c0016a210d2024210203400240200920046a2d0000450d00200a4200370300200c4200370300200d4200370300200342003703b801200341b8016a2002460d002002200341b8016a412010d003450d00200341b8016a200210fb014101210e20032802b8014101470d0020032802bc01200b4d0d030b200241206a2102200441016a22042008490d000b0b4100210e0b02402039450d002024101d0b024020032802ac02450d002009101d0b200320073602c001200320063602bc01200320053602b80120034190036a200341b8036a200e1b20112010200e1b200341b8016a1090024200210f200341e8026a41086a22024200370300200342003703e802418582c1004112200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002210202400240024002400240200e450d002002417f460d01200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022202417f460d072002410f4d0d07200341c0016a290300210f20032903b80121230c020b2002417f460d02200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022202417f460d072002410f4d0d07200341c0016a290300212b20032903b801210f0c030b420021234200210f0b200341106a20034190036a2023200f10f2012003290310200341106a41086a29030010f301200341c5016a20034190036a41086a290300370000200341cd016a200341a0036a290300370000200341d5016a200341a8036a29030037000041012105200341013a00bc01200341063a00b80120032003290390033700bd01200341b8016a108b010c0a0b4200212b0b200341206a20034190036a109a010240024002402003290320200341286a29030084500d004118101f2202450d08200241106a41002900e9ba40370000200241086a41002900e1ba40370000200241002900d9ba40370000200241184138101e2202450d09200220032903b803370018200241306a200341d0036a290300370000200241286a200341b8036a41106a290300370000200241206a200341b8036a41086a29030037000042002123200341e8026a41086a22044200370300200342003703e80220024138200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002417f460d01200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022204417f460d072004410f4d0d07200341c0016a290300211e20032903b80121232002101d411421044114101f2202450d020c0a0b4184b8c0002104412221090c120b4200211e2002101d411421044114101f22020d080b200441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411841011020000b413841011020000b200241106a41002800d5ba40360000200241086a41002900cdba40370000200241002900c5ba403700000240200220044134101e2202450d0020022003290390033700142002412c6a20034190036a41186a2204290300370000200241246a20034190036a41106a2903003700002002411c6a20034190036a41086a2903003700004200212a200341e8026a41086a22094200370300200342003703e80220024134200341e8026a1001200341a8026a41086a2009290300370300200320032903e8023703a802024002400240200341a8026a411041f8b3c200410041001002417f460d00200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022209417f460d022009410f4d0d02200341c0016a290300211220032903b801212a0c010b420021120b2002101d20034190036a202a200f20232023200f56201e202b56201e202b511b22021b220f7c22132012202b201e20021b222b7c2013202a54ad7c10e201200341b8036a2023200f7d201e202b7d2023200f54ad7d10e701200341c5016a200341b8036a41086a290300370000200341cd016a200341b8036a41106a290300370000200341d5016a200341b8036a41186a290300370000200341dd016a200329039003370000200341e5016a20034190036a41086a290300370000200341ed016a20034190036a41106a290300370000200341f5016a200429030037000041002104200341003a00bc01200341063a00b801200320032903b8033700bd01200341b8016a108b010c0f0b41df88c0004133103a000b413441011020000b410021040c0d0b2005101d0b20020d004101210241d7c0c1002104411521090c010b200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01b803200320032903e8023703b801410021020b200341ac016a41026a220e200341b8036a41026a2d00003a000020034190016a41086a2205200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900120020d03200341bb026a2005290300370000200341c0026a2003419d016a290000370000200320032f01ac013b01a802200320093600af02200320043600ab0220032003290390013700b3022003200e2d00003a00aa02200341e8026a41086a22024200370300200342003703e80241dfd9c0004115200341e8026a100120052002290300370300200320032903e802370390014100211d0240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702bc03200320034190016a3602b803200341b8016a200341b8036a10a40120032802b801220e450d0620032802bc01211d41282109200341c0016a280200221141286c22050d010c020b4108210e4100211141282109410041286c2205450d010b410021040340200341b8016a41206a200e20046a220241206a290300370300200341b8016a41186a200241186a290300370300200341b8016a41106a200241106a290300370300200341b8016a41086a200241086a290300370300200320022903003703b801200341b8016a200341a8026a412010d0030d022005200420096a2204470d000b0b4108212041002121201d450d01200e101d410021220c0b0b200341b8036a41206a2209200341b8016a41206a290300370300200341b8036a41186a2205200341b8016a41186a290300370300200341b8036a41106a2210200341b8016a41106a290300370300200341b8036a41086a2224200341b8016a41086a290300370300200320032903b8013703b80320034190036a41206a2225200929030037030020034190036a41186a2209200529030037030020034190036a41106a2205201029030037030020034190036a41086a22102024290300370300200320032903b80337039003200341e8026a41206a22242025290300370300200341e8026a41186a22252009290300370300200341e8026a41106a22092005290300370300200341e8026a41086a2205201029030037030020032003290390033703e8024128101f2220450d03202020032903e802370300202041206a2024290300370300202041186a2025290300370300202041106a2009290300370300202041086a2005290300370300201141286c41586a2004460d01200241286a212641282125200e201141286c6a222741586a212841012129412021054118212441102110410821114228212a4220212b4100212c4101212141012122410021020c040b410021220c090b41012121410121220c070b41df88c0004133103a000b412841081020000b02400340024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2026210202400340200341b8016a20056a2204200220056a290300370300200341b8016a20246a2209200220246a290300370300200341b8016a20106a2214200220106a290300370300200341b8016a20116a222d200220116a290300370300200320022903003703b801200341b8016a200341a8026a200510d0030d012027200220256a2202470d000c1a0b0b200341b8036a20056a22262004290300370300200341b8036a20246a222e2009290300370300200341b8036a20106a222f2014290300370300200341b8036a20116a2230202d290300370300200320032903b8013703b80320034190036a20056a2231202629030037030020034190036a20246a2226202e29030037030020034190036a20106a222e202f29030037030020034190036a20116a222f2030290300370300200320032903b8033703900320042031290300370300200920262903003703002014202e290300370300202d202f29030037030020032003290390033703b801024020222021470d00202120296a22222021490d1520212029742226202220222026491b2222ad202a7e2212202b88a70d152012a72226202c480d1502402021450d002020202120256c2026101e22200d010c040b2026101f2220450d030b200220256a21262020202120256c6a222e20032903b801370300202e20056a2004290300370300202e20246a2009290300370300202e20106a2014290300370300202e20116a202d290300370300202120296a212120282002470d070c180b2018203c2202203b6a223c490d0202402018203c6b2209203f490d0020162002203d6c6a22022903002016203c203d6c6a2204290300221f5a200220406a22142903002213200420406a222d29030022125a20132012511b0d0020042002290300370300202d201429030037030020042903102113200420416a200220416a290300370300200341b8016a20436a222f200420426a2214290300370300200341b8016a20416a2230200420446a222d290300370300200341b8016a20406a2231200420436a222e290300370300202e200220436a290300370300202d200220446a2903003703002014200220426a290300370300200320133703b80141012114024020092045490d002004290360201f5a200420466a290300221320125a20132012511b0d0041032114203e212d02400340202d220220476a2002290300370300200220486a200220426a290300370300200220496a200220446a2903003703002002204a6a200220436a2903003703002002204b6a200220416a2903003703002002204c6a200220406a2903003703002014222e20094f0d01202e203a6a21142002203d6a222d290300201f5a2002204d6a290300221320125a20132012511b450d000b0b202e203b6a21140b2002201f3703002002201237030820042014203d6c6a220220426a202f290300370300200220446a2030290300370300200220436a2031290300370300200220032903b8013703100b203e20476a213e203c0d070c140b206b216c4100216b4101216d206c20566a222f450d0702400240024002400240024002402016202f200d6c6a22022903002016206c200d6c222d6a2204205f6a2903002213542002200b6a290300221f2004205e6a290300221254201f2012511b450d002053202d6a21020340202f2039460d0220132002290300223254210420122002200b6a290300221f5121092012201f5421142002200c6a2102202f20566a212f20322113201f21122004201420091b0d000c030b0b206c205b6a212e2053202d6a21024100216b410021040340202e2004460d052013200229030022325a210920122002200b6a290300221f5121142012201f5a212d2002200c6a2102200420396a210420322113201f21122009202d20141b0d000b200420396a216d206c20046b20566a222f0d030c020b4100212f0b206c202f490d06206c20184b0d080240206c202f6b226d2039762209450d002051202d6a21022016202f200d6c6a21040340200341b8016a200a6a22142004200a6a222d290300370300200341b8016a20076a222e200420076a2230290300370300200341b8016a20066a2231200420066a2235290300370300200341b8016a20086a2236200420086a226e290300370300200341b8016a200b6a226f2004200b6a2270290300370300200320042903003703b8012002200b6a22712903002112200220086a22722903002113200220066a2273290300211f200220076a2274290300213220022903002133202d2002200a6a2275290300370300203020323703002035201f370300206e20133703002070201237030020042033370300207520142903003703002074202e29030037030020732031290300370300207220362903003703002071206f290300370300200220032903b8013703002004200d6a21042002200c6a2102200920566a22090d000b0b202f0d010b202f216b2069206a460d0f0c100b206d20604b0d01206c20184b0d052052202f200d6c6a2176410021770c100b206c216d2069206a460d090c0a0b202f216b2069206a470d0b0c0a0b202641081020000b203c2018102a000b202f206c102a000b206c202f417f6a226b490d0d0b206c2018102b000b410021020c0a0b410121020c090b410021020c070b410121020c060b410221020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2069206a470d10410121020c140b206920396a22022069490d1620692039742204200220022004491b2202ad2023862212200f88a70d162012a722042054480d16024002402069450d00206820692057742004101e22680d010c030b2004101f2268450d020b20022169410221020c130b2068206a2057746a2202206d3602042002206b360200206a20396a2278216a20782058490d02410121770c110b200441041020000b0240024020770e020001010b206c202f20566a226b490d130240206c206b6b226d2058490d002016202f200d6c6a22022903002016206b200d6c6a2204290300221f5a2002200b6a220929030022132004200b6a221429030022125a20132012511b0d00200420022903003703002014200929030037030020042903102113200420086a200220086a290300370300200341b8016a20066a222e2004200a6a2209290300370300200341b8016a20086a2230200420076a2214290300370300200341b8016a200b6a2231200420066a222d290300370300202d200220066a2903003703002014200220076a29030037030020092002200a6a290300370300200320133703b801410121090240206d2057490d002004290360201f5a200420616a290300221320125a20132012511b0d0041032109207621140240034020142202200c6a2002290300370300200220626a2002200a6a290300370300200220636a200220076a290300370300200220646a200220066a290300370300200220656a200220086a2903003703002002205a6a2002200b6a2903003703002009222d206d4f0d01202d20396a21092002200d6a2214290300201f5a200220666a290300221320125a20132012511b450d000b0b202d20566a21090b2002201f3703002002201237030820042009200d6c6a2202200a6a202e290300370300200220076a2030290300370300200220066a2031290300370300200220032903b8013703100b206b450d0c2076200c6a2176206b212f206d2067490d0a410021020c110b024002400240024020682078223120566a22782057746a2202280200450d00206820312057746a222d205c6a2802002214200228020422044d0d004102216a203141024d0d042068203120596a22022057746a2802042209200420146a4d0d014103216a203141034d0d04202d205d6a280200200920146a4d0d010c050b20312057490d01200228020421042068203120596a22022057746a28020421090b20092004490d010b2031205b6a21020b2031200220396a22704d0d03203120024d0d04206820022057746a2236280204227120362802006a2202206820702057746a226e280200226f490d05200220184b0d06203620556a21722016206f200d6c6a2230206e2802042235200d6c22046a216a2002200d6c2109024002400240024002402002206f6b222d20356b220220354f0d00204f206a2002200d6c220410ce031a205020046a211420352039480d0120022039480d01205120096a2109206a2102034020092002200c6a226a2014200c6a222d202d290300206a290300542014205a6a29030022122002205a6a29030022135420122013511b222e1b22042903003703002009200a6a2004200a6a290300370300200920076a200420076a290300370300200920066a200420066a290300370300200920086a200420086a2903003703002009200b6a2004200b6a2903003703002014202d202e1b21142030206a2002202e1b22024f0d042009200c6a21092050210420502014490d000c050b0b204f2030200410ce031a205020046a211420352039480d01202d20354c0d01201620096a212e205021042030210203402002206a2004206a290300200429030054206a200b6a29030022122004200b6a29030022135420122013511b222d1b22092903003703002002200a6a2009200a6a290300370300200220076a200920076a290300370300200220066a200920066a290300370300200220086a200920086a2903003703002002200b6a2009200b6a29030037030020042004200d6a202d1b21042002200d6a2102206a200d6a206a202d1b226a202e4f0d04201420044b0d000c040b0b206a21020c010b203021020b205021040b20022004201420046b22092009200d706b10ce031a2072207120356a3602002036206f360200206e206e200b6a207020567320316a20577410cf031a2078216a207820394b0d0a0b206b0d060c010b2031216a206b0d060b02402069450d002068101d0b204e450d11204f101d0c110b4188bfc30020702031104b000b4188bfc30020022031104b000b206f2002102a000b20022018102b000b410221020c090b410221020c080b410021770c030b410121770c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102a000b1021000b200320183602c001200320173602bc01200320163602b801200341e8026a41086a22024200370300200342003703e80241c2fdc0004113200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001200341103602ec02200320034190016a3602e802200341b8016a200341e8026a10850202402017450d002016101d0b0240201a450d00201c101d0b02402015450d002019101d0b410021040240201ea7450d00201b101d0b0b410121054101210b0b200128020022024102460d050c060b201d450d00200e101d0b200320213602c001200320223602bc01200320203602b801200341e8026a41086a22024200370300200342003703e80241dfd9c0004115200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001200341103602bc03200320034190016a3602b803200341b8016a200341b8036a1087022022450d002020101d0b410021040b410121050b4101210b200128020022024102470d010b2005450d01200141086a280200450d012001280204101d0c010b20024101470d00200b450d00200141086a280200450d002001280204101d0b2000200936020420002004360200200341e0036a24000bdf1505067f017e047f017e047f230041d0006b22042400200441c0006a41086a220542003703002004420037034041d5fdc0004112200441c0006a1001200441306a41086a200529030037030020042004290340370330410021060240024002400240024002400240200441306a411041f8b3c200410041001002417f460d00200442103702442004200441306a360240200441106a200441c0006a105e20042802102207450d02200441186a2802002106200428021421080c010b41012107410021080b200441c0006a41086a220542003703002004420037034041c6fcc0004114200441c0006a1001200441106a41086a2005290300370300200420042903403703100240200441106a411041f8b3c200410041001002417f460d00419d87c1002105412e21062008450d040c030b200542003703002004420037034041fdfdc0004111200441c0006a1001200441306a41086a200529030037030020042004290340370330024002400240200441306a411041f8b3c200410041001002417f460d0020044100360210200441306a4110200441106a41044100100241016a41044d0d0220042802102003470d010c040b41002003460d030b41cb87c10021054114210620080d030c040b41df88c0004133103a000b41df88c0004133103a000b024002402006450d002006200241086a28020022094f0d0141a088c100210541c500210620080d020c030b41df87c100210541c100210620080d010c020b02400240024002400240024002400240024002400240024002404114101f2205450d00200541106a41002800b58041360000200541086a41002900ad8041370000200541002900a58041370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a2900003700004200210a200441c0006a41086a220642003703002004420037034020054134200441c0006a1001200441106a41086a200629030037030020042004290340370310200441106a411041f8b3c20041004100100221062005101d2006417f470d05200441c0006a41086a2205420037030020044200370340418582c1004112200441c0006a1001200441306a41086a20052903003703002004200429034037033002400240200441306a411041f8b3c200410041001002417f460d002004420037031820044200370310200441306a4110200441106a4110410010022205417f460d042005410f4d0d04200441186a290300210f2004290310210a0c010b4200210f0b200441086a2001200a200f10cc01024020042802082205450d00200428020c210620080d0e0c0f0b200441c0006a41086a2205420037030020044200370340418afdc000410e200441c0006a1001200441306a41086a20052903003703002004200429034037033041002105024002400240200441306a411041f8b3c200410041001002417f460d00200442103702442004200441306a360240200441106a200441c0006a105e20042802102210450d06200441106a41086a2206280200210e20042802142105200441106a41186a200141186a290000370300200441106a41106a200141106a2900003703002006200141086a29000037030020042001290000370310200441106a210620052111200e2005460d010c020b200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a2900003703002004200129000037031041012110200441106a21060b200541016a220e2005490d092005410174220d200e200e200d491b2211ad420586220a422088a70d09200aa7220d4100480d0902402005450d002005210e20102005410574200d101e22100d010c060b2005210e200d101f2210450d050b2010200e410574220d6a22052006290000370000200541186a200641186a290000370000200541106a200641106a290000370000200541086a200641086a290000370000200441c0006a41086a2205420037030020044200370340418afdc000410e200441c0006a1001200441306a41086a20052903003703002004200429034037033020044100360218200442013703102004200e41016a2205360240200441c0006a200441106a10620240024002402005450d00200d41206a210b4100200441106a41086a28020022066b210d200428021021122004280214210c2010210503400240200c200d6a411f4b0d00200641206a220e2006490d0d200c4101742213200e200e2013491b220e4100480d0d02400240200c450d002012200c200e101e22120d010c060b200e101f2212450d050b200e210c0b201220066a220e2005290000370000200e41186a200541186a290000370000200e41106a200541106a290000370000200e41086a200541086a290000370000200d41606a210d200641206a2106200541206a2105200b41606a220b0d000b200441186a20063602002004200c360214200420123602100c010b200441106a41086a28020021062004280214210c200428021021120b200441306a41102012200610030240200c450d002012101d0b2011450d062010101d411421064114101f22050d070c080b200e41011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b200d41011020000b411421064114101f2205450d010b200541106a41002800b58041360000200541086a41002900ad8041370000200541002900a58041370000200520064134101e2205450d03200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441c0006a41086a220642003703002004420037034020054134200441c0006a1001200441306a41086a20062903003703002004200429034037033020042003360210200441306a4110200441106a410410032005101d2002280204210b2002280200210c4113101f2202450d042002410f6a41002800998741360000200241086a410029009287413700002002410029008a8741370000200241134133101e220d450d05200d2001290000370013200d412b6a200141186a290000370000200d41236a200141106a290000370000200d411b6a200141086a290000370000200441c0006a41086a2202420037030020044200370340200d4133200441c0006a1001200441306a41086a200229030037030020042004290340370330200441003602182004420137031020042009360240200441c0006a200441106a1062024002402009450d00200441186a220e280200210220042802142105200c21060340024002400240024020022005470d00200541016a22012005490d0820054101742203200120012003491b22034100480d082005450d01200428021020052003101e22010d020c090b200428021021010c020b2003101f2201450d070b2004200336021420042001360210200321050b200e200241016a2203360200200120026a20062d00003a000020032102200641016a21062009417f6a22090d000c020b0b200441186a280200210320042802142105200428021021010b200441306a411020012003100302402005450d002001101d0b200d101d0240200b450d00200c101d0b4100210502402008450d002007101d0b0c080b200641011020000b1021000b200341011020000b413441011020000b411341011020000b413341011020000b2007101d0b200241046a280200450d002002280200101d0b2000200636020420002005360200200441d0006a24000bef0703057f037e037f230041306b22032400024002400240024002402002280208220420014d0d0020022802002105200241086a2004417f6a2206360200200520064105746a22072900002108200729000821092007290010210a200520014105746a220141186a200741186a2900003700002001200a37001020012009370008200120083700002002280204210b200341106a41086a2202420037030020034200370310418afdc000410e200341106a1001200341206a41086a20022903003703002003200329031037032020034100360218200342013703102003200636020c2003410c6a200341106a106202400240024002402006450d00200441057441606a2104200228020021062003280210210c200328021421012005210203400240024002400240200120066b41204f0d00200641206a22072006490d072001410174220d20072007200d491b220d4100480d072001450d01200c2001200d101e220c0d020c080b200641206a21070c020b200d101f220c450d060b200d21010b200c20066a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020072106200241206a2102200441606a22040d000b200341186a2007360200200320013602142003200c3602100c010b20022802002107200328021421012003280210210c0b200341206a4110200c2007100302402001450d00200c101d0b0240200b450d002005101d0b4113101f2202450d032002410f6a41002800998741360000200241086a410029009287413700002002410029008a8741370000200241134133101e2202450d04200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a290000370000200341106a41086a220642003703002003420037031020024133200341106a1001200341206a41086a200629030037030020032003290310370320200341206a411010092002101d4114101f2202450d05200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d06200220002900003700142002412c6a200041186a290000370000200241246a200041106a2900003700002002411c6a200041086a290000370000200341106a41086a220642003703002003420037031020024134200341106a1001200341206a41086a200629030037030020032003290310370320200341206a411010092002101d200341306a24000f0b1021000b200d41011020000b4198a9c30020012004104b000b411341011020000b413341011020000b411441011020000b413441011020000bcc0201027f230041306b220224000240024002404113101f2203450d002003410f6a41002800998741360000200341086a410029009287413700002003410029008a8741370000200341134133101e2203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41086a220142003703002002420037032020034133200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a10920220022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b411341011020000b413341011020000b41df88c0004133103a000bf602010a7f230041106b220224002002200110d501024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d012003101f2204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001002210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009101e22040d010c080b2009101f2204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d002004101d0b200241106a24000f0b1021000b200941011020000b102e000b200341011020000bcc0403037f017e047f23004180026b220424000240024020012d000d450d0041b489c1002102413121050c010b2001280200200141046a2205280200200141086a220628020010940220054200370200200141f0c0c100360200200420022900002207370310024002400240024041e401101f2208450d00200841003b010620084100360200200841086a200441206a41dc0110ce031a200541003602002001200836020020082f01062209410374210a417f210541002102024002400240024002400340200a2002460d01200441106a200820026a41086a410810d003220b450d03200241086a2102200541016a2105200b41004e0d000c020b0b200921050b20042007370234200420063602302004200536022c2004200136022820042008360224200441003602202004410036021820044201370310200328020021082004200328020422023602002004200441106a106202402004280214220b200428021822056b20024f0d00200520026a220a2005490d05200b4101742203200a200a2003491b220a4100480d05200b450d022004280210200b200a101e220b450d030c060b2004280210210b0c060b418789c1002102412d21050c060b200a101f220b0d030b200a41011020000b41e40141041020000b1021000b2004200a3602142004200b3602100b200441106a41086a220a200520026a360200200b20056a2008200210ce031a200441086a200a28020036020020042004290310370300200441206a200410950220014180023b010c410021020b200020053602042000200236020020044180026a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b2000101d2005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b2001101d2005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d002004101d0b20020d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021042001101d2004450d00024020042802002201450d0003402004101d2001210420012802002200210120000d000b0b2004101d0b0bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b41037410cf031a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c10cf031a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e401101f220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc0110ce032107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a220141037410ce032107200a41e0006a200041b4016a2001410c6c10ce03210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b41037410cf031a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c10cf031a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b41037410cf031a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c10cf031a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d02419402101f2207450d03200741003b010620074100360200200741086a200241d0006a418c0210ce032103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a220041037410ce032116200741e0006a200941b4016a2000410c6c10ce032117200741e4016a20094180026a2001417a6a220e41027410ce032118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b221341037410cf031a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c10cf031a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b41027410cf031a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b41037410cf031a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c10cf031a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b41027410cf031a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b419402101f2200450d03200041003b010620004100360200200041086a200241d0006a418c0210ce0321012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b220741037410cf031a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c10cf031a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b41027410cf031a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b41940241041020000b41e40141041020000b41940241041020000b200241e0026a24000bae0901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a200210620240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d01200228020020032006101e2203450d020c030b200441046a2105200228020021030c030b2006101f22030d010b200641011020000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a200210620240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d01200228020020032007101e2204450d020c030b2006410e6a2105200228020021040c030b2007101f22040d010b200741011020000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a41002900848c42370000200641002900fe8b423700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d00200420032006101e2204450d010c020b2006101f22040d010b200641011020000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d00200420032006101e2204450d010c020b2006101f22040d010b200641011020000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41393600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d01200228020020052003101e2205450d020c030b200228020021050c030b2003101f22050d010b200341011020000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41393600002002410836020c2002410c6a2002106220082802002106418c8cc20021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009101e22030d020c060b200641086a2104200228020021030c020b2009101f2203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006101e22030d010c060b2006101f2203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a220741ec8cc200470d000b200241106a24002006ad4220862003ad840f0b1021000b200941011020000b200641011020000bff1b05027f017e087f017e027f23004180096b22022400024002402001450d00200220003602180c010b200241f8b3c2003602180b2002200136021c20024198076a200241186a109802024002400240024002400240024020022802a007450d00200241206a20024198076a41880110ce031a200241a8016a200241206a41880110ce031a20022903a801200241bc016a2201200241fc016a220310d201200241086a419090c1004115108f01024020022802084101470d002002290310210420024198076a41086a22004200370300200242003703980741a590c100411720024198076a1001200241a8036a41086a2205200029030037030020022002290398073703a803200241a8036a411041f8b3c200410041001002417f470d0020004200370300200242003703980741a590c100411720024198076a10012005200029030037030020022002290398073703a8032002200437039807200241a8036a411020024198076a410810030b024002400240024020022903a8012204500d0020024198076a2004427f7c10af0120024198076a2001412010d0030d004100210620022802a0022100024002400240200241a8026a280200220141e8016c41e801490d002001410c6c2205101f2207450d0b2001210820010d010c020b41042107410021082001450d010b200141e8016c2105200141037441786a2109200721010340200220003602a80320024198076a200241a8036a109902200141086a20024198076a41086a28020036020020012002290398073702002001410c6a2101200041e8016a2100200541987e6a22050d000b200941037641016a21060b4104210a410021054100210b02402006410c6c2201410c490d002001410c6e220b41037422004100480d0a2000101f220a450d0b0b0240200720016a220c2007460d0041002105200a210120072100034020002802002109200141046a200041086a28020036020020012009360200200141086a2101200541016a21052000410c6a2200200c470d000b0b20024198076a200a2005109a020240200b450d00200a101d0b02402006450d002006410c6c21002007210103400240200141046a280200450d002001280200101d0b2001410c6a2101200041746a22000d000b0b02402008450d002007101d0b0240200320024198076a412010d003450d004189aec200410e100a20034120101220024198076a412010120b200320024198076a412010d0030d05200241a4026a2802002106200241a8016a41f8006a2802002107200241a8026a2802002105200241b0026a200241a8016a41f80010ce031a2007200541e8016c6a210020022903b002210d20072101024002400240024002402005450d00200241a8036a41f8006a210920024198076a41086a210c200721010340200241a8066a200141f00010ce031a200141f0006a2903002104200241b8056a200141f8006a41f00010ce031a20044203510d02200241a8036a200241a8066a41f00010ce031a200241a8036a41f0006a20043703002009200241b8056a41f00010ce031a2002200241a8036a3602900520024198076a20024190056a109902200c28020021050240200228029c07450d00200228029807101d0b20024198076a200241a8036a41e80110ce031a200241003602a00520024190056a20024198076a2005200241a0056a1086012002280290054101460d0502402002280294052205450d00200520024190056a41086a280200100a0b200141e8016a22012000470d000b200021010b20012000470d010c020b200141e8016a22012000460d010b200241a0086a210520024198076a41f8006a2109034020024198076a200141f00010ce031a200141f0006a2903002104200241a8036a200141f8006a41f00010ce031a20044203510d01200241a8066a20024198076a41f00010ce031a200241b8056a200241a8036a41f00010ce031a20024198076a200241a8066a41f00010ce031a20024198076a41f0006a20043703002009200241b8056a41f00010ce031a2005103c200141e8016a22012000470d000b0b02402006450d002007101d0b10da01200d108d0120024198076a10dd012002200241b0026a41106a280200220a3602b00520022802b802210b200220024198076a41106a28020022013602b405200a2001470d0720022802a007210302400240200a450d0041002106034002400240200b200641286c22006a22012d00002205200320006a22002d0000470d0002400240024020054101460d0020054102470d0120012802082209200041086a280200470d03200141186a210c2009450d02200c290300200041186a290300520d032001290320200041206a290300520d03200141146a280200220e200041146a280200470d032001410c6a28020022092000410c6a280200220c460d04417f21070340200741016a2207200e4f0d052009200c412010d0030d04200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000c040b0b2001410c6a28020022082000410c6a280200470d022008450d03200141046a2802002209200041046a280200220c460d034100210703402009200c412010d0030d03200941206a2109200c41206a210c200741016a22072008490d000c040b0b20002001460d02200141016a200041016a412010d0030d010c020b200c290300200041186a290300520d00200141146a280200220e200041146a280200470d002001410c6a28020022092000410c6a280200220c460d01417f21070340200741016a2207200e4f0d022009200c412010d0030d01200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000b0b41c38dc2004114100a200241a8036a200110d40120022802a8032209200241a8036a41086a22052802001012024020022802ac03450d002009101d0b200241a8036a200010d40120022802a803220920052802001012024020022802ac03450d002009101d0b20012d000020002d00002205470d030b024002400240024020054101460d0020054102470d0120012802082205200041086a280200470d06200141186a21092005450d022009290300200041186a290300520d062001290320200041206a290300520d06200141146a2802002207200041146a280200470d062001410c6a28020022012000410c6a2802002200460d03417f21050340200541016a220520074f0d0420012000412010d0030d07200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c070b0b2001410c6a28020022092000410c6a280200470d052009450d02200141046a2802002201200041046a2802002200460d0241002105034020012000412010d0030d06200141206a2101200041206a2100200541016a22052009490d000c030b0b20002001460d01200141016a200041016a412010d003450d010c040b2009290300200041186a290300520d03200141146a2802002207200041146a280200470d032001410c6a28020022012000410c6a2802002200460d00417f21050340200541016a220520074f0d0120012000412010d0030d04200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c040b0b200641016a2206200a490d000b0b200241a8036a41186a22014200370300200241a8036a41106a22004200370300200241a8036a41086a22054200370300200242003703a803200241a8036a100d200241a8066a41186a2001290300370300200241a8066a41106a2000290300370300200241a8066a41086a2005290300370300200220022903a8033703a8060240200241e4026a2201200241a8066a412010d003450d004189aec200410e100a200141201012200241a8066a412010120b2001200241a8066a412010d0030d090240200a450d00200a41286c2100200321010340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b0240200241a4076a280200450d002003101d0b0240200241b0026a41106a2802002200450d00200241b0026a41086a2802002101200041286c21000340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b0240200241bc026a280200450d00200241b8026a280200101d0b20024180096a240042010f0b41e8d7c200102c000b2002280294052202450d0120024103460d0220024104460d0341b8d7c200102c000b41c0d6c200102c000b4188d7c200102c000b41f0d6c200102c000b41a0d7c200102c000b200241bc036a4101360200200241183602ac01200241d0a9c3003602a801200242013702ac03200241d8a9c3003602a8032002200241a8016a3602b803200241a8036a41e0a9c30010cf01000b41d8d6c200102c000b2002200241b0056a3602a0052002200241b4056a36029005200241a8036a41146a4100360200200241a8066a41146a411c360200200241b4066a4120360200200241b8056a41146a4103360200200241f8b3c2003602b803200242013702ac03200241d0d7c2003602a803200241203602ac06200242033702bc05200241e0b0c4003602b8052002200241a8036a3602b806200220024190056a3602b0062002200241a0056a3602a8062002200241a8066a3602c805200241b8056a41d8d7c20010cf01000b4180d8c200102c000b200541041020000b1021000b200041041020000bfb0609047f017e017f017e037f017e047f017e017f230041a0066b22022400200241d8026a20011059200241e8026a280200210320022802e402210420022802e002210520022903d8022106200241b0056a200241ec026a41e40010ce031a024002400240024002400240024002400240024002402005450d00200241106a200241b0056a41e40010ce031a200241086a200110b5012002280208450d08200228020c2207ad42e8017e2208422088a70d032008a72209417f4c0d032009450d012009101f220a450d042007450d020c050b20004100360208200241a0066a24000f0b4108210a20070d030b4100210f4200210c200a450d050c030b102e000b200941081020000b200241d8026a41f8006a210b4200210c4100210d410021094100210e2007210f0340200241d8026a200110b401200241b0056a200241d8026a41f00010ce031a200241d8026a41f0006a2903002108200241c0046a200b41f00010ce031a20084203510d02200e41016a2110200241e8016a200241b0056a41f00010ce031a200241f8006a200241c0046a41f00010ce031a0240200e200f470d00200d20102010200d491b220fad42e8017e2211422088a70d052011a722124100480d050240200e450d00200a20092012101e220a0d010c070b2012101f220a450d060b200a20096a200241e8016a41f00010ce03220e41f0006a2008370300200e41f8006a200241f8006a41f00010ce031a200c4280808080107c210c200d41026a210d200941e8016a21092010210e20102007490d000b200a450d020b200241d8026a200241106a41e40010ce031a200041106a20033602002000200436020c2000200536020820002006370300200041146a200241d8026a41e40010ce031a200041fc006a200c200fad84370200200041f8006a200a360200200241a0066a24000f0b0240200e450d00200a4188016a211003402010103c201041e8016a2110200941987e6a22090d000b0b200f450d00200a101d0b2000410036020802402003450d00200341286c2110200521090340024020092d0000220e450d000240200e4101470d00200941086a280200450d01200941046a280200101d200941286a2109201041586a22100d020c030b200941106a280200450d002009410c6a280200101d0b200941286a2109201041586a22100d000b0b02402004450d002005101d0b200241a0066a24000f0b1021000b201241081020000b8a1203047f027e097f230041206b22022400024002400240024002400240024002400240024002400240024041ea01101f2203450d00200242ea0137020420022003360200200341003b00002002410236020802400240024002400240200128020022032903704202520d0020022802044102470d01200228020041024104101e2201450d062002410436020420022001360200200241086a28020021040c020b20022802044102470d02200228020041024104101e2201450d062002410436020420022001360200200241086a28020021040c030b41022104200228020021010b200120046a41013a0000200241086a2201200128020041016a3602000c070b41022104200228020021010b200120046a4181013a0000200241086a2201200128020041016a360200200341086a200210bc0202400240024020022802042204200128020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d01200228020020042001101e2204450d020c060b200228020021040c060b2001101f22040d040b200141011020000b41ea0141011020000b410441011020000b410441011020000b2002200136020420022004360200200241086a28020021010b200241086a2205200141c0006a360200200420016a220141086a200341346a290000370000200141106a2003413c6a290000370000200141186a200341c4006a290000370000200141206a200341cc006a290000370000200141286a200341d4006a290000370000200141306a200341dc006a290000370000200141386a200341e4006a2900003700002001200329002c3700002003200210b10102400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782206420c882207420120074201561b22074200510d0620034180016a290300200780210720022802042204200241086a28020022016b41024f0d01200141026a22052001490d0c20044101742201200520052001491b22014100480d0c2004450d04200228020020042001101e2204450d050c090b0240200228020420052802002201470d00200141016a22042001490d0c20014101742205200420042005491b22054100480d0c2001450d02200228020020012005101e2204450d030c070b200228020021040c070b200228020021040c080b2005101f22040d040b200541011020000b2001101f22040d040b200141011020000b41a88ec300102c000b2002200536020420022004360200200241086a28020021010b200241086a200141016a360200200420016a41003a00000c020b2002200136020420022004360200200241086a28020021010b200241086a200141026a360200200420016a2007a741047420067aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b20034188016a200210b201200241086a22032802002101200241003602182002420137031020022001417e6a36021c2002411c6a200241106a1062024002400240024002402003280200220141014d0d002002280218210520022802102108200228021421092003410036020020022802002103024002400240024002400240024002402001417e6a220a450d004102210b2005450d12200320082d00003a00004101210c200241086a2204200428020041016a36020020054101460d12200820056a210d200320082d00013a00012004200428020041016a3602004102210b200841026a21044100210e2005417e6a2203450d052002280204220b20016b20034f0d01200120036a220c2001490d0d200b4101742201200c200c2001491b220c4100480d0d200b450d022002280200200b200c101e22010d030c0a0b0240024002402002280204220120054f0d0020014101742204200520052004491b22044100480d0f2001450d01200320012004101e2203450d020c110b4100210b2005450d120c110b2004101f22030d0f0b200441011020000b200228020021010c020b200c101f2201450d070b2002200c360204200220013602000b200120056a200141026a200a10cf031a02402005200241086a220b280200220c460d002002280200200c6a210120052103034020034102460d03200120042d00003a0000200b200b28020041016a360200200141016a2101200441016a2104200c2003417f6a2203470d000b200d20046b2203450d030b20034100480d082003101f220c450d042005210b2003210e0b200d2004460d060c050b2005210b200a0d0b0c0c0b4101210c2005210b200d2004470d030c040b41b0aec400102c000b200341011020000b200c41011020000b200c20042d00003a00004101210f0240200441016a2203200d460d00200c41016a2101200520046b21040340200120032d00003a0000200141016a2101200d200341016a2203470d000b200820046a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22016b200f4f0d002001200f6a22042001490d0520034101742201200420042001491b22014100480d052003450d01200228020020032001101e22030d020c060b200228020021030c020b2001101f2203450d040b20022001360204200220033602000b2003200f200b6a22106a2003200b6a200a10cf031a02402010200241086a22042802002203460d00200228020020036a2101200f200b6a20036b2105200c21030340200d2003460d01200120032d00003a00002004200428020041016a360200200341016a2103200141016a21012005417f6a22050d000b0b2010210b0b0240200e450d00200c101d0b200a450d060c050b1021000b200141011020000b2002200436020420022003360200200241086a280200210b0b2003200b6a220120082d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2104200841016a2103200141016a21010340200120032d00003a0000200141016a2101200341016a21032004417f6a22040d000b200b20056a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22012802002203460d002002280200220420036a2004200b6a200a10cf031a0b20012003200a6a3602000b02402009450d002008101d0b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204101f22050d01200441041020000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d101e220a0d020c080b200820046a21070c020b200d101f220a450d060b200d210b0b200a20046a200c200810ce031a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031017200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a101d0b02402002450d002005101d0b200341206a24000f0b1021000b200d41011020000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10c1032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001108b02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b2004418001102a000b2004418001102a000bb50403017f017e017f230041a0026b22022400024002402001450d00200220003602180c010b200241f8b3c2003602180b2002200136021c20024198016a200241186a1059024020022802a001450d00200241206a20024198016a41f80010ce031a2002290320200241346a200241f4006a10d201200241086a419090c1004115108f01024020022802084101470d002002290310210320024198016a41086a22014200370300200242003703980141a590c100411720024198016a100120024190026a41086a2200200129030037030020022002290398013703900220024190026a411041f8b3c200410041001002417f470d0020014200370300200242003703980141a590c100411720024198016a100120002001290300370300200220022903980137039002200220033703980120024190026a411020024198016a410810030b0240200241206a41106a2802002200450d0020022802282101200041286c21000340024020012d00002204450d00024020044101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402002412c6a280200450d00200241286a280200101d0b200241a0026a240042010f0b200241346a41013602002002411836029402200241f0a9c3003602900220024201370224200241d8a9c300360220200220024190026a360230200241206a41e0a9c30010cf01000b0600109f02000b0a00418ca4c400102c000bdc0d01087f230041206b220224002002410036021820024201370310024002400240024002400240024002404104101f2203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d01200228021020032004101e2205450d020c040b200228021021050c040b2004101f22050d020b200441011020000b410441011020000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41033a00004111200241106a10a10241002103024003402003418c83c4006a2802002003419083c4006a280200200241106a10a202024002400240024002400240024002400240024002400240024002400240024002402003419483c4006a2802004101470d002003419883c4006a2802002003419c83c4006a280200200241106a10a202200341a083c4006a22062802004102460d010c020b20022003419883c4006a28020011040020022802002002280204200241106a10a202200341a083c4006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007101e22060d020c040b200228021021060c020b2007101f2206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341b083c4006a22062802004102470d020c030b200741011020000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008101e22070d020c0d0b200228021021070c020b2008101f2207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a302200341b083c4006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008101e22070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007101e22060d050c0a0b200228021021060c050b2008101f2207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a402200341c083c4006a22062802004102460d030c080b2007101f2206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c083c4006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007101e22060d020c070b200228021021060c020b2007101f2206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341c809470d050c060b200841011020000b200841011020000b200741011020000b200741011020000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008101e22070d020c070b200228021021070c020b2008101f2207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a502200341c8006a220341c809470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a106202400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d01200228021020052008101e2205450d020c050b2002280210220520046a2006200310ce031a200420036a21032007450d060c050b2008101f22050d030b200841011020000b1021000b200841011020000b2002200836021420022005360210200520046a2006200310ce031a200420036a21032007450d010b2006101d0b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d05200128020020022004101e2203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d08200128020020032002101e2203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002101e22030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004101e22030d0a0c0e0b2004101f22030d110b200441011020000b200128020021030c050b200128020021030c070b2002101f22030d0b0b200241011020000b2002101f2203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b2004101f2203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002101e22030d020c070b200128020021030c020b2002101f2203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b1021000b200241011020000b200441011020000b200241011020000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d05200228020020032005101e2204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d08200228020020042003101e2204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003101e22040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005101e22040d0a0c0d0b2005101f22040d100b200541011020000b200228020021040c050b200228020021040c070b2003101f22040d0a0b200341011020000b2003101f2204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b2005101f2204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003101e22040d020c060b200228020021040c020b2003101f2204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b200341011020000b200541011020000b200341011020000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d01200228020020042003101e2204450d020c040b200228020021040c040b2003101f22040d020b200341011020000b1021000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a2000200110ce031a0bff0901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d01200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110a202200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a101e22070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a101e22070d060c0e0b200128020021070c030b200128020021070c050b200a101f2207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a101f2207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110ba0302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110a2020c010b200241106a200041c4006a280200200041c8006a28020028020c11030020022802102209200241106a41086a280200200110a2022002280214450d002009101d0b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110b8032004200541e4006a2205470d010c030b2009200041d8006a280200200110b8032004200541e4006a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d00200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110a202200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a101e22070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a101e22070d060c0f0b200128020021070c030b200128020021070c050b200a101f2207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a101f2207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110ba0302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110a2020c010b200241106a200041c4006a280200200041c8006a28020028020c11030020022802102209200241106a41086a280200200110a2022002280214450d002009101d0b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110b8032004200541e4006a2205470d010c020b2009200041d8006a280200200110b8032004200541e4006a2205470d000b0b200241206a24000f0b1021000b200a41011020000b200a41011020000b200a41011020000b200a41011020000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a2022000410c6a200110b903200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c030b2006200041246a280200200110b80320042005412c6a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a2022000410c6a200110b903200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c020b2006200041246a280200200110b80320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a202200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110b8030c010b2006200041146a280200200110b8030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c030b2006200041246a280200200110b80320042005412c6a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a202200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110b8030c010b2006200041146a280200200110b8030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c020b2006200041246a280200200110b80320042005412c6a2205470d000b0b200241106a24000be10301017f230041f0056b22022400024002402001450d00200220003602000c010b200241f8b3c2003602000b20022001360204200241f8036a200210b40102400240024002400240024020022903e8044203510d00200241086a200241f8036a41e80110ce031a200241f0016a200241086a41e80110ce031a2002200241f0016a3602f803200241d8036a200241f8036a10990220022802e0032101200241f8036a200241f0016a41e80110ce031a200241e8056a20022802e003360200200220022903d8033703e005200241e8036a200241f8036a2001200241e0056a1086010240024020022802e8034101470d004280828898f01f20022802ec03410374ad88a721004101101f210141010d010c050b20022802ec0341004721004101101f21014100450d040b2001450d01200141013a0000200141014102101e2201450d020c040b20024184026a41013602002002411836020c200241f8a9c300360208200242013702f401200241d8a9c3003602f0012002200241086a36028002200241f0016a41e0a9c30010cf01000b410141011020000b410241011020000b2001450d01200141003a0000200141014102101e22010d00410241011020000b200120003a0001200241f0056a24002001ad428080808020840f0b410141011020000bb91203027f017e0b7f230041c0016b2202240010da01200241086a41086a2203420037030020024200370308418cb9c000410d200241086a100120024180016a41086a20032903003703002002200229030837038001420021040240024002400240024002400240024020024180016a411041f8b3c200410041001002417f460d002002420037030820024180016a4110200241086a41084100100241016a41084d0d01200229030821040b2004108d01200241b0016a41086a22034200370300200242003703b001419db4c0004115200241b0016a1001200241a0016a41086a2003290300370300200220022903b0013703a001200241a0016a411041f8b3c200410041001002417f460d01410021052002410036020841042106410121070240200241a0016a4110200241086a41044100100241016a41044d0d0020022802082208450d032008ad420c7e2204422088a70d042004a722034100480d0402402003101f2206450d00200621094100210a034002400240024002400240024002404114101f2203450d00200341106a41002800b4b640360000200341086a41002900acb640370000200341002900a4b640370000200341144128101e220b450d01200b200a360014200241b0016a41086a22034200370300200242003703b001200b4118200241b0016a1001200241086a41086a2003290300370300200220022903b001370308200241086a411041f8b3c200410041001002417f460d0520024210370284012002200241086a36028001200220024180016a10d50102402002280200450d0020022802042203417f4c0d03024002402003450d0020031079220c450d0620024180016a41086a22052005280200220520034100200228028001200228028401200c20032005100222052005417f461b2205200520034b1b22056a36020020052003470d010c070b4101210c2002280280012002280284014101410020024180016a41086a28020010021a41002003460d060b2003450d00200c101d0b41df88c0004133103a000b411441011020000b412841011020000b102e000b200341011020000b200241086a41101009200c0d010b4101210c410021030b200b101d200941086a2003360200200941046a20033602002009200c3602002009410c6a21092008200a41016a220a470d000b41002107200821050c040b200341041020000b41df88c0004133103a000b41df88c0004133103a000b4100210541012107410421060b410421084100210b4100210d02400240024002402005410c6c2203410c490d002003410c6e220d41037422094100480d042009101f2208450d010b0240200620036a220a2006460d004100210b200821032006210903402009280200210c200341046a200941086a2802003602002003200c360200200341086a2103200b41016a210b2009410c6a2209200a470d000b0b20024180016a2008200b109a020240200d450d002008101d0b02402005450d002005410c6c21092006210303400240200341046a280200450d002003280200101d0b2003410c6a2103200941746a22090d000b0b024020070d002006101d0b200241086a41186a20024180016a41186a290300370300200241086a41106a20024180016a41106a290300370300200241086a41086a20024180016a41086a2903003703002002200229038001370308200241b0016a41086a220b4200370300200242003703b0014199b9c0004115200241b0016a1001200241a0016a41086a200b290300370300200220022903b0013703a001200241a0016a4110200241086a41201003200241086a10dd01200241003602b801200242013703b00102404120101f2203450d00200242a080808080043702b401200220033602b0012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a200241b0016a10b10102400240024020022802b4012209200b280200220c6b41204f0d00200c41206a2203200c490d072009410174220b20032003200b491b220a4100480d072009450d0120022802b0012009200a101e220b450d020c050b200c41206a210320022802b001210b0c050b200a101f220b0d030b200a41011020000b412041011020000b200941041020000b2002200a3602b4012002200b3602b001200a21090b200241b0016a41086a220a2003360200200b200c6a220c41086a200241c4006a290200370000200c41106a200241cc006a290200370000200c41186a200241d4006a290200370000200c200229023c3700000240200920036b411f4b0d00200341206a220c2003490d0120094101742208200c200c2008491b220c4100480d010240024002402009450d00200b2009200c101e220b450d010c020b200c101f220b0d010b200c41011020000b2002200c3602b4012002200b3602b0010b200a200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602800120024180016a200241b0016a10620240200f450d00200f41286c2106200241b0016a41086a2207280200210320022802b401210a200e210b034020024180016a200b10d40120022802800121080240024002400240200a20036b20024180016a41086a280200220c4f0d002003200c6a22092003490d06200a4101742205200920092005491b220d4100480d06200a450d0120022802b001200a200d101e22050d020c070b2003200c6a210920022802b00121050c020b200d101f2205450d050b2002200d3602b401200220053602b001200d210a0b20072009360200200520036a2008200c10ce031a0240200228028401450d002008101d0b200b41286a210b20092103200641586a22060d000b0240200f450d00200f41286c210b200e21030340024020032d0000220c450d000240200c4101470d00200341086a280200450d01200341046a280200101d200341286a2103200b41586a220b0d020c030b200341106a280200450d002003410c6a280200101d0b200341286a2103200b41586a220b0d000b0b200241146a280200450d040c030b200241b8016a280200210920022802b0012105200241146a2802000d020c030b1021000b200d41011020000b200e101d0b200241c0016a24002009ad4220862005ad840b9f0f03017f037e117f23004180026b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241306a200241086a10a9020240024002402002280230450d00200241106a41086a2201200241306a41086a220028020036020020022002290330370310200241206a41086a20012802003602002002200229031037032020024190016a200241206a10aa022002280290014101460d0120024190016a41086a22012903002103200142003703002002420037039001418390c100410d20024190016a100120002001290300370300200220022903900137033042002104024002400240200241306a411041f8b3c200410041001002417f460d002002420037039001200241306a411020024190016a41084100100241016a41084d0d0120022903900121040b20024190016a41086a22014200370300200242003703900141a590c100411720024190016a1001200241306a41086a2001290300370300200220022903900137033002400240200241306a411041f8b3c200410041001002417f460d002002420037039001200241306a411020024190016a41084100100241016a41084d0d03200229039001210541e801210141e801101f2206450d010c060b4203210541e801210141e801101f22060d050b200141081020000b41df88c0004133103a000b41df88c0004133103a000b200241a4016a4101360200200241183602840120024180aac300360280012002420137029401200241d8a9c30036029001200220024180016a3602a00120024190016a41e0a9c30010cf01000b41af92c100412820022802940120024190016a41086a280200108802000b200620024190016a41f00010ce03220742023703702007410036028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241306a41d00010ce031a2002280220220821092002280224220a210b41002101037e02400240024020010e020001010b200941086a210020092f0106220d4103742101417f210c02400240024003402001450d0141bd8ec0002000410810d003220e450d03200141786a2101200c41016a210c200041086a2100200e417f4a0d000b200b0d010c020b200d210c200b450d010b200b417f6a210b2009200c4102746a41e4016a2802002109410021010c030b4108210f41032110417f21114102211241e401211341d2d6c000211441782115410121160c010b2008200f6a210020082f0106220d20107421014100210c02400240024002400240024003402001450d0120142000200f10d003220e450d02200120156a2101200c20166a210c2000200f6a2100200e20114a0d000b200c20116a210d0b200a450d01200a20116a210a2008200d2012746a20136a2802002108410121010c060b200841e0006a200c410c6c6a2200450d002000280208210120002802002100200242003703900120024190016a20002001410820014108491b10ce031a200141074d0d01200229039001210320024190016a41086a22014200370300200242003703900141978bc000411520024190016a1001200241306a41086a200129030037030020022002290390013703304100210102400240200241306a411041f8b3c200410041001002417f460d0020024210370284012002200241306a3602800120024190016a20024180016a10a701200228029001220f450d0420024198016a2802002101200228029401210c0c010b4108210f4100210c0b4100210002402001417f6a220e20014b0d00200e20014f0d00200f200e4103746a2201450d00200129030020035221000b0240200c450d00200f101d0b024002402000450d00200741e80141d003101e2206450d05200641e8016a20024190016a41f00010ce031a200642023703d802200620033703f8022006410a3602f00220062002290380013703e002200641e8026a20024188016a29030037030020064180036a200241306a41d00010ce031a410221090c010b410121090b20022802202002280224200228022810940220024100360238200242013703302002200936029001200941e8016c211520024190016a200241306a10622002280234210e2002280238210120024190016a41086a21084100210f02400240034020022006200f6a3602800120024190016a20024180016a10990220022802900121110240024002400240200e20016b2008280200220c4f0d002001200c6a22002001490d05200e4101742214200020002014491b22164100480d05200e450d012002280230200e2016101e22140d020c060b2001200c6a2100200228023021140c020b2016101f2214450d040b20022016360234200220143602302016210e0b200241306a41086a2000360200201420016a2011200c10ce031a0240200228029401450d002011101d0b200021012015200f41e8016a220f470d000b200941e8016c210f410021010340200620016a4188016a103c200f200141e8016a2201470d000b2006101d20024180026a24002000ad4220862014ad840f0b1021000b201641011020000b41f48ec000412b41dad6c0004128108802000b41f48ec000412b41f4abc2004129108802000b41df88c0004133103a000b41d00341081020000b410121010c000b0b890a06027f017e097f017e077f017e23004190026b22022400200241086a200110b501024002402002280208450d000240024002400240024002400240024002400240024002400240024002400240200228020c2203ad2204421d88a70d002004420386a72205417f4c0d00024002402005450d002005101f2206450d032003450d010c040b4101210620030d030b410021054100210b2006450d100c030b102e000b200541011020000b200141046a210741002108410021094100210a2003210b034020024200370330200241306a2001280200220c20072802002205410820054108491b220d10ce031a20072005200d6b3602002001200c200d6a360200200541074d0d02200a41016a2105200229033021040240200a200b470d002008200520052008491b220bad420386220e422088a70d09200ea7220d4100480d090240200a450d0020062009200d101e22060d010c0b0b200d101f2206450d0a0b200620096a2004370000200841026a2108200941086a21092005210a20052003490d000b2006450d0d0b2005ad422086200bad84210e200241306a200110ab022002280230220f450d0120022802342110200241306a41086a2802002205200e422088a7470d0220024200370214200241f0c0c100360210200f2005410c6c6a210320054103742205450d03200620056a2111200241106a41086a2112200241c4006a2113200241c0006a2114200f21012006210b0340200122052003460d062005410c6a210120052802002215450d05200529020421042002200b2900002216370320024002402002280210220841f0c0c100460d00200228021421070c010b41e401101f2208450d0a41002107200841003b010620084100360200200841086a200241306a41dc0110ce031a20024100360214200220083602100b200b41086a210b02400340200841086a210a20082f0106220c410374210541002109024003402005450d01200241206a200a410810d003220d450d03200541786a2105200941016a2109200a41086a210a200d417f4a0d000b2009417f6a210c0b02402007450d002007417f6a21072008200c4102746a41e4016a28020021080c010b0b2013201637020020142012360200200241306a410c6a200c360200200241306a41086a200241106a36020020022008360234200241003602302002200437022420022015360220200241306a200241206a109502200b2011470d010c060b20082009410c6c6a220541e4006a220a2802002109200a2004370200200541e0006a220a2802002105200a201536020002402005450d002009450d002005101d0b200b2011470d000c050b0b200b450d0b0c0a0b200ea70d090c0a0b2000410036020002402005450d002005410c6c210a200f210503400240200541046a280200450d002005280200101d0b2005410c6a2105200a41746a220a0d000b0b02402010450d00200f101d0b200ea7450d0a2006101d20024190026a24000f0b200f21010b200ea7450d050c040b20032101200ea70d030c040b1021000b200d41011020000b41e40141041020000b2006101d0b024020012003460d00034020012802002205450d010240200141046a280200450d002005101d0b2001410c6a22012003470d000b0b02402010450d00200f101d0b200241306a41086a2205200241106a41086a28020036020020022002290310370330200041086a20052802003602002000200229033037020020024190026a24000f0b2006101d0b200041003602000b20024190026a24000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d0141d7acc2002006410810d0032208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b10ce031a200141074d0d01200041086a2002290308370300410021010c030b20004188adc200360204200041086a41283602000c010b200041dfacc200360204200041086a41293602000b410121010b20002001360200200241106a24000bdb0403027f017e0a7f230041106b22022400200241086a200110b5010240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d012005101f2206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210d4100210a0c020b200541041020000b4100210741002108410021092003210a03402002200110b50102400240024002402002280200450d0020022802042205417f4c0d08024002402005450d0020051079220b450d03200b2001280200200141046a220c280200220d2005200d2005491b220d10ce031a200c280200220e200d490d04200c200e200d6b36020020012001280200200d6a360200200d2005470d010c050b4101210b41002005460d040b2005450d00200b101d0b2000410036020002402009450d002006210503400240200541046a280200450d002005280200101d0b2005410c6a2105200841746a22080d000b0b0240200a450d002006101d0b200241106a24000f0b200541011020000b200d200e102a000b200941016a210d02402009200a470d002007200d200d2007491b220aad420c7e2204422088a70d032004a7220c4100480d0302402009450d0020062008200c101e22060d010c050b200c101f2206450d040b200620086a2209200b360200200941046a2005ad2204422086200484370200200741026a21072008410c6a2108200d2109200d2003490d000b0b2000200a36020420002006360200200041086a200d360200200241106a24000f0b1021000b200c41041020000b102e000be8391b0c7f017e067f017e0b7f017e027f027e017f017e027f037e027f017e017f027e067f017e017f017e027f037e1a7f027e0d7f027e057f230041d0026b22022400024002402001450d00200220003602100c010b200241f8b3c2003602100b20022001360214200241f0006a200241106a1098020240024002400240024020022802782203450d00200241f0016a2802002104200241ec016a280200210520024180016a2802002106200241fc006a280200210720022802e8012108200241186a200241106a10a9022002280218450d01200241306a41086a2201200241186a41086a220928020036020020022002290318370330200241c0006a41086a200128020036020020022002290330370340200241013b015c20024200370254200241f0c0c100360250200241d0006a41086a210a2004450d0241e801210b2008200441e8016c6a210c41f000210d4202210e4117210f41a590c10021104100211141f8b3c200211241102113417f2114427f2115410321164102211741e401211841ecabc2002119410c211a41e000211b4107211c418801211d419001211e410d211f200241d0006a410d6a212042f4d2b59bc7ae98b830212141dc01212220024184016a21234201212442818080801021254109212642898080809001212741782128418390c1002129423c212a428080808070212b4225212c2008212d4100212e0c030b2002412c6a41013602002002411836025420024188aac3003602502002420137021c200241d8a9c3003602182002200241d0006a360228200241186a41e0a9c30010cf01000b20024184016a41013602002002411836025420024188aac30036025020024201370274200241d8a9c3003602702002200241d0006a36028001200241f0006a41e0a9c30010cf01000b410021010c010b410221010b037e024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b200241f0006a41086a200a290300370300200220022903503703700c200b412f411e204e204f410c6c6a41a07f4622501b214341c58ec00041b9acc20020501b21500c010b02400240202e0e06000103040506060b202d200d6a290300200e520d11202d2802880122010d4a202d29039001212f200241f0006a41086a22304200370300200242003703702010200f200241f0006a1001200920302903003703002002200229037037031802400240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d08200229037021310c010b420321310b2015203120317c223220322031541b2231500d09200241c0006a2133200228024421340c1c0b2044280200224e20466a2100204e2f0106223820477421014100214f024003402001450d01204b2000204610d0032237450d132001204c6a2101204f204d6a214f200020466a2100203720484a0d000b204f20486a21380b02402045450d00204520486a2145204e20382049746a204a6a21444101212e0c130b412f214341c58ec00021500b2002204336026420022050360260200242efcc99e3a6ae99b830370318200241086a200241d0006a200241186a200241e0006a109302200228020822430d08200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c1d0b2052205a205820596a220120012058491b6a22012052490d4320522059742200200120012000491b2253ad205b862231205c88a70d432031a72201205d480d4302402052450d0020542052205e742001101e22540d0b0c050b2001101f2254450d044103212e0c130b20542052205e746a2057360200205220596a21522058450d1c0240205620432f01064f0d0020432056205f746a20606a2157205620596a21562058205a6a215820532052460d080c090b41012101024020432f01042200204328020022432f0106490d00410121010340200120596a210120432f01042200204328020022432f01064f0d000b0b20432000205f746a20606a215720432000205e746a20616a28020021434100215620012059460d1a205920016b2101034020432802e4012143200120596a22010d000c1b0b0b20622069206720686a220120012067491b6a22012062490d4120622068742200200120012000491b2263ad206a862231206b88a70d412031a72201206c480d4102402062450d0020642062206d742001101e22640d0c0c040b2001101f2264450d034105212e0c150b20642062206d746a2066360200206220686a216202402067450d000240206520502f01064f0d0020502065206e6c6a206f6a2166206520686a2165206720696a216720632062460d0a0c0b0b41012101024020502f01042200205028020022502f0106490d00410121010340200120686a210120502f01042200205028020022502f01064f0d000b0b20502000206e6c6a206f6a216620502000206d746a20706a28020021504100216520012068460d18206820016b2101034020502802e4012150200120686a22010d000c190b0b206421372052413f4b0d2c0c1d0b41df88c0004133103a000b200141041020000b200141041020000b4190d1c200102c000b41e588c10041222043200228020c108802000b4102212e0c080b4103212e0c080b4103212e0c090b4104212e0c090b4105212e0c090b4105212e0c0a0b410021010c410b410121010c400b410221010c3f0b410221010c3e0b410221010c3d0b410221010c3c0b410221010c3b0b410221010c3a0b410221010c390b410221010c380b410221010c370b41002101034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b2033280200223641086a210020362f010622352016742101410021370240024003402001450d0120192000410810d0032238450d02200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21350b2034450d03203420146a2134203620352017746a20186a2133410021010c150b2036201b6a2037201a6c6a2200450d02200028020821012000280200210020024200370370200241f0006a20002001410820014108491b10ce031a2001201c4d0d03202f20318020022903702239520d05202d201d6a223a28020022010d42202d201e6a2903002132200241f0006a200241c0006a10aa020240024020022802704101470d002030350200213b2002280274213c4101213d20202d0000450d010c100b2030290300213e4200213b20304200370300200242003703702029201f200241f0006a100120092030290300370300200220022903703703180240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d0e2002290370213b0b20304200370300200242003703702010200f200241f0006a10012009203029030037030020022002290370370318024002400240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d112002290370213f2032203e202a7c580d020c010b4203213f2032203e202a7c580d010b2040202b83202c84213b4101213d418a92c100213c20202d0000450d010c100b4100213d2032203f203b7c223b5a0d0220202d00000d0f0b02400240203d450d0020022802502002280254200a28020010940220024200370254200241f0c0c100360250200220213703180c010b2002280250214120022021370318204141f0c0c100460d00200228025421420c140b2018101f2241450d0941002142204141003b010620414100360200204141086a200241f0006a202210ce031a20024100360254200220413602500c120b204141086a210020412f01062236201674210141002137024003402001450d01200241186a2000410810d0032238450d09200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21360b02402042450d00204220146a2142204120362017746a20186a2802002141410121010c140b20232021370200200241f0006a20136a200a360200200241f0006a201a6a20363602002030200241d0006a360200200220413602742002201136027020092011360200200220243703184101101f2101024002400240024002400240203d450d002001450d0f200141013a00002002202537021c200220013602182002203ba72201360260200241e0006a200241186a1062200228021c2237200928020022006b20014f0d01200020016a22382000490d4320374101742236203820382036491b22382011480d432037450d02200228021820372038101e22370d030c100b2001450d13200120113a00002002202537021c20022001360218200141012026101e2201450d142001203b3700012002202737021c200220013602180c040b200228021821370c020b2038101f2237450d0d0b2002203836021c200220373602180b2009200020016a360200203720006a203c200110ce031a0b200241e0006a41086a200928020036020020022002290318370360200241f0006a200241e0006a1095022020203d3a0000200241d0006a201a6a20113a0000203b2140203d0d060b203a2802004101460d410c420b203942808080807083421c842131419dacc20021430c010b203942808080807083422984213141f4abc20021430b2031a721500c010b41312150418c8ec00021430b2002205036026420022043360260200242e1eac98bb68edbb7f4003703182002200241d0006a200241186a200241e0006a109302200228020022430d0a200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c100b200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c0f0b41e588c1004122418789c100412d108802000b41e40141041020000b410141011020000b203841011020000b41df88c0004133103a000b41df88c0004133103a000b41e588c100412241b489c1004131108802000b410141011020000b410941011020000b41e588c100412220432002280204108802000b410121010c010b410121010c000b0b206720696a216702400240024020632062470d004104212e0c010b4105212e0c010b410221010c360b410221010c350b2058205a6a215802400240024020532052470d004102212e0c010b4103212e0c010b410221010c350b410221010c340b20022802402002280244200228024810940202402006450d00200641286c2150200321430340024020432d00002201450d00024020014101470d00204341086a280200450d01204341046a280200101d204341286a2143205041586a22500d020c030b204341106a280200450d002043410c6a280200101d0b204341286a2143205041586a22500d000b0b02402007450d002003101d0b02402004450d00200441e8016c215020084188016a214303402043103c204341e8016a2143205041987e6a22500d000b0b02402005450d002008101d0b4101101f2243450d05204320022d007c3a0000204341014102101e2251450d06205120022d007d3a0001200228027022502143024020022802742200450d002050214320002101034020432802e40121432001417f6a22010d000b2000210103402001417f6a22010d000b0b02400240024020022802782252450d002052417f6a213720432f0106450d01204341086a2138410121000c020b4100215341042154410421554100215220000d030c040b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b204320004103746a41086a2138204320004102746a41e8016a28020021434100210020014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b417f203741016a220120012037491b2253ad2231421e88a70d042031420286a72201417f4c0d04024002400240024002402001450d002001101f2254450d0d205420383602002037450d020c010b41042154410420383602002037450d010b200020432f01064f0d01200041016a2156204320004103746a41086a21570c020b410121520c020b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b204320004103746a41086a2157204320004102746a41e8016a28020021434100215620014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b2052417e6a215841012159417f215a4202215b4220215c4100215d4102215e4103215f4108216041e80121614101215220534101470d0b0c0a0b205421552002280270215020022802742200450d010b20002101034020502802e40121502001417f6a22010d000b03402000417f6a22000d000b0b024002400240200241f8006a2802002238450d002038417f6a213720502f0106450d01205041e0006a2162410121000c020b410021634104216441042137410021622052413f4d0d020c110b0240024020502f01042200205028020022502f01064f0d00410121010c010b410121010340200141016a210120502f01042200205028020022502f01064f0d000b0b20502000410c6c6a41e0006a2162205020004102746a41e8016a28020021504100210020014101460d00410120016b2101034020502802e4012150200141016a22010d000b0b417f203741016a220120012037491b2263ad2231421e88a70d012031420286a72201417f4c0d01024002400240024002402001450d002001101f2264450d0b206420623602002037450d020c010b41042164410420623602002037450d010b200020502f01064f0d01200041016a216520502000410c6c6a41e0006a21660c020b41012162206421372052413f4b0d110c020b0240024020502f01042200205028020022502f01064f0d00410121010c010b410121010340200141016a210120502f01042200205028020022502f01064f0d000b0b20502000410c6c6a41e0006a2166205020004102746a41e8016a28020021504100216520014101460d00410120016b2101034020502802e4012150200141016a22010d000b0b2038417e6a216741012168417f21694202216a4220216b4100216c4102216d410c216e41e000216f41e80121704101216220634101470d0a0c090b410121284101101f224f450d03204f20524102743a000020524102742250450d140c0f0b102e000b410141011020000b410241011020000b410141011020000b200141041020000b200141041020000b4102212e0c030b4103212e0c030b4104212e0c030b4105212e0c030b410221010c240b410221010c230b410221010c220b410221010c210b02402052418080014f0d00410221284102101f224f450d02204f20524102744101723b0000205241027422500d010c060b024020524180808080044f0d00410421284104101f224f450d03204f2052410274410272360000205241027422500d010c060b4101101f2243450d03204341033a000041052128204341014105101e224f450d04204f205236000120524102742250450d050b410020286b21432028211402400340205528020021010240202820436a41074b0d00201441086a22002014490d1520284101742252200020002052491b22004100480d15024002402028450d00204f20282000101e224f0d010c040b2000101f224f450d030b200021280b205541046a2155204f20146a2001290000370000204341786a2143201441086a21142050417c6a22500d000b2062413f4b0d070c060b200041011020000b410241011020000b410441011020000b410141011020000b410541011020000b202821142062413f4b0d010b410121504101101f2255450d08205520624102743a00004101210120620d010c020b02402062418080014f0d00410221504102101f2255450d07205520624102744101723b00000c010b024020624180808080044f0d00410421504104101f2255450d06205520624102744102723600000c010b4101101f2243450d04204341033a000041052150204341014105101e2255450d03205520623600010b20624102742152205021010340203728020022432802002138024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020432802082243413f4b0d0020502001470d01205041016a22012050490d2120504101742200200120012000491b22004100480d212050450d05205520502000101e22550d060c0f0b2043418080014f0d01205020016b41014b0d02200141026a22002001490d2020504101742262200020002062491b22004100480d202050450d0b205520502000101e22550d0c0c0f0b205021000c050b20434180808080044f0d01205020016b41034b0d05200141046a22002001490d1e20504101742262200020002062491b22004100480d1e024020500d002000101f2255450d100c070b205520502000101e22550d060c0f0b205021000c090b20502001470d05205041016a22012050490d1c20504101742200200120012000491b22004100480d1c0240024020500d002000101f2255450d100c010b205520502000101e2255450d0f0b205021010c060b2000101f2255450d090b205021010b205520016a20434102743a00002000200141016a22016b20434f0d060c0c0b205021000b205520016a20434102744102723600002000200141046a22016b2043490d0a0c040b205021000b205520016a41033a000002402000200141016a22506b41034b0d00205041046a22622050490d1620004101742204206220622004491b22624100480d16024002402000450d00205520002062101e22550d010c080b2062101f2255450d070b206221000b205520506a20433600002000200141056a22016b2043490d080c020b2000101f2255450d030b205520016a20434102744101723b00002000200141026a22016b2043490d060b200021500c060b200041011020000b200041011020000b206241011020000b200041011020000b200041011020000b200120436a22502001490d0c20004101742262205020502062491b22504100480d0c02402000450d00205520002050101e22550d010c040b2050101f2255450d030b203741046a2137205520016a2038204310ce031a200120436a21012052417c6a22520d000b0b024002400240202820146b20014f0d00201420016a22432014490d0c20284101742200204320432000491b22004100480d0c2028450d01204f20282000101e224f450d020c090b201420016a2143204f20146a2055200110ce031a2050450d0a0c090b2000101f224f0d070b200041011020000b205041011020000b410541011020000b410141011020000b410441011020000b410241011020000b410141011020000b20002128204f20146a2055200110ce031a2050450d010b2055101d0b02402063450d002064101d0b02402053450d002054101d0b02402043450d00204341026a22502043490d0120504104205041044b1b22014100480d01205141022001101e2251450d02205141026a204f204310ce031a2028450d040c030b204341026a2150205141026a204f204310ce031a20280d020c030b1021000b200141011020000b204f101d0b20022802702002280274200241f8006a280200109402200241d0026a24002050ad4220862051ad840f0b20014101470d010b202d280290012017460d010b202d200b6a222d200c470d010c030b200241c0006a2144200228024421454108214641032147417f21484102214941e401214a41bd8ec000214b4178214c4101214d0c010b4100212e0c020b4101212e0c020b410021010c020b410221010c010b410221010c000b0b960301037f230041d0006b22022400200241306a41086a220342003703002002420037033041fbb8c0004111200241306a1001200241206a41086a2003290300370300200220022903303703200240024002400240200241206a411041f8b3c200410041001002417f460d00200241c8006a4200370300200241306a41106a42003703002003420037030020024200370330200241206a4110200241306a4120410010022203417f460d022003411f4d0d02200241186a200241306a41186a290300370300200241106a200241306a41106a290300370300200241086a200241306a41086a29030037030020022002290330370300412021044120101f2203450d010c030b200241186a4200370300200241106a4200370300200241086a420037030020024200370300412021044120101f22030d020b200441011020000b41df88c0004133103a000b20032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241d0006a24002003ad42808080808004840bfa1405037f017e017f017e087f230041f0076b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c20024188066a200241086a10b40102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903f8064203510d00200241106a20024188066a41e80110ce031a200241f8016a200241106a41e80110ce031a2002200241f8016a3602f00420024188066a200241f0046a10990220022802900621030240200228028c06450d00200228028806101d0b20024188066a200241f8016a41e80110ce031a200241f0046a20024188066a10870102400240024002400240024020022802f0044101470d0020022802f404210120022802f8042200411a460d0120004115470d024102210441f6012100200141d7c0c100460d0d200141d7c0c100411510d0030d020c0d0b200241e0036a200241f0046a41086a41900110ce031a02400240200241e0036a41086a410020022903e0034201511b2201450d002001450d004100210441032100200120031089010d012001108801210541012100200141206a410020011b220629030022072005540d014102210041022104200720054280027c560d01200520075a0d0541002108410021094100210a4100210b4104210c03404120101f2200450d0920002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c000101e2200450d0a200020053700200240200a200b470d00200a41016a220d200a490d232008200d200d2008491b220bad420c7e2207422088a70d232007a7220d4100480d230240200a450d00200c2009200d101e220c0d010c0d0b200d101f220c450d0c0b200c20096a220d2000360200200d41046a42c08080808005370200200841026a21082009410c6a2109200a41016a210a200542017c220520062903002207540d000c070b0b4176416c20011b2100410021040b20024190046a108c010c0c0b41002100200141d998c000460d0141002104200141d998c000411a10d003450d0b0b4100210441810121000c0a0b410021040c090b4104210c4100210a4100210b0b410c101f220f450d044120101f2200450d0520002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c000101e2201450d062003ad210520012007370020200f42c08080808005370204200f200136020020024190046a108c012002410036029006200242013703880641012104410121014101101f22000d080c130b2002418c026a41013602002002411836021420024190aac300360210200242013702fc01200241d8a9c3003602f8012002200241106a36028802200241f8016a41e0a9c30010cf01000b412041011020000b41c00041011020000b200d41041020000b410c41041020000b412041011020000b41c00041011020000b20024100360290062002420137038806024020044101460d0020044102470d024101101f2201450d0d2002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41023a0000200228028c0620032802002201470d04200141016a22032001490d1320014101742209200320032009491b22094100480d132001450d0820022802880620012009101e2203450d090c160b410121014101101f2200450d0b0b20024188066a41086a22032003280200220920016a3602002002200136028c062002200036028806200020096a20013a0000200228028c062200200328020022016b41084f0d01200141086a22032001490d1120004101742201200320032001491b22014100480d112000450d0420022802880620002001101e2200450d050c0f0b4101101f2201450d0b2002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41003a0000200228028c0620032802002201470d02200141016a22032001490d1020014101742209200320032009491b22094100480d102001450d0720022802880620012009101e2203450d080c0c0b20022802880621000c0e0b20022802880621030c120b20022802880621030c0a0b2001101f22000d0a0b200141011020000b2009101f22030d0d0b200941011020000b2009101f22030d040b200941011020000b200120011020000b410141011020000b410141011020000b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000c070b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2209200141086a360200200020016a20053700002002200a3602f801200241f8016a20024188066a10620240024002400240200a450d00200c200a410c6c6a210e200c210303402003280200210d2002200341086a28020022013602f801200241f8016a20024188066a10620240024002400240200228028c062208200928020022006b20014f0d00200020016a22062000490d0920084101742200200620062000491b22004100480d092008450d0120022802880620082000101e22080d020c060b20022802880621080c020b2000101f2208450d040b2002200036028c062002200836028806200928020021000b2009200020016a360200200820006a200d200110ce031a2003410c6a2203200e470d000b0b200241013602f801200241f8016a20024188066a1062200f28020021082002200f28020822013602f801200241f8016a20024188066a1062024002400240200228028c062203200928020022006b20014f0d00200020016a22092000490d0620034101742200200920092000491b22004100480d062003450d0120022802880620032000101e2203450d020c040b20022802880621030c040b2000101f22030d020b200041011020000b200041011020000b2002200036028c06200220033602880620024190066a28020021000b20024188066a41086a2209200020016a360200200320006a2008200110ce031a024002400240200228028c062200200928020022016b41084f0d00200141086a22032001490d0320004101742201200320032001491b22014100480d032000450d0120022802880620002001101e2200450d020c040b20022802880621000c040b2001101f22000d020b200141011020000b1021000b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2203200141086a360200200020016a427f37000020032802002103200228028806210920044101470d030240200a450d00200a410c6c2100200c210103400240200141046a280200450d002001280200101d0b2001410c6a2101200041746a22000d000b0b0240200b450d00200c101d0b0240200f41046a280200450d00200f280200101d0b200f101d0c030b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000b20024190066a280200210320022802880621090b200241f0076a24002003ad4220862009ad840b6201017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002411836021c20024198aac30036021820024201370204200241d8a9c3003602002002200241186a360210200241e0a9c30010cf01000b8a0c07027f017e057f017e027f037e037f230041306b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241106a200241086a105b0240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101460d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2109200141a0016a2200210120092d00004102470d050c010b034020062001460d0720012d00002109200141286a2200210120094102470d000b0b200041606a22082802004101460d020c040b200141d0006a2100200141306a22082802004101460d010c030b200141f8006a2100200141d8006a22082802004101470d020b200021010c000b0b200828020421012008290310210a4108210b410021094100210c0240200828020c220641286c22004128490d0020004100480d032006ad42287e422088a74100470d032000101f220b450d092006210c0b2001200120006a460d01200641286c210641002109200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200941016a2109200141286a2101200641586a22060d000c020b0b4100210b0b20024100360218200242013703104101101f21060240024002400240200b450d002006450d08200242818080801037021420022006360210200641013a000020022009360228200241286a200241106a1062200241106a41086a221028020021002002280214210602402009450d00200b200941286c6a2111200b210103400240024002400240200620006b41204f0d00200041206a22092000490d0a20064101742208200920092008491b22124100480d0a2006450d01200228021020062012101e22080d020c0b0b200041206a2109200228021021080c020b2012101f2208450d090b2002201236021420022008360210201221060b20102009360200200820006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a29030021040240024002400240200620096b41084f0d00200941086a22002009490d0a20064101742212200020002012491b22124100480d0a2006450d01200820062012101e22080d020c0c0b200941086a21000c020b2012101f2208450d0a0b2002201236021420022008360210201221060b20102000360200200820096a20043700002011200141286a2201470d000b0b200620006b41084f0d01200041086a22012000490d0420064101742209200120012009491b22014100480d042006450d02200228021020062001101e2206450d030c0b0b2006450d08200242818080801037021420022006360210200641003a0000428080808010210420050d0c0c0d0b200228021021060c0a0b2001101f22060d080b200141011020000b1021000b201241011020000b201241011020000b200241246a41013602002002411836022c200241a0aac30036022820024201370214200241d8a9c3003602102002200241286a360220200241106a41e0a9c30010cf01000b410141011020000b410141011020000b200041081020000b20022001360214200220063602100b200241106a41086a200041086a2201360200200620006a200a3700002001ad42208621040240200b450d00200c450d00200b101d0b2005450d010b200541286c2100200321010340024020012d00002209450d00024020094101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402007450d002003101d0b200241306a240020042006ad840b9f0c07027f017e047f027e027f037e047f230041306b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241106a200241086a105b02400240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101470d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2108200141a0016a2200210120082d00004102470d050c010b034020062001460d0720012d00002108200141286a2200210120084102470d000b0b200041606a22082802004101470d020c040b200141d0006a2100200141306a22082802004101470d010c030b200141f8006a2100200141d8006a22082802004101460d020b200021010c000b0b20082802042101200829031821092008290310210a4108210b410021064100210c0240200828020c220841286c22004128490d0020004100480d032008ad42287e422088a74100470d032000101f220b450d0a2008210c0b2001200120006a460d01200841286c210841002106200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200641016a2106200141286a2101200841586a22080d000c020b0b4100210b0b20024100360218200242013703104101101f21100240024002400240200b450d002010450d08200242818080801037021420022010360210201041013a0000201041014109101e2201450d09200242898080809001370214200220013602102001200a37000120022006360228200241286a200241106a1062200241106a41086a221028020021112002280214210802402006450d00200b200641286c6a2112200b210103400240024002400240200820116b41204f0d00201141206a22002011490d0a20084101742206200020002006491b22134100480d0a2008450d01200228021020082013101e22060d020c0b0b201141206a2100200228021021060c020b2013101f2206450d090b2002201336021420022006360210201321080b20102000360200200620116a221141186a200141186a290000370000201141106a200141106a290000370000201141086a200141086a29000037000020112001290000370000200141206a29030021040240200820006b41074b0d00200041086a22112000490d0720084101742213201120112013491b22114100480d07024002402008450d00200620082011101e22060d010c0b0b2011101f2206450d0a0b2002201136021420022006360210201121080b2010200041086a2211360200200620006a20043700002012200141286a2201470d000b0b200820116b41084f0d01201141086a22012011490d0420084101742200200120012000491b22014100480d042008450d02200228021020082001101e2210450d030c0c0b2010450d09410121062002410136021420022010360210201041003a000020050d0d0c0e0b200228021021100c0b0b2001101f22100d090b200141011020000b1021000b201341011020000b201141011020000b200241246a41013602002002411836022c200241a8aac30036022820024201370214200241d8a9c3003602102002200241286a360220200241106a41e0a9c30010cf01000b410141011020000b410941011020000b410141011020000b200041081020000b20022001360214200220103602100b201020116a2009370000201141086a21060240200c450d00200b101d0b2005450d010b200541286c2100200321010340024020012d00002208450d00024020084101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402007450d002003101d0b200241306a24002006ad4220862010ad840ba305020a7f017e230041206b220224002002410e360204200241988ec100360200200241106a41a68ec1002002108101410021030240024002400240200228021022042002280218220541f8b3c200410041001002417f460d002002410036020020042005200241044100100241016a41044d0d01200228020021030b02402002280214450d002004101d0b2002200310b30220024100360218200242013703102002280200210620022002280208220336020c2002410c6a200241106a106202400240024002402003450d002006200341286c6a2107200241106a41086a22082802002104200228021421092006210303400240024002400240200920046b41204f0d00200441206a22052004490d062009410174220a20052005200a491b220b4100480d062009450d0120022802102009200b101e220a0d020c070b200441206a21052002280210210a0c020b200b101f220a450d050b2002200b3602142002200a360210200b21090b20082005360200200a20046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a290300210c0240024002400240200920056b41084f0d00200541086a22042005490d062009410174220b20042004200b491b220b4100480d062009450d01200a2009200b101e220a0d020c080b200541086a21040c020b200b101f220a450d060b2002200b3602142002200a360210200b21090b20082004360200200a20056a200c3700002007200341286a2203470d000b2002280204450d060c050b200241186a28020021042002280210210a20022802040d040c050b1021000b200b41011020000b200b41011020000b41df88c0004133103a000b2006101d0b200241206a24002004ad422086200aad840bd60403017f017e0c7f230041d0006b22022400024002400240024002402001450d002001ad42287e2203422088a70d032003a722044100480d032004101f2205450d04200241086a2106200241306a41186a2107200241306a41106a2108200521044100210903402002410e360234200241988ec10036023020022009200241306a107e0240024002402002280200220a2006280200220b41f8b3c200410041001002417f470d00420021032007420037030020084200370300200241306a41086a420037030020024200370330200941016a210920022802040d010c020b2007420037030020084200370300200241306a41086a220c420037030020024200370330200a200b200241306a412041001002220d417f460d05200d4120490d05200241106a41186a220d2007290300370300200241106a41106a220e2008290300370300200241106a41086a220f200c2903003703002002200229033037031020024200370330200a200b200241306a41084120100241016a41084d0d05200229033021032007200d2903003703002008200e290300370300200c200f29030037030020022002290310370330200941016a21092002280204450d010b200a101d0b20042002290330370300200441186a2007290300370300200441106a2008290300370300200441086a200241306a41086a290300370300200441206a2003370300200441286a210420012009470d000b200121040c010b41002104410821050b200020043602082000200136020420002005360200200241d0006a24000f0b41df88c0004133103a000b1021000b200441081020000be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041a590c1004117200241106a1001200241086a20032903003703002002200229031037030002400240024002402002411041f8b3c200410041001002417f460d002002420037031020024110200241106a41084100100241016a41084d0d0220022903102104410821054108101f2203450d010c030b42032104410821054108101f22030d020b200541011020000b41df88c0004133103a000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b8b0301097f230041206b22022400200210800120024100360218200242013703102002280200210320022002280208220436021c2002411c6a200241106a1062024002400240024002402004450d0020044105742105200241106a41086a280200210620022802102107200228021421082003210403400240024002400240200820066b41204f0d00200641206a22092006490d062008410174220a20092009200a491b220a4100480d062008450d0120072008200a101e22070d020c070b200641206a21090c020b200a101f2207450d050b200a21080b200720066a22062004290000370000200641186a200441186a290000370000200641106a200441106a290000370000200641086a200441086a29000037000020092106200441206a2104200541606a22050d000b200241186a200936020020022008360214200220073602102002280204450d040c030b200241186a28020021092002280210210720022802040d020c030b1021000b200a41011020000b2003101d0b200241206a24002009ad4220862007ad840baf0601097f230041106b2202240020024100360208200242013703002000280200210302400240024002404104101f2204450d0020024284808080c000370204200220043602002004200336000020002802042103200441044108101e2204450d012002428880808080013702042004200336000420022004360200200041086a28020021042002200041106a280200220336020c2002410c6a2002106202400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a101e22090d020c070b200341206a2108200228020021090c020b200a101f2209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b200041146a280200210420022000411c6a280200220336020c2002410c6a2002106202402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a101e22090d020c080b200228020021090c020b200a101f2209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10032007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100320040d050c060b1021000b200a41011020000b200a41011020000b410441011020000b410841011020000b2009101d0b200241106a24000bb00b03057f047e017f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012d00002203450d0020034101470d02200041003a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a29000037000020030d014101450d0f0c0e0b2002412b6a2001410c6a280000360000200041013a00002002200141046a29000037002320002002290020370001200041086a200241276a2900003700002003450d020b20034101460d0d20030d05200141086a280200450d0d200141046a280200101d200241c0006a24000f0b20034104470d0720022001410c6a28020022043602142002200141046a2802002205360210200241003a0020200241206a20052004410047220610ce031a20042006490d052002200420066b22033602142002200520066a22063602102004450d0720022d002022044102460d0220044101460d0120040d07200241003a0020200241206a20062003410047220410ce031a20032004490d082002200320046b22053602142002200620046a22063602102003450d0620022d00200d0641002103200241206a2005412020054120491b22046a41004100412020046b2004411f4b1b10cd031a200241206a2006200410ce031a2002200520046b3602142002200620046a3602102005411f4d0d062002411c6a41026a2206200241206a41026a22052d00003a0000200220022f00203b011c20022800232104200229002f210720022900372108200231003f21092002290027210a200520062d000022063a00002002410c6a41026a20063a0000200220022f011c22063b010c200220063b0120200a422088a72106200aa721050c030b41000d0a0c0b0b200241003a0020200241206a20062003410047220410ce031a20032004490d072002200320046b3602142002200620046a3602102003450d0520022d00200d05200241206a200241106a10b90220022802202204450d05200229022421072002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c2007422088a721062007a72105410121030c010b200241003a0020200241206a20062003410047220510ce031a20032005490d072002200320056b22043602142002200620056a22063602102003450d040240024020022d002022034101460d0020030d0620024200370320200241206a20062004410820044108491b220310ce031a2002200420036b3602142002200620036a360210200441074d0d0620022903202108200241206a200241106a10b80220022802202206450d0620022902242107410021050c010b20024200370320200241206a20062004410820044108491b220510ce031a2002200420056b22033602142002200620056a2206360210200441074d0d052002290320210820024200370320200241206a20062003410820034108491b220410ce031a2002200320046b3602142002200620046a360210200341074d0d0520022903202109200241206a200241106a10b80220022802202206450d0520022902242107410121050b410221032002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c0b200241206a41026a220b2002410c6a41026a2d00003a0000200220022f010c3b0120200020033a0000200041206a2009370000200041186a2008370000200041106a2007370000200041086a2006ad4220862005ad84370000200041046a2004360000200020022f01203b0001200041036a200b2d00003a00000b200141086a280200450d07200141046a280200101d0c070b20062004102a000b200241206a41026a2002411c6a41026a2d00003a0000200220022f001c3b01200b41cb8fc200411e103a000b20042003102a000b20042003102a000b20052003102a000b200141086a280200450d00200141046a280200101d200241c0006a24000f0b200241c0006a24000bd10504027f017e0f7f017e230041d0006b22022400200241086a200110b5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b410021114100210e0c030b102e000b200541081020000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a28020022054120200541204922101b221110ce031a200a200520116b22053602002001200f20116a221136020020100d01200241106a41186a22102007290300370300200241106a41106a22122008290300370300200241106a41086a221320092903003703002002200229033037031020024200370330200241306a20112005410820054108491b220f10ce031a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903302104200720102903003703002008201229030037030020092013290300370300200220022903103703300240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005101e22060d010c060b2005101f2206450d050b2006200c6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a2009290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d002006101d0b200241d0006a24000f0b2000200e36020420002006360200200041086a2011360200200241d0006a24000f0b1021000b200541081020000bd80403027f017e0e7f230041d0006b22022400200241086a200110b50102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210e0c030b102e000b200541011020000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a2802002205412020054120491b221010ce031a200a200520106b3602002001200f20106a3602002005411f4d0d02200d41016a2105200241106a41186a22102007290300370300200241106a41106a220f2008290300370300200241106a41086a22112009290300370300200220022903303703100240200d200e470d00200b20052005200b491b220ead4205862204422088a70d042004a722124100480d040240200d450d002006200c2012101e22060d010c060b2012101f2206450d050b2006200c6a220d2002290310370000200d41186a2010290300370000200d41106a200f290300370000200d41086a2011290300370000200b41026a210b200c41206a210c2005210d20052003490d000b0b2000200e36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200e450d002006101d0b200241d0006a24000f0b1021000b201241011020000b8303010a7f230041106b220224002002200110b5010240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d012003101f2204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b10ce031a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008101e22040d010c090b2008101f2204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d002004101d0b200241106a24000f0b200b2009102a000b1021000b200841011020000b102e000b200341011020000bdd0801067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081002210320012001280208200341016a41014b22036a220436020802400240024002402003450d0020022d0050220341ef014b0d010c020b200041023a0000200241f0006a24000f0b024002400240024002400240200341847e6a220341034b0d0002400240024020030e0400040102000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100222012001417f461b2201410220014102491b20052802006a360200200141014d0d0620022f0150220341ef014b0d08200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100222012001417f461b2201410420014104491b20052802006a360200200041023a0000200241f0006a24000f0b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d022002412e6a20022d00523a0000200241106a41086a200241df006a290000370300200241106a41106a200241e7006a290000370300200241106a41186a200241d0006a411f6a2d00003a0000200220022f01503b012c2002200229005737031020022800532103410121050c030b200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100222012001417f461b2201410420014104491b20052802006a360200200141034d0d03410121012002280250220341ffff034b0d05200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2204200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402005450d002002410c6a41026a20012d00003a0000200241d0006a41086a2004290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b410121010b200020022f010c3b0001200020013a0000200041046a2003360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241ffff034d0d01200141046a280200200141086a2802002200470d03200041016a22032000490d1820004101742204200320032004491b22044100480d182000450d09200128020020002004101e2203450d0a0c160b200141046a280200200141086a2802002202470d01200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d04200128020020022004101e2203450d050c130b200241ef014b0d02200141046a280200200141086a2802002200470d05200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004101e22030d0a0c0f0b200128020021030c120b200128020021030c130b200141046a280200200141086a2802002200470d03200041016a22032000490d1320004101742204200320032004491b22044100480d132000450d09200128020020002004101e22030d0a0c0d0b2004101f22030d0e0b200441011020000b200128020021030c050b200128020021030c070b2004101f22030d0c0b200441011020000b2004101f2203450d050b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b2004101f2203450d030b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240024002400240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0b20034101742200200420042000491b22004100480d0b2003450d01200128020020032000101e22030d020c060b200128020021030c020b2000101f2203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b200441011020000b200441011020000b200041011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d01200128020020032002101e2203450d020c030b200128020021030c030b2002101f22030d010b200241011020000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d01200128020020032000101e2203450d020c040b200128020021030c040b2000101f22030d020b200041011020000b1021000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b130020004105360204200041acaec3003602000b13002000410d3602042000418494c1003602000b13002000410836020420004180b1c3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242033700000f0b410841011020000b130020004101360204200041e8b7c3003602000b13002000410f360204200041a297c1003602000b130020004102360204200041b4b8c3003602000b130020004101360204200041fcb9c3003602000b130020004109360204200041cd9ac1003602000b13002000410436020420004180bbc3003602000ba01e03077f017e017f230041d0026b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022044101460d0020044102470d16200341246a41026a200141076a2d00003a0000200341086a41086a200141186a290200370300200341086a410d6a2001411d6a290000370000200320012f00053b01242003200141106a290200370308200141086a28020021052001410c6a280200210620012d0004210720022d0001210820022d00002101200341b0016a41186a22042002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012001450d01410121040c020b2001280204210420022d0001210520022d00002101200341c8016a22082002411a6a290100370300200341c0016a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012001450d03410121080c040b200341cc026a41026a220920032d00b2013a0000200341a0026a41086a200341c3016a290000370300200341a0026a410d6a2004290000370000200320032f01b0013b01cc02200320032900bb013703a00241012104200841ff01714101470d0020032800b301210220032800b7012101200341c8006a41026a20092d00003a0000200341b0016a41086a200341a0026a41086a290300370300200341b0016a410d6a200341a0026a410d6a290000370000200320032f01cc023b0148200320032903a0023703b001410021040c010b41f1b4c0002102412a21010b20034190016a41026a2208200341c8006a41026a2d00003a0000200341286a41086a2209200341b0016a41086a290300370300200341286a41106a200341b0016a41106a290300370300200320032f01483b019001200320032903b00137032820040d11200341fb006a2009290300370000200341e8006a41186a200341356a290000370000200320032f0190013b01682003200136006f2003200236006b20032003290328370073200320082d00003a006a200341c8006a41086a220242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b802200341b8026a411041f8b3c200410041001002417f460d03200341b0016a41186a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d132002411f4d0d13200341ce026a220220032d00b2013a0000200341a0026a41086a2201200341c3016a2204290000370300200341a0026a410d6a2208200341c8016a2209290000370000200320032f01b0013b01cc02200320032900bb013703a00220032900b301210a200341286a41086a220b2001290300370300200341286a410d6a22012008290000370000200320022d00003a00b201200320032f01cc023b01b001200320032903a0023703282004200b290300370000200920012900003700002003200a3700b301200320032903283700bb010c040b200341cc026a41026a20032d00b2013a0000200341a0026a41086a200341c3016a290000370300200341a0026a410d6a22092008290000370000200320032f01b0013b01cc02200320032900bb013703a00241012108200541ff01714101470d0020032800b301210220032800b7012101200341e8006a41026a200341cc026a41026a2d00003a0000200341b0016a41086a200341a0026a41086a290300370300200341b0016a410d6a2009290000370000200320032f01cc023b0168200320032903a0023703b001410021080c010b41f1b4c0002102412a21010b200341e4006a41026a2209200341e8006a41026a2d00003a0000200341c8006a41086a2205200341b0016a41086a290300370300200341c8006a41106a200341b0016a41106a290300370300200320032f01683b0164200320032903b00137034820080d042003413b6a2005290300370000200341286a41186a200341d5006a290000370000200320032f01643b01282003200136002f2003200236002b20032003290348370033200320092d00003a002a200542003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2005290300370300200320032903483703b802200341b8026a411041f8b3c200410041001002417f460d02200341b0016a41186a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d112002411f4d0d11200341ce026a220220032d00b2013a0000200341a0026a41086a2201200341c3016a2205290000370300200341a0026a410d6a2208200341c8016a2209290000370000200320032f01b0013b01cc02200320032900bb013703a00220032900b301210a200341e8006a41086a22062001290300370300200341e8006a410d6a22012008290000370000200320022d00003a00b201200320032f01cc023b01b001200320032903a00237036820052006290300370000200920012900003700002003200a3700b301200320032903683700bb010c030b200341b0016a41186a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b0010b0240200341e8006a200341b0016a412010d003450d0041e79fc1002102413121010c0d0b200341b8026a41026a2202200341246a41026a2d00003a0000200341b0016a41086a2201200341086a41086a290300370300200341b0016a410d6a2204200341086a410d6a290000370000200320032f01243b01b802200320032903083703b001200741ff01714101470d04200341a0026a200541067610b00120032802a002210120032802a8022005413f7122024d0d05200341cc026a41026a200120024105746a220241026a2d00003a0000200341306a200241136a290000370300200341356a200241186a290000370000200320022f00003b01cc022003200229000b37032820022800072106200228000321054101210220032802a4020d060c070b200341b0016a41186a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b0010b200341286a200341b0016a412010d003450d0141bd9fc1002102412221010b2004103c2004101d0c090b200341b0016a200441e00010ce031a41002102200341003b01682003200341b0016a200341e8006a108a0120032003280200453a00b2012003410c3b01b001200341b0016a108b012004101d0c070b200341cc026a41026a20022d00003a0000200341286a41086a2001290300370300200341286a410d6a2004290000370000200320032f01b8023b01cc02200320032903b0013703280c030b4100210220032802a402450d010b2001101d0b2002450d010b200341a0026a41026a200341cc026a41026a2d00003a0000200341b0016a41086a200341286a41086a290300370300200341b0016a410d6a200341286a410d6a290000370000200320032f01cc023b01a002200320032903283703b001410021010c010b4101210141d7c0c1002105411521060b200341e4006a41026a2204200341a0026a41026a2d00003a0000200341c8006a41086a2202200341b0016a41086a290300370300200341c8006a41106a200341b0016a41106a290300370300200320032f01a0023b0164200320032903b00137034802402001450d0020062101200521020c020b200341ac016a41026a20042d00003a000020034190016a41086a200229030037030020034190016a410d6a200341c8006a410d6a290000370000200320032f01643b01ac012003200329034837039001200242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b8024100210202400240200341b8026a411041f8b3c200410041001002417f460d00200341c8016a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d072002411f4d0d07200341cc026a41026a220120032d00b2013a0000200341a0026a41086a2204200341c3016a290000370300200341a0026a410d6a2209200341c8016a290000370000200320032f01b0013b01cc02200320032900bb013703a00220032800b301210220032800b7012108200341c8006a41026a20012d00003a0000200341b0016a41086a2004290300370300200341b0016a410d6a2009290000370000200320032f01cc023b0148200320032903a0023703b0010c010b200341ca006a41003a0000200341b0016a410d6a4200370000200341b8016a4200370300200341003b0148200342003703b001410021080b200341a0026a41026a2209200341c8006a41026a2d00003a0000200341286a41086a2207200341b0016a41086a2204290300370300200341286a410d6a220b200341b0016a410d6a2201290000370000200320032f01483b01a002200320032903b001370328200341b9016a200836000020012003290328370000200341c5016a2007290300370000200341ca016a200b2900003700002003418c023b01b001200320023600b501200320032f01a0023b01b201200320092d00003a00b401200341b0016a108b01200341286a41026a2208200341ac016a41026a2d00003a0000200420034190016a41086a290300370300200120034190016a410d6a290000370000200320032f01ac013b012820032003290390013703b001200341c8006a41086a220242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b8024120101f2202450d06200220032f01283b00002002200636000720022005360003200220032903b00137000b200241026a20082d00003a0000200241136a2004290300370000200241186a2001290000370000200341b8026a41102002412010032002101d410021020b0b2000200136020420002002360200200341d0026a24000f0b200341c4016a41013602002003411836026c200341c0adc400360268200342013702b401200341c8adc4003602b0012003200341e8006a3602c001200341b0016a4198bfc30010cf01000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b412041011020000b9f3707027f027e017f027e257f0a7e027f230041d0046b2203240041f7b5c0002104024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710d00200241ff01714102470d00200341b0046a41086a22044200370300200342003703b00441838cc1004113200341b0046a1001200341a8016a41086a2004290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f470d0020044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a2004290300370300200320032903b0043703b003200341b0036a411041f8b3c200410041001002417f460d01200342003703d801024002400240200341b0036a4110200341d8016a41084100100241016a41084d0d0020032903d801500d04200341b0046a41086a22044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a22012004290300370300200320032903b0043703b003420021050240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0220032903d80121050b20044200370300200342003703b00441a590c1004117200341b0046a100120012004290300370300200320032903b0043703b00302400240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0420032903d80120057c2000560d010c060b420320057c2000580d050b41ecacc300102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41d4acc300102c000b200341b0046a41086a22044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a22012004290300370300200320032903b0043703b003200320003703d801200341b0036a4110200341d8016a41081003200341013a00d80120044200370300200342003703b00441838cc1004113200341b0046a100120012004290300370300200320032903b0043703b003200341b0036a4110200341d8016a4101100320044200370300200342003703b00441a590c1004117200341b0046a1001200341a8016a41086a2004290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200342003703b003200341a8016a4110200341b0036a41084100100241016a41084d0d0b20032903b00321050c010b420321050b200341b0046a41086a22014200370300200342003703b00441e58ac0004112200341b0046a1001200341b0036a41086a22022001290300370300200320032903b0043703b0034100210402400240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0c20032903d8012106410021070c010b410121070b20014200370300200342003703b00441e58ac0004112200341b0046a100120022001290300370300200320032903b0043703b003200320003703d801200341b0036a4110200341d8016a410810032006500d0020070d00427f200520057c220820082005541b22054200510d192000200580220020062005802205580d1a2000200542017c2206510d0042002109200341b0046a41086a22044200370300200342003703b00441aaa8c1004112200341b0046a1001200341b0036a41086a2004290300370300200320032903b0043703b00302400240200341b0036a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0036a3602a802200341d8016a200341a8026a105e20032802d801220a450d1f20032902dc0121090c010b4101210a0b024020002005427f857ca7220b450d002009422088a7220c200b4d0d002006a7210d200341d9036a210e200341b0036a41096a210f200341a8026a4104722110200341d8016a41286a2111200341d8016a41206a2112200341d8016a41246a2113200341e8036a2114200341b0036a412c6a2115410021160340200341b8016a41186a200a2016200d6a200c704105746a220441186a290000370300200341b8016a41106a200441106a290000370300200341b8016a41086a200441086a290000370300200320042900003703b801200341d8016a200341b8016a10c90202402012280200223a450d00200341a8026a41086a201141086a290300370300200341a8026a41106a201141106a290300370300200341a8026a41186a201141186a290300370300200341a8026a41206a201141206a280200360200200320112903003703a80220132802002139200341d0026a41186a2217201041186a290000370300200341d0026a41106a2218201041106a290000370300200341d0026a41086a2219201041086a290000370300200320102900003703d002200341b0046a41086a221a4200370300200342003703b00441e2d6c1004115200341b0046a1001200341a8016a41086a221b201a290300370300200320032903b0043703a8010240024002400240200341a8016a411041f8b3c200410041001002417f470d0041014100200341d0026a10630d020c010b200342103702b4042003200341a8016a3602b004200341b0036a200341b0046a105e20032802b0032204450d1620032802b40321012004200341b0036a41086a280200200341d0026a1063210202402001450d002004101d0b20020d010b4112101f2204450d16200441106a41002f0087d74122013b0000200441086a41002900ffd6412200370000200441002900f7d6412205370000200441124132101e2204450d17200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1220032802b003211c2004101d4112101f22040d010c1a0b4100211c2004101d4112101f2204450d190b200441106a20013b0000200441086a200037000020042005370000200441124132101e2204450d19200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a8012003201c41016a221d3602b003200341a8016a4110200341b0036a410410032004101d201a4200370300200342003703b0044189d7c1004119200341b0046a1001201b201a290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1320032802b003211e0c010b4100211e0b200341f0026a41186a22042017290300370300200341f0026a41106a22012018290300370300200341f0026a41086a22022019290300370300200320032903d0023703f00242002108201a4200370300200342003703b004418cb9c000410d200341b0046a1001201b201a290300370300200320032903b0043703a8010240200341a8016a411041f8b3c200410041001002417f460d00200342003703b003200341a8016a4110200341b0036a41084100100241016a41084d0d0e20032903b00321080b20034190036a41186a221f200429030037030020034190036a41106a2220200129030037030020034190036a41086a22212002290300370300200320032903f00237039003201a4200370300200342003703b00441a2d7c1004117200341b0046a1001201b201a290300370300200320032903b0043703a80102400240024002400240024002400240200341a8016a411041f8b3c200410041001002417f460d00200342103702a4042003200341a8016a3602a004200341a0016a200341a0046a10d50120032802a001450d1020032802a4012222ad42307e2200422088a70d1b2000a72204417f4c0d1b2004450d012004101f2223450d282022450d030c020b200341b0046a41186a2204201f290300370300200341b0046a41106a2201202029030037030041082123200341b0046a41086a220220034190036a41086a29030037030020032003290390033703b004200341b0036a41186a2004290300370300200341b0036a41106a2001290300370300200341b0036a41086a2002290300370300200320032903b0043703b0034100212b420021060c040b410821232022450d010b200341a0046a41086a222428020021254100212620032802a404212720032802a004212841002129410021042022212a0340200341b0036a41186a22024200370300200341b0036a41106a22074200370300200341b0036a41086a222b4200370300200342003703b0032024410020282027200341b0036a41202025100222012001417f461b220141202001412049222c1b20256a2201360200202c0d0d200341b0046a41186a222d2002290300370300200341b0046a41106a222e2007290300370300201a202b290300370300200320032903b0033703b004200342003703b0032024410020282027200341b0036a41082001100222252025417f461b2225410820254108491b20016a2201360200202541074d0d0d20032903b0032100200341003602b0032024410020282027200341b0036a41042001100222252025417f461b222c4104202c4104491b20016a2225360200202c41034d0d0d200441016a210120032802b003212c2002202d2903003703002007202e290300370300202b201a290300370300200320032903b0043703b00302402004202a470d002026200120012026491b222aad42307e2205422088a70d0d2005a7222d4100480d0d02402004450d0020232029202d101e22230d010c140b202d101f2223450d130b202320296a22042000370300200441206a2002290300370300200441186a2007290300370300200441106a202b290300370300200441086a20032903b003370300200441286a202c360200202641026a2126202941306a21292001210420012022490d000b20230d010c0d0b410021014100212a2023450d0c0b200341b0046a41186a2229201f290300370300200341b0046a41106a22242020290300370300201a202129030037030020032003290390033703b00402402001ad422086202aad842206422088a7222b4120490d0041302104202b41306c21072023ad42208621054201210020232102034002402002290300202320046a2201290300580d002001ad4220862000842105200121020b200042017c21002007200441306a2204470d000b2002450d20200542ffffffff0f580d20200341b0036a41186a22012029290300370300200341b0036a41106a22022024290300370300200341b0036a41086a2207201a290300370300200320032903b0043703b003202b2005a722044d0d252023200441306c6a22042008370300200441206a2001290300370300200441186a2002290300370300200441106a2007290300370300200420032903b003370308200441013602280c030b200341b0036a41186a2029290300370300200341b0036a41106a2024290300370300200341b0036a41086a201a290300370300200320032903b0043703b0032006a7202b470d010b202b4101742204202b41016a220120012004491bad220042307e2205422088a70d082005a722044100480d0802400240202b450d002023202b41306c2004101e22230d010c210b2004101f2223450d200b2006422088a7212b200021060b2023202b41306c6a22042008370300200441206a200341b0036a41186a290300370300200441186a200341b0036a41106a290300370300200441106a200341b0036a41086a290300370300200420032903b00337030820044101360228200642ffffffff0f83202b41016aad4220868421060b201a4200370300200342003703b00441a2d7c1004117200341b0046a1001201b201a290300370300200320032903b0043703a801200341b0036a41086a22244100360200200342013703b00320032006422088a722043602b004200341b0046a200341b0036a1062024002402004450d00200441306c21254158202428020022046b212b2004412c6a210420032802b403210220232101034002400240024002402002202b6a41286a41204f0d00200441546a222941206a22072029490d0d20024101742229200720072029491b22294100480d0d2002450d0120032802b00320022029101e22070d020c100b20032802b00321070c020b2029101f2207450d0e0b200320293602b403200320073602b003202921020b2024200441746a2226360200200720046a2229416c6a200141206a290000370000202941646a200141186a2900003700002029415c6a200141106a290000370000202941546a200141086a2900003700002001290300210002400240024002402002202b6a222941086a20294f0d00202641086a22292026490d0d20024101742226202920292026491b22294100480d0d2002450d01200720022029101e22070d020c110b200221290c020b2029101f2207450d0f0b200320293602b403200320073602b0030b20242004417c6a2202360200200720046a41746a2000370000200141286a280200212602400240024002402029202b6a41034b0d00200241046a22272002490d0d20294101742202202720272002491b22024100480d0d2029450d01200720292002101e22070d020c120b202921020c020b2002101f2207450d100b200320023602b403200320073602b0030b200141306a210120242004360200200720046a417c6a2026360000202b41546a212b2004412c6a2104202541506a22250d000c020b0b20032802b403210220032802b00321070b200341a8016a411020072024280200100302402002450d002007101d0b02402006a7450d002023101d0b4112101f2204450d1a200441106a41002f00ddc5413b0000200441086a41002900d5c541370000200441002900cdc541370000200441124132101e2204450d1b200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a8010240024002400240024002400240200341a8016a411041f8b3c200410041001002417f460d00200342103702b4032003200341a8016a3602b00320034198016a200341b0036a10d501200328029801450d1b200328029c01210120034180016a200341b0036a10ca02200328028001450d1b2004101d410a2104200141094d0d01201d410a201e6a4d0d030c020b2004101d410321010b201d20012204201e6a4d0d010b200341b0036a200341d0026a10cb022024290300210020032903b00321050240200341b0036a41246a2207280200450d00200341b0036a41206a280200101d0b201a4200370300200342003703b00441ccd7c1004114200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a411041f8b3c200410041001002417f460d01200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1620033502b00321060c020b200341b0046a41186a2017290300370300200341b0046a41106a2018290300370300201a2019290300370300200320032903d0023703b004410121040c020b42c0843d21060b200341c0006a200542002006420010d203200341d0006a4289f48bdcc4002003290340428094ebdc038020032903484200521b4200200410d303200341d0006a41086a290300210620032903502108200341b0036a200341d0026a10cb02200341e0006a200341d0026a20032903b003222f20052008200441ff004b2005200854200020065420002006511b7222041b2230202f203054202429030022312000200620041b22325420312032511b22041b2208200341b0036a41106a29030022332033200856200341b0036a41186a29030022342031203220041b22065620342006511b22041b22352006203420041b223610ef01200341e0006a41086a29030021002003290360210502402003290370223720357d223820087c2208200341e0006a41186a29030020367d2037203554ad7d20067c2008203854ad7c223584500d00202f20337d2236203120347d202f203354ad7d223184500d00200341b0036a41286a2802002201450d00200341b0036a41206a2802002204200141306c6a21020340200341106a2004290300200441086a2903002008203510d20320032003290310200341106a41086a2903002036203110d103200341206a200441106a2003290300200341086a29030010ef01427f2000200341206a41086a2903007c200520032903207c22062005542201ad7c22052001200520005420052000511b22011b2100427f200620011b2105200441306a22042002470d000b0b2005200010f30102402007280200450d00200341b0036a41206a280200101d0b200341d0026a10e401201a4200370300200342003703b00441e0d7c1004115200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a411041f8b3c20041001003200341003a00b003201a4200370300200342003703b00441e9a4c1004119200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a4110200341b0036a41011003200341b0046a41186a2017290300370300200341b0046a41106a2018290300370300201a2019290300370300200320032903d0023703b004410221040b20142032370300200341b0036a41306a2030370300202420043a0000200f20032903b004370000200e20032f0090033b00002015201c360200200f41086a201a290300370000200f41106a200341b0046a41106a290300370000200f41186a200341b0046a41186a290300370000200e41026a20034190036a41026a2d00003a0000200341043a00b003200341b0036a108b0120390d010c020b2039450d010b203a101d0b201641016a2216200b470d000b0b410021042009a7450d00200a101d0b200341d0046a240020040f0b1021000b202a450d002023101d0b41df88c0004133103a000b202941011020000b202941011020000b200241011020000b202d41081020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b102e000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b411241011020000b413241011020000b411241011020000b413241011020000b41b9d7c1004113103a000b200441081020000b41a8d1c200102c000b41c0d1c200102c000b200441081020000b4188eac3002004202b104b000b41df88c0004133103a000bc80401077f230041a0016b22022400024002400240410e101f2203450d00200341066a41002900e5c541370000200341002900dfc5413700002003410e412e101e2203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241d0006a41086a22014200370300200242003703502003412e200241d0006a1001200241306a41086a20012903003703002002200229035037033002400240200241306a411041f8b3c200410041001002417f460d00200242103702442002200241306a360240200241d0006a200241c0006a10fc0220022802702201450d0420002002290350370300200041186a200241d0006a41186a290300370300200041106a200241d0006a41106a290300370300200041086a200241d0006a41086a290300370300200241086a2204200241d0006a412c6a290200370300200241106a2205200241d0006a41346a290200370300200241186a2206200241d0006a413c6a290200370300200241206a2207200241d0006a41c4006a290200370300200241286a2208200241d0006a41cc006a2802003602002002200229027437030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b2003101d200241a0016a24000f0b410e41011020000b412e41011020000b41df88c0004133103a000bcc0603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081002210320012001280208200341016a41014b22036a22043602080240024002402003450d000240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c030b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100222012001417f461b22014103200141034922011b20032802006a36020020010d042002280210410276ad21060c020b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410022103200141086a22012001280200200341016a220141014b6a36020020014102490d0320022f0110410276ad21060c010b0240024020054102762203410c460d0020034104460d0120030d03200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b22014104200141044922011b20052802006a36020020010d04200235021021060c020b420021072002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b22014110200141104922011b20032802006a36020020010d04200241106a41086a290300210820022903102106420121070c050b4200210720024200370310200141086a220341002001280200200141046a280200200241106a41082004100222012001417f461b22014108200141084922011b20032802006a36020020010d03200229031021060b42002108420121070c030b200341046a220941104b0d00200141046a210a200141086a21054200210642002108410021030340200241003a00102001280200200a280200200241106a410120041002210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f8007110d303200241086a29030020088421082002290300200684210642012107200341016a220341ff01712009490d000c030b0b420021070b0b2000200637030820002007370300200041106a2008370300200241206a24000be60806037f047e017f017e0a7f037e230041b0016b220224000240024002400240024002400240024002400240410f101f2203450d00200341076a41002900e9d841370000200341002900e2d8413700002003410f412f101e2204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a29000037000020024190016a41086a2201420037030020024200370390012004412f20024190016a1001200241d0006a41086a200129030037030020022002290390013703500240024002400240200241d0006a411041f8b3c200410041001002417f460d00200242103702642002200241d0006a360260200241386a200241e0006a10ca022002290338a7450d0b200241386a41106a290300210520022903402106200241206a200241e0006a10ca022002290320a7450d0b200241306a290300210720022903282108200241186a200241e0006a10d5012002280218450d0b200228021c2209ad42307e220a422088a70d03200aa72201417f4c0d032001450d012001101f220b450d062009450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210b20090d050b4100210f4200210a200b450d080c050b102e000b410f41011020000b412f41011020000b200141081020000b20024190016a41186a210320024190016a41106a210c4200210a4100210d4100210e410021012009210f034020034200370300200c420037030020024190016a41086a221042003703002002420037039001200241e0006a41086a22112011280200221141002002280260200228026420024190016a41202011100222112011417f461b2211412020114120491b6a3602002011411f4d0d03200241f0006a41186a22122003290300370300200241f0006a41106a2213200c290300370300200241f0006a41086a2214201029030037030020022002290390013703702002200241e0006a10ca022002290300a7450d03200141016a2111200241106a29030021152002290308211620032012290300370300200c201329030037030020102014290300370300200220022903703703900102402001200f470d00200d20112011200d491b220fad42307e2217422088a70d062017a722124100480d0602402001450d00200b200e2012101e220b0d010c080b2012101f220b450d070b200b200e6a2201201537030820012016370300200141286a2003290300370300200141206a200c290300370300200141186a2010290300370300200141106a200229039001370300200a4280808080107c210a200d41026a210d200e41306a210e2011210120112009490d000b200b450d030b200020083703102000200537030820002006370300200041246a200a200fad843702002000200b360220200041186a20073703000b2004101d200241b0016a24000f0b200f450d00200b101d0b41df88c0004133103a000b1021000b201241081020000bdc81010d097f017e077f037e017f017e017f017e357f017e237f017e047f230041f0026b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a220541044b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e050005020301000b200141046a2802002106200241096a2800002105200241056a280000210720022d0001210820022d00002109200341306a41086a220a200241156a290000370300200341306a410d6a220b2002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a2900003703302009450d09410121090c0a0b20022d000120022d0000720d02200141086a290300210c20034180026a41086a22024200370300200342003703800241bca0c100411a20034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200c370330200341b0016a4110200341306a410810030c4f0b200341206a200141196a290000370300200341186a200141116a290000370300200341086a41086a200141096a29000037030020032001290001370308200241096a2800002105200241056a280000210720022d0001210d20022d0000210e200341306a41086a220f200241156a290000370300200341306a410d6a22102002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a290000370330200e450d03410121020c040b20022d000120022d000072450d050b41c9b4c00021074128210520044101470d4e200141046a2802002202103c2002101d0c4e0b200141216a2d00002111200341f0016a200141196a290000370300200341e8016a200141116a290000370300200341d8016a41086a200141096a290000370300200320012900013703d801200241096a2800002105200241056a280000210720022d0001210d20022d0000210e200341306a41086a220f200241156a290000370300200341306a410d6a22122002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a290000370330200e450d07410121020c080b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200f290300370300200341b0016a410d6a2010290000370000200320032f01d0013b01cc01200320032903303703b00141012102200d41ff01714101470d00200341a8026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01a802200320032903b001370330410021020c010b412a210541f1b4c00021070b2003412c6a41026a220e200341a8026a41026a2d00003a000020034180026a41086a220d200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01a8023b012c200320032903303703800220020d1c200341a3016a200d290300370000200341a8016a2003418d026a290000370000200320032f012c3b01900120032005360097012003200736009301200320032903800237009b012003200e2d00003a00920120034190016a10cd02450d07411c101f2202450d25200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d262002200329030837001c200241346a200341086a41186a2903003700002002412c6a200341086a41106a290300370000200241246a200341086a41086a29030037000020034180026a41086a2205420037030020034200370380022002413c20034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411041f8b3c20041004100100221052002101d2005417f460d0b200341306a200341086a10ce0220032802382213450d1041002102200329023c2214422088a72205450d11024020054101460d004100210203402005410176220720026a220e20022013200e4105746a20034190016a412010d0034101481b2102200520076b220541014b0d000b0b201320024105746a20034190016a412010d0032205450d162005411f7620026a21020c110b200141086a290300210c20034180026a41086a22024200370300200342003703800241c7a2c100411b20034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200c370330200341b0016a4110200341306a410810030c470b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200a290300370300200341b0016a410d6a200b290000370000200320032f01d0013b01cc01200320032903303703b00141012109200841ff01714101470d00200341a8026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01a802200320032903b001370330410021090c010b41f1b4c0002107412a21050b2003412c6a41026a2208200341a8026a41026a2d00003a000020034180026a41086a2202200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01a8023b012c200320032903303703800220090d43200341e3026a2002290300370000200341e8026a20034180026a410d6a290000370000200320032f012c3b01d002200320053600d702200320073600d30220032003290380023700db02200320082d00003a00d202200242003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001420021150240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d1d200329033021150b20034180026a41086a22024200370300200342003703800241bca0c100411a20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341b0016a411041f8b3c200410041001002417f460d0520034200370330200341b0016a4110200341306a41084100100241016a41084d0d1d200329033021160c060b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200f290300370300200341b0016a410d6a2012290000370000200320032f01d0013b01cc01200320032903303703b00141012102200d41ff01714101470d00200341d0026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01d002200320032903b001370330410021020c010b41f1b4c0002107412a21050b2003412c6a41026a220e200341d0026a41026a2d00003a000020034180026a41086a220d200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01d0023b012c200320032903303703800220020d15200341bb026a200d290300370000200341a8026a41186a22022003418d026a290000370000200320032f012c3b01a802200320053600af02200320073600ab0220032003290380023700b3022003200e2d00003a00aa02200341a8026a10cd02450d01200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341a8026a41086a290300370300200341e0006a200341a8026a41106a290300370300200341e8006a2002290300370300200320032903d801370330200320032903a802370350411b101f2202450d20200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d212002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d222002200341d0006a220529000037003b200241d3006a200541186a290000370000200241cb006a200541106a290000370000200241c3006a200541086a29000037000020034180026a41086a220542003703002003420037038002200241db0020034180026a1001200341b0016a41086a200529030037030020032003290380023703b001410221050240200341b0016a411041f8b3c200410041001002417f460d00200341003a008002200341b0016a411020034180026a41014100100241016a41014d0d2920032d00800221050b2002101d200541ff01714102470d14200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200320032903d801370330411c101f2202450d2a200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d2b2002200329033037001c200241346a200341c8006a2903003700002002412c6a200341306a41106a290300370000200241246a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022002413c20034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341b0016a411041f8b3c200410041001002417f460d0b200342103702d4022003200341b0016a3602d00220034180026a200341d0026a105e2003280280022217450d2e20034188026a280200210720032802840221050c0c0b41fca1c1002107412b210520044101460d410c420b41a4a1c1002107412e210520044101460d400c410b420321160b410821094200211820034180026a41086a22024200370300200342003703800241dfd9c000411520034180026a1001200341b0016a41086a200229030037030020032003290380023703b0010240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a40120032802302209450d1a200329023421180b201620157c211520092018422088a7220841286c6a2107200921020340200720026b419f014d0d022002200341d0026a460d032002200341d0026a412010d003450d03200241286a2205200341d0026a460d042005200341d0026a412010d003450d04200241d0006a2205200341d0026a460d042005200341d0026a412010d003450d04200241f8006a2205200341d0026a460d04200241a0016a21022005200341d0026a412010d0030d000c040b0b41a7a2c10021074120210520044101460d3d0c3e0b4102210520072002460d022009200841286c6a21070340200341d0026a2002460d012002200341d0026a412010d003450d012007200241286a2202470d000c030b0b200221050b200541206a29030020155621050b2005410247200571210202402018a7450d002009101d0b024002402002450d0020034100360238200342013703302006200341306a10b201200328023421082003280238210a20032802302109200341306a41186a22024200370300200341306a41106a22054200370300200341306a41086a22074200370300200342003703302009200a200341306a1000200341d8016a41186a220a2002290300370300200341d8016a41106a220b2005290300370300200341d8016a41086a22192007290300370300200320032903303703d80102402008450d002009101d0b2002200a2903003703002005200b29030037030020072019290300370300200320032903d8013703304118101f2202450d1c200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d1d20022003290330370018200241306a200341306a41186a290300370000200241286a200341306a41106a290300370000200241206a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022002413820034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411041f8b3c20041004100100221052002101d2005417f460d0141949bc2002107411f21050c390b41d6a0c1002107412021050c380b200341306a200341d8016a10ce02024020032802382202450d00200328023c2105200329033021164200211820034180026a41086a220742003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a200729030037030020032003290380023703b0010240200341b0016a411041f8b3c200410041001002417f460d00200342003703a802200341b0016a4110200341a8026a41084100100241016a41084d0d1520032903a80221180b02402005450d002002101d0b201820165a0d0041f6a0c1002107411221050c380b4108210820034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b00141002109200341b0016a411041f8b3c200410041001002417f460d07200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a10120032802302208450d272003200329023422183702940120032008360290012018422088a721092018a721020c080b4100210241012113420021140b200341306a41186a20034190016a41186a290300370300200341306a41106a20034190016a41106a290300370300200341306a41086a20034190016a41086a290300370300200320032903900137033020022014422088a722054b0d1e20052014a7470d28200541016a22072005490d2b2005410174220e20072007200e491bad2214420586221a422088a70d2b201aa722074100480d2b2005450d02201320054105742007101e2213450d030c280b4100210541012117410021070b2002101d20034180026a41186a220e200341a8026a41186a29030037030020034180026a41106a220d200341a8026a41106a29030037030020034180026a41086a220f200341a8026a41086a290300370300200320032903a80237038002024020052007470d00200541016a22022005490d2a20054101742212200220022012491b2220ad420586220c422088a70d2a200ca722024100480d2a2005450d06201720054105742002101e22170d070c230b200521200c060b2007101f22130d250b200741011020000b41d2a1c1002107412a21052014a7450d052013101d20044101460d320c330b20034100360298012003420837039001410021020b20034180026a41186a2205200341d8016a41186a29030037030020034180026a41106a2207200341d8016a41106a29030037030020034180026a41086a220a200341d8016a41086a290300370300200320032903d8013703800220022009470d20200941016a22022009490d242009410174220b20022002200b491b2202ad42287e2218422088a70d242018a7220b4100480d242009450d042008200941286c200b101e2208450d050c1f0b2002101f2217450d1c0b201720074105746a2202200329038002370000200241186a200e290300370000200241106a200d290300370000200241086a200f290300370000411c101f2202450d18200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2247450d192047200329033037001c204741346a200341306a41186a2903003700002047412c6a200341306a41106a290300370000204741246a200341306a41086a29030037000020034180026a41086a2202420037030020034200370380022047413c20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341003602880220034201370380022003200741016a22023602d002200341d0026a20034180026a1062024002402002450d00200741057441206a210f410020034180026a41086a28020022056b210e2003280280022112200328028402210d2017210203400240200d200e6a411f4b0d00200541206a22072005490d26200d4101742210200720072010491b22074100480d2602400240200d450d002012200d2007101e22120d010c0d0b2007101f2212450d0c0b2007210d0b201220056a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200e41606a210e200541206a2105200241206a2102200f41606a220f0d000b20034188026a20053602002003200d3602840220032012360280020c010b20034188026a2802002105200328028402210d20032802800221120b200341b0016a41102012200510030240200d450d002012101d0b2047101d2020450d002017101d0b200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341a8026a41086a290300370300200341e0006a200341a8026a41106a290300370300200341e8006a200341a8026a41186a290300370300200320032903d801370330200320032903a802370350200320113a00d002411b101f2202450d10200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d112002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d122002200341d0006a220529000037003b200241d3006a200541186a290000370000200241cb006a200541106a290000370000200241c3006a200541086a29000037000020034180026a41086a220542003703002003420037038002200241db0020034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341b0016a4110200341d0026a410110032002101d410021070b20044101470d2d0c2c0b200b101f22080d1a0b200b41081020000b200341c4006a4101360200200341183602ac02200341c0adc4003602a80220034201370234200341c8adc4003602302003200341a8026a360240200341306a41a8bfc30010cf01000b41df88c0004133103a000b41df88c0004133103a000b200741011020000b41df88c0004133103a000b41df88c0004133103a000b411c41011020000b413c41011020000b411b41011020000b413b41011020000b41f60041011020000b411841011020000b413841011020000b411b41011020000b413b41011020000b41f60041011020000b41df88c0004133103a000b41c8aec400102c000b411c41011020000b413c41011020000b411c41011020000b413c41011020000b41df88c0004133103a000b200241011020000b41df88c0004133103a000b200320023602940120032008360290010b2008200941286c6a220220153703002002200329038002370308200241206a2005290300370300200241186a2007290300370300200241106a200a29030037030020034190016a41086a200941016a220a3602000240200a41144b0d0041022129200941016a4102490d034128212a2008200941286c6a41d0006a212b417f212c410a212d410b212e410f212f412021302003413d6a2131411b2132410821334113213441182135411021364103213741502138417821394148213a4170213b4140213c4168213d41b87f213e4160213f41b07f21404158214141012142410121020c020b02400240200a4101762244ad42287e220c422088a70d00200ca72202417f4c0d0041082112024002402002450d002002101f2245450d03204521460c010b41082145410821460b41582148200841586a2149200841d0006a214a200841887f6a214b4104214c4100214d417f214e4101214f420321504220210c4103215141022152417d215341282154412021474118212041102117417e2155417421564164215741b07f215841092159410a215a410b215b410f215c2003413d6a215d411b215e4113215f41502160417821614148216241702163414021644168216541b87f21664160216741002168410021694104216a200a216b410221020c030b102e000b200241081020000b201320024105746a220741206a2007200520026b41057410cf031a200741186a200341306a41186a290300370000200741106a200341306a41106a290300370000200741086a200341306a41086a2903003700002007200329033037000020034180026a41086a220242003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a2207200229030037030020032003290380023703b0014200211a0240024002400240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d012003290330211a0b20024200370300200342003703800241c7a2c100411b20034180026a10012007200229030037030020032003290380023703b00102400240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d032003290330211841012107411c210e411c101f2202450d010c040b42e807211841012107411c210e411c101f22020d030b200e20071020000b41df88c0004133103a000b41df88c0004133103a000b200241186a410028008c9f41360000200241106a41002900849f41370000200241086a41002900fc9e41370000200241002900f49e4137000002400240024002402002200e413c101e221b450d00201b200329030837001c201b41346a200341086a41186a290300370000201b412c6a200341086a41106a290300370000201b41246a200341086a41086a29030037000020034180026a41086a220242003703002003420037038002201b413c20034180026a1001200341b0016a41086a200229030037030020032003290380023703b00120034100360238200342013703304108101f2202450d0120022018201a7c370000200342888080808001370234200320023602302003200520076a22023602a802200341a8026a200341306a10620240024002402002450d00200541057441206a210f4100200341306a41086a28020022056b210e200328023021102003280234210d2013210203400240200d200e6a411f4b0d00200541206a22072005490d0b200d4101742211200720072011491b22074100480d0b02400240200d450d002010200d2007101e22100d010c060b2007101f2210450d050b2007210d0b201020056a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200e41606a210e200541206a2105200241206a2102200f41606a220f0d000b200341386a20053602002003200d360234200320103602300c010b200341386a28020021052003280234210d200328023021100b2014a72102200341b0016a41102010200510030240200d450d002010101d0b201b101d02402002450d002013101d0b4108211c20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b0014100211d0240024002400240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a1012003280230221c450d072003280234211d4128210e200341386a280200220f41286c220d0d010c020b4100210f4128210e410041286c220d450d010b200341306a41086a2102410021070340200341306a41206a201c20076a220541206a290300370300200341306a41186a200541186a290300370300200341306a41106a200541106a2903003703002002200541086a29030037030020032005290300370330200341d0026a41186a200241186a290000370300200341d0026a41106a200241106a290000370300200341d0026a41086a200241086a290000370300200320022900003703d002200341d0026a200341086a412010d0030d02200d2007200e6a2207470d000b0b4100211e20034100360238200342083703304108211f201d450d11201c101d0c110b200341a8026a41206a2202200341306a41206a290300370300200341a8026a41186a220e200341306a41186a290300370300200341a8026a41106a220d200341306a41106a290300370300200341a8026a41086a2210200341306a41086a290300370300200320032903303703a80220034180026a41206a2211200229030037030020034180026a41186a2202200e29030037030020034180026a41106a220e200d29030037030020034180026a41086a220d2010290300370300200320032903a80237038002200341d8016a41206a22102011290300370300200341d8016a41186a22112002290300370300200341d8016a41106a2202200e290300370300200341d8016a41086a220e200d29030037030020032003290380023703d8014128101f221f450d04201f20032903d801370300201f41206a2010290300370300201f41186a2011290300370300201f41106a2002290300370300201f41086a200e2903003703000240200f41286c41586a2007460d00200541286a212141282113201c200f41286c6a221b41586a212241082111200341306a41086a210e41012123412021104118210f4110210d4228211a4220211441002124410121254101211e410021020c060b410121254101211e0c0f0b200741011020000b413c41011020000b410841011020000b41df88c0004133103a000b412841081020000b0240034002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2021210202400340200341306a20106a2205200220106a290300370300200341306a200f6a22072002200f6a290300370300200341306a200d6a220b2002200d6a290300370300200e200220116a29030037030020032002290300370330200341d8016a200f6a200e200f6a290000370300200341d8016a200d6a200e200d6a290000370300200341d8016a20116a200e20116a2900003703002003200e2900003703d801200341d8016a200341086a201010d0030d01201b200220136a2202470d000c1e0b0b200341a8026a20106a22212005290300370300200341a8026a200f6a22192007290300370300200341a8026a200d6a2226200b290300370300200341a8026a20116a2227200e290300370300200320032903303703a80220034180026a20106a2228202129030037030020034180026a200f6a2221201929030037030020034180026a200d6a2219202629030037030020034180026a20116a22262027290300370300200320032903a802370380022005202829030037030020072021290300370300200b2019290300370300200e202629030037030020032003290380023703300240201e2025470d00202520236a221e2025490d1520252023742221201e201e2021491b221ead201a7e2218201488a70d152018a722212024480d1502402025450d00201f202520136c2021101e221f0d010c080b2021101f221f450d070b200220136a2121201f202520136c6a22192003290330370300201920106a20052903003703002019200f6a20072903003703002019200d6a200b290300370300201920116a200e290300370300202520236a212520222002470d070c1c0b200a20092202202c6a2209490d010240200a20096b220b2029490d0020082002202a6c6a220729030020082009202a6c6a220529030022155a0d00200320052f01083b01d00120032005202d6a2d00003a00d2012005202e6a28000021272005202f6a28000021282031200520306a2202290000370000200341306a20336a2243200520326a290000370300200520346a29000021182002200720306a290300370300200520356a200720356a290300370300200520366a200720366a2903003703002003201837033020052007290300370300200520336a200720336a290300370300410121020240200b2037490d00200529035020155a0d0041032119202b210202400340200220386a200220396a2903003703002002203a6a2002203b6a2903003703002002203c6a2002203d6a2903003703002002203e6a2002203f6a290300370300200220406a200220416a220729030037030020192226200b4f0d01202620426a2119200229030021182002202a6a210220182015540d000b0b2026202c6a21020b2007201537030020052002202a6c6a220220032f01d0013b010820032d00d20121052002202f6a20283600002002202e6a20273600002002202d6a20053a0000200220306a2031290000370000200220326a2043290300370000200220346a20032903303700000b202b20416a212b20090d070c120b206b216c4100216b4101216d206c204e6a2227450d0702400240024002400240024002402008202720546c6a2903002008206c20546c22196a20586a29030022185a0d00204b20196a210203402027204f460d022027204e6a2127201820022903002215542105200220486a21022015211820050d000c030b0b206c20556a210b204b20196a21054100216b410021020340200b2002460d052002204f6a21022018200529030022155a2107200520486a21052015211820070d000b206c20026b204e6a21272002204f6a226d20594d0d030c020b410021270b206c2027490d05206c200a4b0d070240206c20276b226d204f762207450d002008202720546c6a2102204920196a21050340200341306a20476a220b200220476a2219290300370300200341306a20206a2226200220206a2228290300370300200341306a20176a2243200220176a226e290300370300200341306a20126a226f200220126a227029030037030020032002290300370330200520126a22712903002118200520176a22722903002115200520206a22732903002116200529030021742019200520476a227529030037030020282016370300206e201537030020702018370300200220743703002075200b29030037030020732026290300370300207220432903003703002071206f29030037030020052003290330370300200220546a2102200520486a21052007204e6a22070d000b0b206d20594d0d010b2027216b20692068460d0e0c0f0b2027450d01206c200a4b0d04204a202720546c6a2176410021770c0f0b206c216d20692068460d090c0a0b2027216b20692068460d0a410221020c0e0b2009200a102a000b2027206c102a000b206c2027417f6a226b490d0d0b206c200a102b000b202141081020000b410021020c090b410121020c080b410021020c060b410121020c050b410221020c040b410121020c030b410121020c020b410221020c010b410321020b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b20692068470d10410121020c160b2068204f6a22022068490d192068204f742205200220022005491b2269ad2050862218200c88a70d192018a72202204d480d1902402068450d00206a20682051742002101e226a0d110c020b2002101f226a0d110c010b206a20682051746a2202206d3602042002206b3602002068204f6a2278216820782052490d02410121770c130b200241041020000b0240024020770e020001010b206c2027204e6a226b490d150240206c206b6b226d2052490d002008202720546c6a22072903002008206b20546c6a220529030022155a0d00200320052f01083b01d00120032005205a6a2d00003a00d2012005205b6a28000021262005205c6a2800002128205d200520476a2202290000370000200341306a20126a22432005205e6a2900003703002005205f6a29000021182002200720476a290300370300200520206a200720206a290300370300200520176a200720176a2903003703002003201837033020052007290300370300200520126a200720126a290300370300410121020240206d2051490d00200529035020155a0d004103210b2076210202400340200220606a200220616a290300370300200220626a200220636a290300370300200220646a200220656a290300370300200220666a200220676a290300370300200220586a200220486a2207290300370300200b2219206d4f0d012019204f6a210b20022903002118200220546a210220182015540d000b0b2019204e6a21020b200720153703002005200220546c6a220220032f01d0013b010820032d00d20121052002205c6a20283600002002205b6a20263600002002205a6a20053a0000200220476a205d2900003700002002205e6a20432903003700002002205f6a20032903303700000b206b450d0c207620486a2176206b2127206d205a490d0a410021020c130b0240024002400240206a20782243204e6a22782051746a2202280200450d00206a20432051746a221920566a280200220b200228020422054d0d0041022168204341024d0d04206a204320536a22022051746a28020422072005200b6a4d0d0141032168204341034d0d04201920576a2802002007200b6a4d0d010c050b20432051490d0120022802042105206a204320536a22022051746a28020421070b20072005490d010b204320556a21020b20432002204f6a22724d0d03204320024d0d04206a20022051746a226f2802042273206f2802006a2202206a20722051746a22702802002271490d052002200a4b0d06206f204c6a21752008207120546c6a22282070280204226e20546c22056a2168200220546c210702400240024002400240200220716b2219206e6b2202206e4f0d0020452068200220546c220510ce031a204620056a210b206e204f480d012002204f480d01204920076a21072068210203402007200220486a2268200b20486a2219201929030020682903005422261b2205290300370300200720476a200520476a290300370300200720206a200520206a290300370300200720176a200520176a290300370300200720126a200520126a290300370300200b201920261b210b20282068200220261b22024f0d04200720486a2107204621052046200b490d000c050b0b20452028200510ce031a204620056a210b206e204f480d012019206e4c0d01200820076a212620462105202821020340200220682005206829030020052903005422191b2207290300370300200220476a200720476a290300370300200220206a200720206a290300370300200220176a200720176a290300370300200220126a200720126a2903003703002005200520546a20191b2105200220546a2102206820546a206820191b226820264f0d04200b20054b0d000c040b0b206821020c010b202821020b204621050b20022005200b20056b220720072054706b10ce031a20752073206e6a360200206f20713602002070207020126a2072204e7320436a20517410cf031a207821682078204f4b0d0a0b206b0d060c010b20432168206b0d060b02402069450d00206a101d0b2044450d122045101d0c120b4188bfc30020722043104b000b4188bfc30020022043104b000b20712002102a000b2002200a102b000b410221020c0b0b410221020c0a0b410021770c050b410121770c050b410021020c060b410221020c050b410221020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102a000b20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200341b0016a3602302003411036023420034190016a200341306a10a201200341a8026a41186a200341d8016a41186a290300370300200341a8026a41106a200341d8016a41106a290300370300200341a8026a41086a200341d8016a41086a290300370300200320032903d8013703a802200341306a200641e00010ce031a4118101f2202450d01200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d02200220032903a802370018200241306a200341a8026a41186a290300370000200241286a200341a8026a41106a290300370000200241206a200341a8026a41086a29030037000020034180026a41086a2201420037030020034200370380022002413820034180026a1001200341b0016a41086a200129030037030020032003290380023703b00120034100360288022003420137038002200341306a20034180026a10b2012003280284022101200341b0016a41102003280280022205200328028802100302402001450d002005101d0b2002101d200341306a103c200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200320032903d8013703304120101f2202450d03200220032903d002370000200241186a200341d0026a41186a290300370000200241106a200341d0026a41106a290300370000200241086a200341d0026a41086a290300370000411c101f2201450d04200141186a41002800a0a141360000200141106a4100290098a141370000200141086a4100290090a14137000020014100290088a1413700002001411c413c101e2201450d052001200329033037001c200141346a200341c8006a2903003700002001412c6a200341c0006a290300370000200141246a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022001413c20034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341003602b002200342013703a802200341013602800220034180026a200341a8026a106202400240024020032802ac02220d20032802b00222076b41204f0d00200741206a22052007490d03200d410174220e20052005200e491b220e4100480d03200d450d0120032802a802200d200e101e2205450d020c090b20032802a80221050c090b200e101f22050d070b200e41011020000b1021000b411841011020000b413841011020000b412041011020000b411c41011020000b413c41011020000b2003200e3602ac02200320053602a802200e210d0b200520076a220e2002290000370000200e41186a200241186a290000370000200e41106a200241106a290000370000200e41086a200241086a290000370000200341b0016a41102005200741206a10030240200d450d002005101d0b2001101d2002101d200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341d0026a41086a290300370300200341e0006a200341d0026a41106a290300370300200341e8006a200341d0026a41186a290300370300200320032903d801370330200320032903d002370350200341013a00a802024002400240411b101f2202450d00200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d012002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d022002200341306a41206a220129000037003b200241d3006a200141186a290000370000200241cb006a200141106a290000370000200241c3006a200141086a29000037000020034180026a41086a220142003703002003420037038002200241db0020034180026a1001200341b0016a41086a200129030037030020032003290380023703b001200341b0016a4110200341a8026a410110032002101d0240200328029401450d00200328029001101d0b2006101d410021070c080b411b41011020000b413b41011020000b41f60041011020000b0240201d450d00201c101d0b200320253602382003201e3602342003201f3602300b20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341103602ac022003200341b0016a3602a802200341306a200341a8026a10a2010240201e450d00201f101d0b200341306a41186a200341086a41186a290300370300200341306a41106a200341086a41106a290300370300200341306a41086a200341086a41086a2903003703002003200329030837033002400240024002400240411c101f2202450d00200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d012002200329033037001c200241346a200341306a41186a22052903003700002002412c6a200341306a41106a2207290300370000200241246a200341306a41086a220e29030037000020034180026a41086a220d420037030020034200370380022002413c20034180026a1001200341a8026a41086a200d29030037030020032003290380023703a802200341a8026a411010092002101d2005200341086a41186a2903003703002007200341086a41106a290300370300200e200341086a41086a290300370300200320032903083703304118101f2202450d02200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d0320022003290330370018200241306a200341c8006a290300370000200241286a200341306a41106a290300370000200241206a200341306a41086a2903003700004200210c20034180026a41086a2205420037030020034200370380022002413820034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411010092002101d20054200370300200342003703800241dfd9c000411520034180026a1001200341b0016a41086a200529030037030020032003290380023703b001024002400240024002400240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a40120032802302217450d0a2003290234220c422088a722020d010c020b410821174200422088a72202450d010b200241286c210e200341d0006a210720172105034020072005290000370000200341306a41186a220d200341086a41186a290300370300200341306a41106a220f200341086a41106a290300370300200341306a41086a2212200341086a41086a290300370300200741086a2210200541086a290000370000200741106a2211200541106a290000370000200741186a2247200541186a29000037000020032003290308370330411b101f2202450d02200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d032002200329033037001b200241336a200d2903003700002002412b6a200f290300370000200241236a20122903003700002002413b41f600101e2202450d04200541286a21052002200729000037003b200241d3006a2047290000370000200241cb006a2011290000370000200241c3006a201029000037000020034180026a41086a220d42003703002003420037038002200241db0020034180026a1001200341a8026a41086a200d29030037030020032003290380023703a802200341a8026a411010092002101d200e41586a220e0d000b0b200ca7450d092017101d0c090b411b41011020000b413b41011020000b41f60041011020000b411c41011020000b413c41011020000b411841011020000b413841011020000b41df88c0004133103a000b2006103c2006101d0c020b4100210720044101470d010b200141046a2802002202103c2002101d0b2000200536020420002007360200200341f0026a24000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a220442003703002001420037032041dfd9c0004115200141206a1001200141086a200429030037030020012001290320370300024002402001411041f8b3c200410041001002417f460d002001421037021420012001360210200141206a200141106a10a40120012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d0220042000412010d003450d02200441286a22082000460d0220082000412010d003450d02200441d0006a22082000460d0220082000412010d003450d02200441f8006a22082000460d02200441a0016a210420082000412010d0030d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d0220042000412010d003450d022008200441286a2204470d000b0b410021070b02402003a7450d002002101d0b200141306a240020070f0b41df88c0004133103a000b990302027f017e230041306b2202240002400240411c101f2203450d00200341186a410028008c9f41360000200341106a41002900849f41370000200341086a41002900fc9e41370000200341002900f49e413700002003411c413c101e2203450d012003200129000037001c200341346a200141186a2900003700002003412c6a200141106a290000370000200341246a200141086a290000370000200241206a41086a22014200370300200242003703202003413c200241206a1001200241086a2001290300370300200220022903203703000240024002402002411041f8b3c200410041001002417f460d002002200236021020024110360214200242003703202002410020024110200241206a41084100100222012001417f461b2201410820014108491b360218200141074d0d0220022903202104200241206a200241106a105e20022802202201450d022000200229022437020c20002001360208200020043703000c010b200041003602080b2003101d200241306a24000f0b41df88c0004133103a000b411c41011020000b413c41011020000b130020004102360204200041b8bfc3003602000b130020004104360204200041c1a4c1003602000b130020004101360204200041d8c0c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120101f2206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011020000b3802017f017e230041106b220324002003200210eb01200329030021042000200341086a29030037030820002004370300200341106a24000b870101027f230041106b22062400024002402003450d0020032802082107200328020021032006410036020c20032007200420052006410c6a10132104200628020c2203417f460d012000200336020420002004360200200041086a2003360200200641106a24000f0b20004100360200200641106a24000f0b20004100360200200641106a24000b962707057f017e0b7f037e087f017e0a7f23004180036b22022400200241286a4200370300200242003703202002420037031820012802082103200128020021040240024020012802042205450d002005210620042101034020012802800921012006417f6a22060d000b0340200420042f01064102746a4180096a28020021042005417f6a22050d000c020b0b200421010b200241306a411c6a20042f0106360200200241306a41186a4100360200200241306a41146a2004360200200220033602502002410036024020024200370338200220013602342002410036023020024198016a200241306a10d60202400240024002400240024002400240024002400240024002400240024020022903b80122074202520d00200241306a103b0c010b200241e0026a4101722108200241dd016a2109200241c8016a210a20024198016a41286a210b200241d0016a210c20024198016a41c0006a210d200241dc016a210e20024198016a41206a210f20024198016a411c6a211020024198016a41146a2111200241e0026a410c6a21120340200241f8006a41186a220420024198016a41186a2220290300370300200241f8006a41106a220520024198016a41106a221c290300370300200241f8006a41086a220620024198016a41086a221b290300370300200241d8006a41086a2203200941086a290000370300200241d8006a41106a221d200941106a290000370300200241d8006a41186a2221200941186a290000370300200220022903980137037820022009290000370358200a2903002113200b2903002114200c290300211e200d2802002122200e2d0000210120024180026a41186a2216200429030037030020024180026a41106a2217200529030037030020024180026a41086a221820062903003703002002200229037837038002200241a0026a41186a22232021290300370300200241a0026a41106a2221201d290300370300200241a0026a41086a221d2003290300370300200220022903583703a002024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020074201520d0020024198016a20024180026a2014201310ec0120202d0000210420022002290318200241186a41086a2205290300200241186a41106a2206290300200229039801201b290300201c29030010de012006200241106a29030037030020052002290308370300200220022903003703182004450d00201ea72104201e422088a72201450d01410020016b220521062004210103402001280290022101200641016a22060d000b0340200420042f01064102746a4190026a2802002104200541016a22050d000c030b0b024002400240024020220d00200141ff01714102470d00201ea72104201e422088a72201450d01410020016b220521062004210103402001280290022101200641016a22060d000b0340200420042f01064102746a4190026a2802002104200541016a22050d000c030b0b4116101f2204450d0b2004410e6a41002900aaf3412213370000200441086a41002900a4f34122143700002004410029009cf3412215370000200441164136101e2204450d0c20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a2018290300370000200241d0026a41086a22194200370300200242003703d00220044136200241d0026a1001200241c0026a41086a221a2019290300370300200220022903d0023703c002200241c0026a411041f8b3c20041004100100221052004101d2005417f460d0220024198016a20024180026a1033201b2802002205450d0d201c280200210620024198016a410c6a280200211f2002290398012107200141ff01714102470d090c190b200421010b200f4100360200201020042f01063602002020410036020020112004360200201c4100360200201b42003703002002200136029c01200241003602980120024198016a10320c1b0b4200210720194200370300200242003703d00241c9f2c1004117200241d0026a1001201a2019290300370300200220022903d0023703c0020240200241c0026a411041f8b3c200410041001002417f460d002002420037039801200241c0026a411020024198016a41084100100241016a41084d0d0820022903980121070b20194200370300200242003703d00241c9f2c1004117200241d0026a1001201a2019290300370300200220022903d0023703c0022002200737039801200241c0026a411020024198016a410810034120101f2204450d0b2004200229038002370000200441186a2016290300370000200441106a2017290300370000200441086a20182903003700002004412041c000101e2204450d0c2004200742017c37002020204200370300201c4200370300201b420037030020024200370398012004412820024198016a1000200241e0026a41186a22062020290300370300200241e0026a41106a2203201c290300370300200241e0026a41086a2224201b29030037030020022002290398013703e0024120101f2205450d0d200520022903e002370000200541186a22252006290300370000200541106a22262003290300370000200541086a222720242903003700002004101d4116101f2204450d0e2004410e6a2013370000200441086a201437000020042015370000200441164136101e2204450d0f20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a201829030037000020194200370300200242003703d00220044136200241d0026a1001201a2019290300370300200220022903d0023703c002201b41003602002002420137039801200241203602e002200241e0026a20024198016a1062200228029c012206201b28020022246b41204f0d02202441206a22032024490d232006410174221f20032003201f491b221f4100480d232006450d032002280298012006201f101e22030d040c100b200421010b200f2022360200201020042f01063602002020410036020020112004360200201c4100360200201b42003703002002200136029c01200241003602980120024198016a10320c180b20022802980121030c020b201f101f2203450d0c0b2002201f36029c012002200336029801201f21060b201b202441206a221f360200200320246a222841086a2027290000370000202841106a2026290000370000202841186a20252900003700002028200529000037000002400240024002402006201f6b41084f0d00201f41086a2224201f490d2120064101742228202420242028491b22284100480d212006450d01200320062028101e22030d020c0f0b202441286a21240c020b2028101f2203450d0d0b2002202836029c012002200336029801202821060b2003201f6a4200370000200241c0026a411020032024100302402006450d002003101d0b2004101d4120211f4200210741202106200141ff01714102460d100b200241e0026a41186a22042023290300370300200241e0026a41106a22032021290300370300200241e0026a41086a2221201d290300370300200220022903a0023703e002024020014101710d004113101f2204450d0c2004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d0d20042002290380023700132004412b6a2016290300370000200441236a20172903003700002004411b6a201829030037000020194200370300200242003703d00220044133200241d0026a1001201a2019290300370300200220022903d0023703c002200241c0026a411010092004101d201ea72104201e422088a722010d110c120b20202004290300370300201c2003290300370300201b2021290300370300200220022903e002370398014113101f2204450d0d2004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d0e20042002290380023700132004412b6a2016290300370000200441236a20172903003700002004411b6a201829030037000020194200370300200242003703d00220044133200241d0026a1001201a2019290300370300200220022903d0023703c002200241c0026a411020024198016a412010032004101d201ea72104201e422088a722010d100c110b41df88c0004133103a000b411641011020000b413641011020000b4190b3c400102c000b412041011020000b41c00041011020000b412041011020000b411641011020000b413641011020000b201f41011020000b202841011020000b411341011020000b413341011020000b411341011020000b413341011020000b201ea72104201e422088a72201450d010b410020016b2203211d2004210103402001280290022101201d41016a221d0d000b0340200420042f01064102746a4190026a2802002104200341016a22030d000c020b0b200421010b20042f01062103200f2022360200201020033602002020410036020020112004360200201c4100360200201b42003703002002200136029c012002410036029801200241e0026a20024198016a10d7022007211e024020022802e0022204450d000340200241e0026a41146a2802002120200241e0026a41106a28020021212012280200211d20022802e402212202400240024002400240200520062004200241e0026a41086a280200220141f8b3c200410041001014417f460d00200241003a00e0022005200620042001200241e0026a41014100101441016a222441014b221c450d0e02400240024020022d00e002222341037122034102470d00200241003602e002200220233a00e002200520062004200120084103201c101441016a4104490d1141044103202441014b1b211c20022802e00241027622030d010c020b024020034101470d00200241003b01e002200220233a00e002200520062004200120084101201c101441016a22034102490d11201c200341014b6a211c20022f01e0024102762203450d020c010b02402003450d00202341034b0d11200241003602e0022005200620042001200241e0026a4104201c101441016a41044d0d1120022802e0022203417f4c0d1241054104202441014b1b211c20030d010c020b20234102762203450d010b200310792223450d0d20034100200520062004200120232003201c1014221c201c417f461b221c201c20034b1b2003470d0e2023101d201e2003ad7d211e201d0d030c020b200520062004200141014100201c10141a0b201d0d010b2005200620042001101520220d010c020b2005200120042001201d20201016201e2020ad7c211e02402021450d00201d101d0b2022450d010b2004101d0b200241e0026a20024198016a10d70220022802e00222040d000b0b20024198016a103202400240201e2007510d004116101f2204450d0c2004410e6a2013370000200441086a201437000020042015370000200441164136101e2204450d0d20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a201829030037000020194200370300200242003703d00220044136200241d0026a1001201a2019290300370300200220022903d0023703c002201b41003602002002420137039801200220063602e002200241e0026a20024198016a10620240024002400240200228029c012203201b280200221c6b20064f0d00201c20066a2201201c490d0f2003410174221d20012001201d491b221d4100480d0f2003450d012002280298012003201d101e22010d020c120b20022802980121010c020b201d101f2201450d100b2002201d36029c012002200136029801201d21030b201b201c20066a221d3602002001201c6a2005200610ce031a02400240024002402003201d6b41074b0d00201d41086a2206201d490d0f2003410174221c20062006201c491b22064100480d0f2003450d01200120032006101e22010d020c130b200321060c020b2006101f2201450d110b2002200636029c0120022001360298010b2001201d6a201e370000200241c0026a41102001201d41086a100302402006450d002001101d0b2004101d201f0d010c020b201f450d010b2005101d0b20024198016a200241306a10d602200f29030022074202520d000b4200211e20022903182107200241306a103b024020074200510d00200241d0026a41086a22044200370300200242003703d00241aeb9c0004116200241d0026a1001200241c0026a41086a22012004290300370300200220022903d0023703c002200241c0026a411041f8b3c200410041001002417f460d02200242003703a0012002420037039801200241c0026a411020024198016a4110410010022205417f460d0d2005410f4d0d0d200241a0016a2903002107200229039801211e0c030b200241206a290300200241286a2903008450450d0d0b200241206a10f50120024180036a24000f0b420021070b200241186a41086a2903002113200241186a41106a290300211420044200370300200242003703d00241aeb9c0004116200241d0026a100120012004290300370300200220022903d0023703c00220024200200720147d201e201354ad7d2214201e20137d2213201e56201420075620142007511b22041b3703a00120024200201320041b37039801200241c0026a411020024198016a4110100320024180036a24000f0b200341011020000b2023101d0b41df88c0004133103a000b102e000b1021000b411641011020000b413641011020000b201d41011020000b200641011020000b41df88c0004133103a000b41ecc4c300102c000b950603087f017e017f230041d0016b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341c8006c6a41e8026a41c80010ce031a2001410c6a200341016a360200200141086a2004360200200141046a2005360200200241e8006a41186a2006290300370300200241e8006a41106a2008290300370300200241e8006a41086a200929030037030020022002290300370368200241e8006a41206a200241206a41c80010ce031a2000200241e8006a41e80010ce031a200241d0016a24000f0b20004202370320200241d0016a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b2005101d200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b2003101d200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641c8006c6a41e8026a41c80010ce031a200520064102746a4184096a2802002103024020074101460d00410120076b210503402003280280092103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241e8006a41186a2008290300370300200241e8006a41106a2009290300370300200241e8006a41086a200b29030037030020022002290300370368200241e8006a41206a200241206a41c80010ce031a2000200241e8006a41e80010ce031a200241d0016a24000beb0503077f017e017f230041c0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241086a41086a220620052003410c6c6a220741106a2802003602002002200741086a290200370308200241186a41086a220820074194016a2802003602002007418c016a29020021092001410c6a200341016a360200200141086a2004360200200141046a200536020020022009370318200241286a41086a220320062802003602002002413c6a200828020036020020002002290308220937020020022002290318370234200041086a2003290300370200200041106a200241286a41106a29030037020020022009370328200241c0006a24000f0b20004100360200200241c0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad8421090c010b2004ad2109410021030b2005101d2009a72104024002402009422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad8421090c010b2004ad2109410021050b2003101d2009a72104200521032009422088a7220620052f01064f0d000b0b200241086a41086a220820052006410c6c6a220341106a2802003602002002200341086a290200370308200241186a41086a220a20034194016a28020036020020022003418c016a290200370318200520064102746a4194026a2802002103024020074101460d00410120076b210503402003280290022103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241286a41086a220320082802003602002002413c6a200a28020036020020002002290308220937020020022002290318370234200041086a2003290300370200200041106a200241286a41106a29030037020020022009370328200241c0006a24000be30301047f230041d0006b22032400024002404113101f2204450d002004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d01200420022900003700132004412b6a200241186a290000370000200441236a200241106a2900003700002004411b6a200241086a290000370000200341306a41086a220242003703002003420037033020044133200341306a1001200341206a41086a200229030037030020032003290330370320024002400240200341206a411041f8b3c200410041001002417f460d00200341306a41186a4200370300200341306a41106a4200370300200341386a420037030020034200370330200341206a4110200341306a4120410010022202417f460d022002411f4d0d02200341186a2202200341306a41186a290300370300200341106a2205200341306a41106a290300370300200341086a2206200341306a41086a29030037030020032003290330370300200041013a000020002003290300370001200041096a2006290300370000200041116a2005290300370000200041196a20022903003700000c010b200041003a00000b2004101d200341d0006a24000f0b41df88c0004133103a000b411341011020000b413341011020000bc80202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220841086a210920082f0106220741057421044100210a0240024003402004450d0120022009412010d003220b450d02200441606a2104200a41016a210a200941206a2109200b417f4a0d000b200a417f6a21070b2006450d022006417f6a2106200820074102746a4180096a21040c010b0b200841e8026a200a41c8006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a280200280214110100200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b103f000b13002000410336020420004184c5c3003602000b130020004107360204200041e1acc1003602000b130020004108360204200041c0c6c3003602000b130020004105360204200041d8cdc3003602000b130020004108360204200041d3b5c1003602000b130020004108360204200041b4d1c3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242013700000f0b410841011020000bd60904067f027e027f027e230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100222062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241e0006a41186a22062003290300370300200241e0006a41106a22032004290300370300200241e0006a41086a220420052903003703002002200229038001370360200241c0006a41186a22052006290300370300200241c0006a41106a22062003290300370300200241c0006a41086a2203200429030037030020022002290360370340200241186a2005290300370300200241106a2006290300370300200241086a20032903003703002002200229034037030020024200370388012002420037038001200141086a220341002001280200200141046a220428020020024180016a41102007100222062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d0120024180016a41086a22072903002108200229038001210920024180016a41186a220a420037030020024180016a41106a220b4200370300200742003703002002420037038001200141086a220541002001280200200428020020024180016a41202003100222062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241e0006a41186a2206200a290300370300200241e0006a41106a2204200b290300370300200241e0006a41086a220a20072903003703002002200229038001370360200241c0006a41186a22072006290300370300200241c0006a41106a22062004290300370300200241c0006a41086a2204200a29030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2006290300370300200241206a41086a20042903003703002002200229034037032020024200370388012002420037038001200541002001280200200141046a28020020024180016a41102003100222012001417f461b2201411020014110491b20052802006a3602002001410f4d0d0320024180016a41086a2201290300210c200229038001210d20024180016a41186a2206200241186a29030037030020024180016a41106a2203200241106a2903003703002001200241086a290300370300200241e0006a41086a2204200241206a41086a290300370300200241e0006a41106a2205200241206a41106a290300370300200241e0006a41186a2207200241206a41186a290300370300200220022903003703800120022002290320370360200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a200229038001370300200041306a2001290300370300200041386a2003290300370300200041c0006a2006290300370300200041c8006a2002290360370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000b822404027f027e087f037e230041b0056b2203240002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441044b0d00024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141306a2903002105200141286a2903002106200341346a41026a200141076a2d00003a000020034190026a41086a200141186a29020037030020034190026a410d6a2001411d6a290000370000200320012f00053b01342003200141106a29020037039002200141086a28020021072001410c6a280200210820012d00042109200241096a2800002104200241056a280000210a20022d0001210b20022d00002101200341f0026a41026a220c200241046a2d00003a0000200341c0006a41086a220d200241156a290000370300200341c0006a410d6a220e2002411a6a2900003700002003200241026a2f01003b01f00220032002410d6a2900003703402001450d05410121010c060b41c190c200210a41c000210420022d0000450d20200241046a2802004104490d20200128020421044112101f2201450d10200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2201450d1120012004360012200341a0056a41086a22024200370300200342003703a00520014116200341a0056a1001200341c0006a41086a2002290300370300200320032903a005370340200341c0006a411041f8b3c20041004100100221022001101d2002417f460d0a200341a0056a41086a22014200370300200342003703a00541bcbcc1004112200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b00441002101200341b0046a411041f8b3c200410041001002417f460d0c200342103702b4012003200341b0046a3602b001200341c0006a200341b0016a10aa0120032802402202450d17200320032902442206370244200320023602402006a72006422088a72201460d0d0c190b20022d000120022d0000720d02200141186a2903002106200141106a2903002105200141086a2802002104200141206a290300210f20012802042102200341a0056a41086a22014200370300200342003703a0054191bdc1004115200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0044104101f2201450d1320012002360000200341b0046a41102001410410032001101d200341a0056a41086a22014200370300200342003703a00541f5bcc100411c200341a0056a1001200341b0046a41086a22022001290300370300200320032903a0053703b0042003200637034820032005370340200341b0046a4110200341c0006a4110100320014200370300200342003703a00541a8bcc1004114200341a0056a100120022001290300370300200320032903a0053703b0042003200f370340200341b0046a4110200341c0006a4108100320014200370300200342003703a00541cebcc100410d200341a0056a100120022001290300370300200320032903a0053703b0044104101f2201450d1420012004360000200341b0046a41102001410410032001101d0c190b41c190c200210a41c000210420022d0000450d1e200241046a2802004102490d1e200128020421024112101f2201450d10200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2201450d1120012002360012200341a0056a41086a22024200370300200342003703a00520014116200341a0056a1001200341b0046a41086a2002290300370300200320032903a0053703b004200341b0046a411041f8b3c200410041001002417f460d07200342103702a4052003200341b0046a3602a005200341c0006a200341a0056a10e10220032903404201520d1420032802482102200341c0046a200341cc006a41dc0010ce031a200341b0046a41101009200341d0036a200341c0046a41dc0010ce031a200341f0026a200341d0036a41dc0010ce031a2001101d20034190026a200341f0026a41dc0010ce031a200320023602b001200341b0016a41047220034190026a41dc0010ce031a200341206a200341d0016a20032903c001200341c8016a29030010f2012003290320200341286a29030010f3010c180b20022d000120022d000072450d040b41c9b4c000210a412821040c1c0b200341a0056a41026a200c2d00003a0000200341d0036a41086a200d290300370300200341d0036a410d6a200e290000370000200320032f01f0023b01a005200320032903403703d00341012101200b41ff01714101470d00200341f0026a41026a200341a0056a41026a2d00003a0000200341c0006a41086a200341d0036a41086a290300370300200341c0006a410d6a200341d0036a410d6a290000370000200320032f01a0053b01f002200320032903d003370340410021010c010b41f1b4c000210a412a21040b200341b0046a41026a2202200341f0026a41026a2d00003a0000200341c0046a41086a220b200341c0006a41086a220c290300370300200341c0046a41106a200341c0006a41106a290300370300200320032f01f0023b01b004200320032903403703c00420010d19200341c3016a200b290300370000200341c8016a200341c0046a410d6a290000370000200320032f01b0043b01b001200320043600b7012003200a3600b301200320032903c0043700bb01200320022d00003a00b2012002200341346a41026a2d00003a0000200c20034190026a41086a290300370300200341c0006a410d6a220120034190026a410d6a290000370000200320032f01343b01b0042003200329039002370340200941ff01714101470d01200341a0056a200741067610b00120032802a005210220032802a8052007413f7122014d0d042003419c056a41026a200220014105746a220141026a2d00003a0000200341d8036a200141136a290000370300200341dd036a200141186a290000370000200320012f00003b019c052003200129000b3703d00320012800072108200128000321074101210120032802a405450d150c140b200141086a2903002106200141106a2903002105200341a0056a41086a22014200370300200342003703a00541cea8c100410c200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0042003200537034820032006370340200341b0046a4110200341c0006a411010030c120b2003419c056a41026a200341b0046a41026a2d00003a0000200341d0036a41086a200341c0006a41086a290300370300200341d0036a410d6a2001290000370000200320032f01b0043b019c05200320032903403703d0030c140b200341d0036a200341c0046a41dc0010ce031a2001101d0b41bcbdc100210a411921040c150b4100210120032802a4050d0f0c100b2003410036024820034204370340410421020b200141016a220a2001490d0120014101742207200a200a2007491b220aad4202862206422088a70d012006a722074100480d01024002402001450d00200220014102742007101e2202450d010c0c0b2007101f22020d0b0b200741041020000b200341d4006a4101360200200341183602b401200341c0adc4003602b00120034201370244200341c8adc4003602402003200341b0016a360250200341c0006a4194d9c30010cf01000b1021000b411241011020000b412441011020000b411241011020000b412441011020000b410441011020000b410441011020000b41df88c0004133103a000b41df88c0004133103a000b2003200a36024420032002360240200341c8006a28020021010b200341c8006a200141016a360200200220014102746a2004360200200341c0006a10ab012003280244450d002002101d0b4100210a0c040b2002101d0b20010d004101210141d7c0c1002107411521080c010b200341a0056a41026a2003419c056a41026a2d00003a0000200341c0006a41086a200341d0036a41086a290300370300200341c0006a410d6a200341d0036a410d6a290000370000200320032f019c053b01a005200320032903d003370340410021010b2003413c6a41026a2202200341a0056a41026a2d00003a0000200341c0046a41086a2204200341c0006a41086a290300370300200341c0046a41106a200341c0006a41106a290300370300200320032f01a0053b013c200320032903403703c00402402001450d00200821042007210a0c020b200341386a41026a20022d00003a0000200341f0026a41086a2004290300370300200341f0026a410d6a200341c0046a410d6a290000370000200320032f013c3b0138200320032903c0043703f002200341a0056a41086a22014200370300200342003703a00541f5bcc100411c200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004024002400240024002400240024002400240200341b0046a411041f8b3c200410041001002417f460d002003420037034820034200370340200341b0046a4110200341c0006a4110410010022201417f460d022001410f4d0d02200341c8006a290300210f200329034021100c010b420021104200210f0b200341a0056a41086a22014200370300200342003703a0054191bdc1004115200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004024002400240200341b0046a411041f8b3c200410041001002417f460d0020034100360240200341b0046a4110200341c0006a41044100100241016a41044d0d02200335024021110c010b420021110b200341086a200642002011420010d203200341186a200341b0016a201042edeb82bdef9804200329030842c0843d8020032903104200521b22112011201054200f420052200f501b22011b2210200f420020011b220f10cc0102402003280218450d0041dbbcc100210a411a21040c0a0b200341a0056a41086a22014200370300200342003703a00541a6bdc1004116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004410021020240200341b0046a411041f8b3c200410041001002417f460d0020034100360240200341b0046a4110200341c0006a41044100100241016a41044d0d03200328024021020b200341a0056a41086a22014200370300200342003703a00541a6bdc1004116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0042003200241016a360240200341b0046a4110200341c0006a41041003200341c0006a41186a200341b0016a41186a290300370300200341c0006a41106a200341b0016a41106a290300370300200341c0006a41086a200341b0016a41086a290300370300200341c0046a41086a200341f0026a41086a290300370300200341c0046a410d6a200341f0026a410d6a290000370000200320032903b001370340200320032f01383b01d00320032003413a6a2d00003a00d203200320032903f0023703c0044112101f2201450d03200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2204450d0420042002360012200341a0056a41086a22014200370300200342003703a00520044116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0044120101f2201450d0520012003290340370000200141186a200341c0006a41186a290300370000200141106a200341c0006a41106a290300370000200141086a200341c0006a41086a2903003700002001412041c000101e2201450d0620012006370020200141286a2005370000200141c000418001101e2201450d0720012010370050200120032f01d0033b00302001200836003720012007360033200120032903c00437003b200141d8006a200f370000200141326a20032d00d2033a0000200141c3006a200341c0046a41086a290300370000200141c8006a200341cd046a290000370000200341b0046a4110200141e00010032001101d2004101d200341cc006a20023602004100210a200341c0006a41086a41003a00002003410a3a0040200341c0006a108b010c080b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b412441011020000b412041011020000b41c00041011020000b41800141011020000b0b200020043602042000200a360200200341b0056a24000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d01200441012001108b02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d6b6c2004102200220006a41800120006b108c02210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d6b6c2004102200220006a41800120006b108c02210020024180016a240020000f0b2000418001102a000b2000418001102a000b130020004100360204200041f8b3c2003602000b130020004107360204200041ebc1c1003602000b130020004102360204200041f0dac3003602000b7301017f02400240410f101f2202450d00200241076a41002900b4bf41370000200241002900adbf413700002002410f411e101e2202450d012002200036000f20024113200110e8022002101d0240200141046a280200450d002001280200101d0b0f0b410f41011020000b411e41011020000bb30301057f230041306b22032400200341206a41086a220442003703002003420037032020002001200341206a1001200341086a41086a20042903003703002003200329032037030820034100360228200342013703202002280200210020032002280208220236021c2003411c6a200341206a106202400240024002402002450d002002410574210520042802002102200328022021062003280224210103400240024002400240200120026b41204f0d00200241206a22042002490d0720014101742207200420042007491b22074100480d072001450d01200620012007101e22060d020c080b200241206a21040c020b2007101f2206450d060b200721010b200620026a22022000290000370000200241186a200041186a290000370000200241106a200041106a290000370000200241086a200041086a29000037000020042102200041206a2100200541606a22050d000b200341286a200436020020032001360224200320063602200c010b2004280200210420032802242101200328022021060b200341086a411020062004100302402001450d002006101d0b200341306a24000f0b1021000b200741011020000bc20602027f047e230041e0006b22032400200341386a41086a220442003703002003420037033841f1f2c1004116200341386a1001200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041f8b3c200410041001002417f460d0020034200370338200341d0006a4110200341386a41084100100241016a41084d0d02200329033821050c010b42c0843d21050b42002106200341386a41086a220442003703002003420037033841e0f2c1004111200341386a1001200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041f8b3c200410041001002417f460d0020034200370338200341d0006a4110200341386a41084100100241016a41084d0d02200329033821060b0240200520067d20025a0d00200041ebbec10036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841d9f3c1004111200341386a1001200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041f8b3c200410041001002417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010022204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a200542002002420010d203200341286a200242002006420010d203200341086a420042002006420010d20302402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c220820075472450d0020004186bfc10036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a200120032903282008410810f001024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bff0603037f047e037f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a0013703004112101f2204450d01200441106a41002f00ddc5413b0000200441086a41002900d5c541370000200441002900cdc541370000200441124132101e2204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41086a220a4200370300200242003703a00120044132200241a0016a100120024180016a41086a200a290300370300200220022903a0013703800120024180016a411041f8b3c200410041001002417f460d032002421037029401200220024180016a36029001200241a0016a20024190016a10eb0220022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c70010ce031a200241a0016a200241206a41c10010ce031a200241206a200241a0016a41c10010ce031a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a0027200042013703002004101d200324000f0b20004200370300200324000f0b411241011020000b413241011020000b41a49ac20041d700103a000b41df88c0004133103a000bf10a03027f027e077f230041e0016b22022400200241186a200110d501024002402002280218450d00200228021c21032002200110ca022002290300a7450d00200241106a29030021042002290308210541002106200241003a00c00120012802002001280204200241c0016a410120012802081002210720012001280208200741016a41014b22076a22083602082007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220641002001280200200141046a280200200241c0016a41202008100222072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241a0016a41186a22072009290300370300200241a0016a41106a2206200a290300370300200241a0016a41086a2209200b290300370300200220022903c0013703a00120024180016a41186a220a200729030037030020024180016a41106a2207200629030037030020024180016a41086a22062009290300370300200220022903a00137038001200241e0006a41186a200a290300370300200241e0006a41106a2007290300370300200241e0006a41086a20062903003703002002200229038001370360410121060b200241c0006a41186a200241e0006a41186a290300370300200241c0006a41106a200241e0006a41106a290300370300200241c0006a41086a200241e0006a41086a2903003703002002200229036037034041002109200241003a00c0012001280200200141046a280200200241c0016a4101200810022107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220741002001280200200141046a280200200241c0016a41202008100222012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241a0016a41186a22012009290300370300200241a0016a41106a2207200a290300370300200241a0016a41086a2208200b290300370300200220022903c0013703a00120024180016a41186a2209200129030037030020024180016a41106a2201200729030037030020024180016a41086a22072008290300370300200220022903a00137038001200241e0006a41186a2009290300370300200241e0006a41106a2001290300370300200241e0006a41086a20072903003703002002200229038001370360410121090b200241c0016a41186a2201200241e0006a41186a290300370300200241c0016a41106a2207200241e0006a41106a290300370300200241c0016a41086a2208200241e0006a41086a290300370300200220022903603703c001200241206a41186a220a200241c0006a41186a290300370300200241206a41106a220b200241c0006a41106a290300370300200241206a41086a220c200241c0006a41086a290300370300200220022903403703202000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290320370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a20022903c001370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a200241a4016a2f01003b0100200041da006a20022801a001360100200241e0016a24000f0b200041023a0018200241e0016a24000f0b200041023a0018200241e0016a24000b960201017f024002400240024002400240024020004180104f0d00200041037641f8ffffff01714190b4c4006a21010c010b02402000418080044f0d00200041067641606a220141e0074f0d02200141a8b6c4006a2d0000220141c9004b0d0320014103744190c2c2006a21010c010b2000410c7641706a22014180024f0d0320014188bec4006a2d00004106742000410676413f7172220141ff034b0d04200141e0c6c2006a2d0000220141364b0d05200141037441e0cac2006a21010b200129030042012000413f71ad86834200520f0b4188c0c400200141e007104b000b4198c0c400200141ca00104b000b41a8c0c4002001418002104b000b41b8c0c4002001418004104b000b41c8c0c40020014137104b000b2701017f2000280200220128020020012802042000280204280200200028020828020010ee02000bd60801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441f8b3c20041d8b6c20020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4118360200200441e4006a4118360200200441c8006a41146a4121360200200441d4006a4122360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441a8b3c4003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a41d0b3c40010cf01000b20042002200320081b360228200441c8006a41146a4118360200200441d4006a4118360200200441306a41146a41033602002004410236024c20044203370234200441b8b2c4003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a41d0b2c40010cf01000b200441e4006a4118360200200441c8006a41146a4118360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441e0b2c4003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a4180b3c40010cf01000b4190b3c400102c000b8008010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022064f0d014100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2109410020002d0030220320034103461b2203410371450d0220034102460d03410021080c040b2000280218200120022000411c6a28020028020c1100000f0b2000280218200120022000411c6a28020028020c1100000f0b20092108410021090c010b200941016a4101762108200941017621090b417f2103200041046a210a200041186a21062000411c6a210702400340200341016a220320094f0d012006280200200a2802002007280200280210110600450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1100000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110600450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11000021030b20030b4e01017f230041206b22002400200041146a41013602002000411836021c200041c0adc40036021820004201370204200041c8adc4003602002000200041186a360210200041b0dac30010cf01000bb70503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081002210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c050b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100222012001417f461b22014103200141034922011b20042802006a36020020010d022002280208410276ad2106420121070c040b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310022103200141086a22012001280200200341016a220141014b6a36020020014102490d0120022f0108410276ad2106420121070c030b02400240200541027622044104460d0020040d01200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100222012001417f461b22014104200141044922011b20052802006a36020020010d0220023502082106420121070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100222012001417f461b22014108200141084922011b20042802006a36020020010d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031002210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000bd00605057f017e017f027e037f230041306b22022400200241003a0020200241206a2001280200220320012802042204410047220510ce031a0240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d000240024020022d0020220341037122044102460d00024020044101460d0020040d022003410276ad21070c080b200241003a0020200241206a20052006410047220410ce031a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d002041087420037241fcff0371410276ad21070c070b200241003a001e200241003b011c2002411c6a200520064103200641034922081b220410ce031a200141046a200620046b3602002001200520046a36020020080d0120022f011c20022d001e41107472410874200372410276ad21070c060b0240024020034102762204410c460d00024020044104460d0020040d0220024100360220200241206a200520064104200641044922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d03200235022021070c080b4200210a20024200370320200241206a200520064108200641084922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d03200229032021070c070b4200210a2002420037032820024200370320200241206a200520064110200641104922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d02200241286a2903002109200229032021074201210a0c070b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0020200241206a20052006410047220410ce031a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100204200200341037441f8007110d303200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c070b0b4200210a0b0c040b20052004102a000b20042006102a000b20042006102a000b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b970a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d05200128020020002006101e2205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d08200128020020052000101e2205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000101e22050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005101e22080d0a0c110b2006101f22050d130b200641011020000b200128020021050c050b200128020021080c070b2000101f22050d0d0b200041011020000b2000101f2205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b2005101f2208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009101e22060d020c060b200128020021060c020b2009101f2206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b1021000b200941011020000b41e8dcc300102c000b20022002360240200241e0c2c100360244200241c8006a41146a4100360200200241286a41146a411c360200200241346a4123360200200241106a41146a4103360200200241f8b3c2003602582002420137024c200241d8dac3003602482002412336022c20024203370214200241e0b0c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a4180ddc30010cf01000b200041011020000b200541011020000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce00420010d1032002200229031022072006290300220842f0b17f427f10d203200241206a20006a2203417c6a200520022903007ca7220941e4006e220a41017441aab4c2006a2f00003b00002003417e6a200a419c7f6c20096a41017441aab4c2006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141d6b6c2004102200241206a20006a41800120006b108c022100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141d6b6c2004102200241206a20006a41800120006b108c022100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441aab4c2006a2f00003b0000200941094a0d030c040b2000418001102a000b2000418001102a000b2003220941094c0d010b200241206a2000417e6a22006a200941017441aab4c2006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141f8b3c2004100200241206a20006a412720006b108c022100200241a0016a240020000bf40a040c7f027e027f077e23004190036b22022400200241086a2001280200200128020428020c1103000240024020022903084201520d00200241e4016a41046a2103200241a0026a41106a2104200241a0016a4101722105200241086a41086a2106200241a0026a41206a2107200241c4026a21082002419c026a21090340200241f8016a41186a220a200641186a290000370300200241f8016a41106a220b200641106a290000370300200241f8016a41086a220c200641086a290000370300200220062900003703f801200241a0016a200241f8016a10f60202400240024020022d00a0014101470d00200241f0026a41186a200541186a290000370300200241f0026a41106a200541106a290000370300200241f0026a41086a200541086a290000370300200220052900003703f002200241a0026a200241f0026a10c9022007280200220d450d01200241a0026a41086a290300210e20022903a002210f2008280200450d02200d101d0c020b200741003602000b4200210f4200210e0b20034200370200200341086a4200370200200241f0026a41186a220d200a290300370300200241f0026a41106a220a200b290300370300200241f0026a41086a2210200c290300370300200220022903f8013703f002200241a0026a41086a22114200370300200b200241e4016a41106a280200360200200c200241e4016a41086a290200370300200420022903f002370300200441086a2010290300370300200441106a200a290300370300200441186a200d290300370300200242003703a002200220022902e4013703f801427f2112024002400240200e42ffffffff0f560d00200f422088200e422086842212500d010b200241d0016a41106a200b280200360200200241d0016a41086a200c290300370300200241a0016a41086a2011290300370300200241a0016a41106a2004290300370300200241a0016a41186a200241a0026a41186a290300370300200241a0016a41206a2007290300370300200241a0016a41286a200241a0026a41286a290300370300200220022903f8013703d001200220022903a0023703a0012002200928000036009b01200220022800990236029801420021134100210b200f2114200e21150c010b4102210b2016210f2017210e201821120b20024180016a41106a200241d0016a41106a28020036020020024180016a41086a200241d0016a41086a290300370300200241d0006a41086a200241a0016a41086a290300370300200241d0006a41106a200241a0016a41106a290300370300200241d0006a41186a200241a0016a41186a290300370300200241d0006a41206a200241a0016a41206a290300370300200241d0006a41286a200241a0016a41286a290300370300200220022903d00137038001200220022903a0013703502002200228009b0136004b2002200228029801360248200b4102470d02200241086a2001280200200141046a28020028020c110300200f2116200e21172012211820022903084201510d000b0b200041023a00800120024190036a24000f0b200020143703102000200f370300200020123703402000410036022820004208370320200020022903800137022c20002002290350370350200041186a20153703002000200e370308200041c8006a2013370300200041346a20024180016a41086a2903003702002000413c6a20024180016a41106a280200360200200041d8006a200241d0006a41086a290300370300200041e0006a200241d0006a41106a290300370300200041e8006a200241d0006a41186a290300370300200041f0006a200241f0006a290300370300200041f8006a200241f8006a2903003703002000200b3a008001200020022802483600810120004184016a200228004b36000020024190036a24000bd10301047f230041d0006b2202240002400240410e101f2203450d00200341066a41002900b3c541370000200341002900adc5413700002003410e412e101e2203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241306a41086a22014200370300200242003703302003412e200241306a1001200241206a41086a200129030037030020022002290330370320024002400240200241206a411041f8b3c200410041001002417f460d00200241306a41186a4200370300200241306a41106a42003703002001420037030020024200370330200241206a4110200241306a4120410010022201417f460d022001411f4d0d02200241186a2201200241306a41186a290300370300200241106a2204200241306a41106a290300370300200241086a2205200241306a41086a29030037030020022002290330370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b2003101d200241d0006a24000f0b41df88c0004133103a000b410e41011020000b412e41011020000b860100024002400240024002400240200041ff017122004101460d0020004102470d014101101f2200450d03200041023a00000c020b4101101f2200450d03200041013a00000c010b4101101f2200450d03200041003a00000b200128020020012802042000410110032000101d0f0b410141011020000b410141011020000b410141011020000bb20201027f230041106b22022400200241003602082002420137030002404120101f2203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210f3022002200041106a36020c2002410c6a200210f302200028022021032002200041286a280200220036020c2002410c6a2002106202402000450d002003200041186c6a210003402002200336020c2002410c6a200210f302200341106a200210b1012000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100302402003450d002000101d0b200241106a24000f0b412041011020000bfa0801067f230041106b220224002002410036020820024201370300200041106a200210622002200036020c2002410c6a200210f30220022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d03200228020020042003101e2205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d04200228020020042003101e2205450d050c060b200228020021050c080b200228020021050c050b2003101f22050d050b200341011020000b2003101f22050d010b200341011020000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d01200520032007101e2205450d020c030b200441206a21060c030b2007101f22050d010b200741011020000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d01200520032004101e2205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d02200520032000101e2205450d030c040b2004101f22050d050b200441011020000b2000101f22050d010b200041011020000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010032004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d01200228020020052006101e2203450d020c040b200228020021030c040b2006101f22030d020b200641011020000b1021000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610032005450d010b2003101d0b200241106a24000b13002000410f360204200041dcdec3003602000b130020004107360204200041dbd6c1003602000bb50707057f047e017f017e037f047e017f230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100222062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d00200241e0006a41186a2003290300370300200241e0006a41106a2004290300370300200241e0006a41086a20052903003703002002200229038001370360200241c8006a200110ca022002290348a7450d01200241c8006a41106a290300210720022903502108200241306a200110ca022002290330a7450d02200241c0006a29030021092002290338210a200241286a200110d5012002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d032006101f220d450d06200b450d040c070b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b102e000b200641081020000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a200110ca022002290310a7450d01200e2903002110200229031821112002200110f1022002290300a7450d01200341016a21062002290308211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d20042014101e220d0d010c070b2014101f220d450d060b200d20046a2203201037030820032011370300200341106a2012370300200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d101d0c010b200d450d0020024180016a41186a2201200241e0006a41186a29030037030020024180016a41106a2206200241e0006a41106a29030037030020024180016a41086a2203200241e0006a41086a2903003703002002200229036037038001200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a200229038001370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241a0016a24000f0b20004100360220200241a0016a24000f0b1021000b201441081020000b13002000411836020420004198eac3003602000bf30301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10f3022002200336023c2002413c6a200241306a10f3022002280220210320022004280200220436023c2002413c6a200241306a10620240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009101e22070d020c070b200441206a2108200228023021070c020b2009101f2207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a10f302200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a280200101d0b200241c0006a24000f0b1021000b200941011020000b7101017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10622002200241086a36022c2002412c6a200241206a10f302200041086a200228022836020020002002290320370200200241306a24000b3301017f02404108101f2202450d0020004288808080800137020420002002360200200242e8073700000f0b410841011020000b3401017f02404104101f2202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c000370204200020023602002002413c3600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241043600000f0b410441011020000beb0504017f037e057f017e230041b0016b22032400200241106a290300210420024188016a290300210520022903082106200228020021072003200241186a41f00010ce0321022001280200210820024190016a41186a2209200241e8006a29030037030020024190016a41106a220a200241e0006a29030037030020024190016a41086a220b200241d8006a290300370300200220022903503703900102400240024041d000101f2201450d00200142003703002001410036022420012007360220200141003a0048200141186a4200370300200141106a4200370300200141086a42003703002001200241d0006a2203290300370328200141306a200341086a290300370300200141386a200341106a290300370300200141c0006a200341186a290300370300200241f0006a41086a200b290300370300200241f0006a41106a200a290300370300200241f0006a41186a200929030037030020022002290390013703700240024002400240200841046a28020020082802082203470d00200341016a22072003490d0320034101742209200720072009491b2209ad42d0007e220c422088a70d03200ca7220a4100480d032003450d012008280200200341d0006c200a101e2207450d020c050b200828020021070c050b200a101f22070d030b200a41081020000b1021000b41d00041081020000b20082007360200200841046a2009360200200841086a28020021030b2007200341d0006c6a220342003703102003420037030820032006422088200442208684427f2004428080808010541b370300200320013602202003200229037037022c200341186a4200370300200341246a428180808010370200200341c4006a200241f0006a41186a2903003702002003413c6a200241f0006a41106a290300370200200341346a200241f0006a41086a290300370200200841086a2201200128020041016a3602002000200437030820002006370300200041106a200241f00010ce031a2000200537038001200241b0016a24000b0900200042003702000bc50603037f047e037f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370358200220063703502002200737034820022008370340200141246a2d00002109200241a0016a41176a22042002290058370000200241a0016a41106a220a2002290051370300200241a0016a41086a220b2002290049370300200220022900413703a00102400240024002402008a741ff01714101470d00200241106a41176a2004290000370000200241106a41106a200a290300370300200241106a41086a200b290300370300200220022903a0013703104112101f2204450d01200441106a41002f00cbc5413b0000200441086a41002900c3c541370000200441002900bbc541370000200441124132101e2204450d0220042002290310370012200420093a0031200441296a200241106a41176a220a290000370000200441226a200241106a41106a2903003700002004411a6a200241106a41086a290300370000200241a0016a41086a220b4200370300200242003703a00120044132200241a0016a1001200241c0006a41086a200b290300370300200220022903a001370340200241a0016a200241c0006a105d20022d00ac014102460d03200241c0006a200241a0016a41d00010ce031a200241306a41086a220b200241c0006a41086a28020036020020022002290340370330200241a0016a200241cc006a41c20010ce031a200141046a220141206a200241e1016a2d00003a0000200141186a200241d9016a290000370000200141106a200241d1016a290000370000200141086a200241a0016a41296a290000370000200120022900c10137000020002002290310370000200041086a200241106a41086a290300370000200041106a200241106a41106a290300370000200041176a200a290000370000200020093a001f200041286a200b280200360200200020022903303702202004101d200324000f0b20004100360220200324000f0b411241011020000b413241011020000b41a49ac20041d700103a000be10c04037f017e1b7f027e230041f0026b2204240002400240410d101f2205450d00200541056a41002900e1ee41370000200541002900dcee413700002005410d412d101e2205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41086a22064200370300200442003703a0022005412d200441a0026a1001200441e0016a41086a2006290300370300200420042903a0023703e001024002400240024002400240200441e0016a411041f8b3c200410041001002417f460d00200441003a00a002200441e0016a4110200441a0026a41014100100241016a41014d0d0520042d00a002220641034f0d052005101d20064101460d0320064102470d01200441a0026a200110f60220042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a2002200310ee0120043502384201852102200441386a41106a2903002103200441386a41086a29030021070c040b2005101d0b200441f8006a200110f60220042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2208290000370300200420042900793703a001200441a0026a200441a0016a10c902200441c0016a41186a22092005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2008290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2009290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2208200441a0026a41106a2209290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2008290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002008201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002009200829030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220092009290300220720027c22233703002011201129030020037c2023200754ad7c37030020062903002107200420042903a002222320027c22243703a0022006200720037c2024202354ad7c370300200441c0016a20012002200310ee0120043502c0012102200a2903002103200b2903002107200441f8006a200441a0026a10880302402005280200450d00200441a0026a41206a280200101d0b200242018521020c020b420021020c010b200441a0026a20012002200310ee0120043502a0024201852102200441b0026a2903002103200441a8026a29030021070b2000200737030820002002370300200041106a2003370300200441f0026a24000f0b41df88c0004133103a000b410d41011020000b412d41011020000b9b0201027f230041306b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f10d00102400240410e101f2203450d00200341066a41002900e5c541370000200341002900dfc5413700002003410e412e101e2203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241206a41086a22004200370300200242003703202003412e200241206a1001200241106a41086a200029030037030020022002290320370310200241103602242002200241106a3602202001200241206a10f8022003101d200241306a24000f0b410e41011020000b412e41011020000b02000bec0301087f23004180016b22032400200341c0006a200110ea020240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110ea0220032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000b92db0109037f027e067f047e027f027e037f017e127f230041f0046b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410e4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0f00090607030a0c080f050d02040b01000b200141306a2903002106200141286a290300210720012d00012108200341d0026a41026a200141076a2d00003a0000200341c0046a41086a200141186a290200370300200341c0046a410d6a2001411d6a2900003700002003200141056a2f00003b01d0022003200141106a2902003703c004200141046a2d00002109200141086a280200210a2001410c6a280200210b20022d0001210c20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d1c410121040c1d0b200141086a2802002109200141046a280200210820022d000120022d000072450d0e4100210a2009450d0c2008101d20012d000021040c0c0b4101210a20022d000120022d0000720d0b200141046a2802002102200341e0046a41086a22054200370300200342003703e00441faedc1004116200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200320023602e003200341d0036a4110200341e0036a410410030c8a010b200141106a2903002106200141086a2903002107200141186a280200210d20022d0001210a20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0d410121040c0e0b4101210a20022d000120022d0000720d0920012d00012104200341e0046a41086a22054200370300200342003703e00441e0d7c1004115200341e0046a1001200341d0036a41086a220a2005290300370300200320032903e0043703d00341002102200341d0036a411041f8b3c20041001003200320043a00e00320054200370300200342003703e00441e9a4c1004119200341e0046a1001200a2005290300370300200320032903e0043703d0034101210a200341d0036a4110200341e0036a410110034101210c20012d00002204410f4d0da3010ca4010b4101210a20022d000120022d0000720d08200141086a2903002106200341e0046a41086a22024200370300200342003703e00441e0edc100411a200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200320063703e003200341d0036a4110200341e0036a410810030c87010b200141106a2903002106200141086a290300210e20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0d410121040c0e0b20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0f410121040c100b20012d0001210d20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d11410121040c120b200141106a2903002106200141086a290300210720022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d16410121040c170b2001410c6a280200210a200141086a280200210b200141046a280200210d20022d0001210c20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d18410121040c190b4101210a20022d000120022d0000720d02200141046a2802002102200341e0046a41086a22054200370300200342003703e0044189d7c1004119200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200320023602e003200341d0036a4110200341e0036a410410030c81010b20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d19410121040c1a0b4101210a20022d000120022d000072450d1b0b41c9b4c000210241282105200441ff01712204410f4b0d23410120047441beff01710d9b0120044106460d242004410f470d23200a450d9b01200141086a280200450d9b01200141046a280200101d0c9b010b20034190016a41026a200141076a2d00003a0000200341206a41086a200141186a290200370300200341206a410d6a2001411d6a2900003700002003200141056a2f00003b0190012003200141106a290200370320200141046a2d00002109200141086a280200210d2001410c6a280200210b20022d0001210a20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d1a410121040c1b0b2001410c6a2802002102200341e0046a41086a22054200370300200342003703e00441e2d6c1004115200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341003602e803200342013703e003200320023602e001200341e0016a200341e0036a10622002450d262002410574210c200341e0036a41086a280200210520032802e003210d20032802e403210a2008210203400240024002400240200a20056b41204f0d00200541206a22042005490d9401200a410174220b20042004200b491b220b4100480d9401200a450d01200d200a200b101e220d0d020c490b200541206a21040c020b200b101f220d450d470b200b210a0b200d20056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102200c41606a220c0d000b200341e8036a20043602002003200a3602e4032003200d3602e0030c270b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d8401200341d3046a200c290300370000200341c0046a41186a200341bd036a290000370000200320032f0194013b01c004200320053600c704200320023600c304200320032903b0033700cb042003200a2d00003a00c204200341e0036a200341c0046a10c9022003280280042202450d1b200341b0036a41086a220a200341e0036a41346a290200370300200341b0036a41106a2204200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210b200341e0036a41286a2802002109200341e0036a410c6a350200210f200341e0036a41186a290300210e20032802e003210820032902e403211020032903f00321112003280284042105200341c0006a41186a2212200c290300370300200341c0006a41106a220c2004290300370300200341c0006a41086a2213200a290300370300200320032903b003370340200341e0016a41186a200e370300200341e0016a410c6a200f3e0200200341e0016a41286a200936020020034184026a2005360200200341e0016a41346a2013290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a2012290300370200200320113703f001200320103702e4012003200236028002200320083602e0012003200b3602ac022003200329034037028c02200d410a4d0d2202402005450d002002101d0b41f8f0c1002102411b21050c84010b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d8101200341ab016a200c29030037000020034198016a41186a200341bd036a290000370000200320032f0194013b0198012003200536009f012003200236009b01200320032903b0033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042205450d18200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a29020037030020032003418c046a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a3502002110200341e0036a41186a290300210720032802e003210920032902e403211120032903f003210f2003280284042102200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2007370300200341e0016a410c6a20103e0200200341e0016a41286a200b36020020034184026a2002360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a20082903003702002003200f3703f001200320113702e4012003200536028002200320093602e0012003200d3602ac022003200329034037028c02200f200e200f200e54200720065420072006511b22051b220e2007200620051b220684500d6b200341e0016a41106a200f200e7d370300200341f8016a200720067d200f200e54ad7d370300200341e0046a41086a22024200370300200342003703e00441c4b9c000411b200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342003703e803200342003703e003200341d0036a4110200341e0036a4110410010022202417f460d472002410f4d0d47200341f0016a2202290300220f20032903e0035a200341f8016a22052903002207200341e8036a29030022105a20072010511b0d002005420037030020024200370300200720067c200f200e7c220e200f54ad7c21060b200341e0046a41086a22024200370300200342003703e00441ceedc1004112200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003420021070240200341d0036a411041f8b3c200410041001002417f460d00200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d4120032903e00321070b20024200370300200342003703e00441e1f0c1004117200341e0046a100120052002290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d29200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d4120032903e003210f0c2a0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034194016a41026a220a200341c0006a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01403b019401200320032903e0033703b00320040d7e200341f3016a200c290300370000200341e0016a41186a200341bd036a290000370000200320032f0194013b01e001200320053600e701200320023600e301200320032903b0033700eb012003200a2d00003a00e201200341e0036a200341e0016a10c902200328028004220c450d15200341b0036a41086a220220034194046a290200370300200341b0036a41106a22052003419c046a290200370300200341b0036a41186a2204200341a4046a29020037030020032003418c046a2902003703b003200341e0036a41186a290300211420034188046a280200210d200341ec036a350200210620032903f0032115200328028404210920033502e003210f20032902e403210720034190036a41186a200429030037030020034190036a41106a200529030037030020034190036a41086a2002290300370300200320032903b0033703900342002110200341e0046a41086a22024200370300200342003703e00441ceedc1004112200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d3d20032903e00321100b200642208620074220888421062007422086200f8421070240200d41186c2202450d00200c20026a210a200241686a2105200c21020340200241086a290300210e2002290300210f2010200241106a2903002211540d2342002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22041b21064200200f20041b2107200541686a2105200241186a2202200a470d000b0b410821044100210d2009450d23200c101d4100210b0c2d0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d7b200341d3006a200c290300370000200341c0006a41186a200341b0036a410d6a290000370000200320032f0194013b01402003200536004720032002360043200320032903b00337004b2003200a2d00003a0042200341e0036a200341c0006a10c9022003280280042205450d12200341b0036a41086a220220034194046a290200370300200341b0036a41106a22042003419c046a290200370300200341b0036a41186a220a200341a4046a29020037030020032003418c046a2902003703b003200328028404210c200341e0016a41186a200a290300370300200341e0016a41106a2004290300370300200341e0016a41086a2002290300370300200320032903b0033703e001410d101f2202450d3e200241056a41002900e1ee41370000200241002900dcee413700002002410d412d101e2202450d3f200220032903e00137000d200241256a200341f8016a2903003700002002411d6a200341e0016a41106a290300370000200241156a200341e0016a41086a290300370000200341e0046a41086a22044200370300200342003703e0042002412d200341e0046a1001200341d0036a41086a2004290300370300200320032903e0043703d003200341103602e4032003200341d0036a3602e003200d200341e0036a10f7022002101d200c450d702005101d0c700b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200c41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200341f0026a410d6a290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b200341d0036a41026a220c200341e0016a41026a2d00003a000020034190036a41086a220d200341e0036a41086a29030037030020034190036a41106a200341e0036a41106a290300370300200320032f01e0013b01d003200320032903e0033703900320040d78200341d3006a200d290300370000200341d8006a2003419d036a290000370000200320032f01d0033b01402003200536004720032002360043200320032903900337004b2003200c2d00003a0042410e101f2202450d39200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d3a2002200329034037000e200241266a200341d8006a2903003700002002411e6a200341c0006a41106a290300370000200241166a200341c0006a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f460d1541b2f0c1002102411421050c780b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034198016a41026a220a200341c0006a41026a2d00003a0000200341e0016a41086a220c200341e0036a41086a290300370300200341e0016a41106a200341e0036a41106a290300370300200320032f01403b019801200320032903e0033703e00120040d75200341d3046a200c290300370000200341d8046a200341e0016a410d6a290000370000200320032f0198013b01c004200320053600c704200320023600c304200320032903e0013700cb042003200a2d00003a00c204200341e0036a200341c0046a10f6024101210420032d00e0034101470d0a20034196016a20032d00e3033a0000200341b0036a41086a200341f4036a290200370300200341b0036a410d6a200341f9036a290000370000200320032f00e1033b0194012003200341ec036a2902003703b003200341e0036a41086a28020021054100210420032802e40321020c0b0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a22092004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200c41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a2009290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220c200341e0016a41026a2d00003a0000200341b0036a41086a2209200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d7f200341d3046a2009290300370000200341c0046a41186a200341bd036a290000370000200320032f0194013b01c004200320053600c704200320023600c304200320032903b0033700cb042003200c2d00003a00c204200341e0036a200341c0046a10c9022003280280042208450d0e200341b0036a41086a2202200341e0036a41346a290200370300200341b0036a41106a2205200341e0036a413c6a290200370300200341b0036a41186a2204200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210c200341e0036a41286a2802002109200341e0036a410c6a3502002106200341e0036a41186a290300210720032802e003211320032902e403210f20032903f003210e2003280284042112200341e0016a41186a22162004290300370300200341e0016a41106a22042005290300370300200341e0016a41086a22052002290300370300200320032903b0033703e001200341c0006a41186a2007370300200341c0006a410c6a20063e0200200341c0006a41286a2009360200200341c0006a41246a2012360200200341c0006a41346a2005290300370200200341c0006a413c6a2004290300370200200341c0006a41c4006a20162903003702002003200e3703502003200f37024420032008360260200320133602402003200c36028c01200320032903e00137026c200a450d14200d200a41246c22026a21172002450d18200341f0026a41026a2202200d41036a2d00003a0000200341e0036a41086a220c200d41146a290000370300200341e0036a410d6a2209200d41196a2900003700002003200d2f00013b01f0022003200d29000c3703e003200d41246a2104200d2d000022134102460d19200d2800082118200d2800042105200341e0046a41026a20022d00003a000020034198016a41086a200c29030037030020034198016a410d6a2009290000370000200320032f01f0023b01e004200320032903e0033703980120134101470d24200341b0036a200541067610b00120032802b003210c20032802b8032005413f7122024d0d26200341d0036a41026a200c20024105746a220241026a2d00003a0000200228000321052002280007211820022f000021092003419d036a200241186a29000037000020034198036a200241136a290000370300200320093b01d0032003200229000b370390034101210220032802b403450d740c730b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d6f200341ab016a200c29030037000020034198016a41186a200341bd036a290000370000200320032f0194013b0198012003200536009f012003200236009b01200320032903b0033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042202450d06200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a3502002106200341e0036a41186a290300210720032802e003210920032902e403210f20032903f003210e2003280284042105200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2007370300200341e0016a410c6a20063e0200200341e0016a41286a200b36020020034184026a2005360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a20082903003702002003200e3703f0012003200f3702e4012003200236028002200320093602e0012003200d3602ac022003200329034037028c02200341e0016a412c6a220410e401200410e5012005450d642002101d0c640b200141086a2903002106200341e0046a41086a22024200370300200342003703e00441e1f0c1004117200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200320063703e003200341d0036a4110200341e0036a410810030c630b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200341f0026a410d6a290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034198016a41026a220a200341c0006a41026a2d00003a0000200341e0016a41086a220c200341e0036a41086a290300370300200341e0016a41106a200341e0036a41106a290300370300200320032f01403b019801200320032903e0033703e00120040d6b200341c3026a200c290300370000200341c8026a200341e0016a410d6a290000370000200320032f0198013b01b002200320053600b702200320023600b302200320032903e0013700bb022003200a2d00003a00b202200341e0036a200341b0026a10f6024101210420032d00e0034101470d03200341d2036a20032d00e3033a000020034190036a41086a200341f4036a29020037030020034190036a410d6a200341f9036a290000370000200320032f00e1033b01d0032003200341ec036a29020037039003200341e0036a41086a28020021054100210420032802e40321020c040b410b210541c6f0c10021020b200341d0036a41026a220a20034194016a41026a2d00003a000020034190036a41086a220c200341b0036a41086a29030037030020034190036a41106a200341b0036a41106a290300370300200320032f0194013b01d003200320032903b0033703900320040d69200341ab016a200c29030037000020034198016a41186a2003419d036a290000370000200320032f01d0033b0198012003200536009f012003200236009b0120032003290390033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042205450d00200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a29020037030020032003418c046a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a350200210f200341e0036a41186a290300211020032802e003210920032902e403210e20032903f00321112003280284042102200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2010370300200341e0016a410c6a200f3e0200200341e0016a41286a200b36020020034184026a22042002360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a2008290300370200200320113703f0012003200e3702e4012003200536028002200320093602e0012003200d3602ac022003200329034037028c02200341106a200341c0046a10eb0102402003290310220f20032903e00122147d2215200f56200341106a41086a290300220e200341e0016a41086a29030022197d200f201454ad7d220f200e56200f200e511b0d00200341e0016a41106a200720152015200756200f200656200f2006511b22021b220720117c220e370300200341f8016a2006200f20021b220620107c200e200754ad7c3703002003200720147c220f3703e0012003200620197c200f200754ad7c3703e80120034198016a200341e0016a108803200428020021020b2002450d5e20034180026a280200101d0c5e0b41d1f0c1002102411021050c680b410b210541c6f0c10021020b20034198016a41026a220a200341d0036a41026a2d00003a0000200341e0016a41086a220c20034190036a41086a290300370300200341e0016a41106a20034190036a41106a290300370300200320032f01d0033b01980120032003290390033703e00120040d66200341e3026a200c290300370000200341e8026a200341e0016a410d6a290000370000200320032f0198013b01d002200320053600d702200320023600d302200320032903e0013700db022003200a2d00003a00d202200341e0046a41026a20034190016a41026a2d00003a000020034198016a41086a200341206a41086a29030037030020034198016a410d6a2202200341206a410d6a290000370000200320032f0190013b01e0042003200329032037039801200941ff01714101470d07200341e0036a200d41067610b00120032802e003210520032802e803200d413f7122024d0d10200341d0036a41026a200520024105746a220241026a2d00003a00002002280003210d2002280007210b20022f000021042003419d036a200241186a29000037000020034198036a200241136a290000370300200320043b01d0032003200229000b370390034101210220032802e403450d560c550b200141086a280200450d77200141046a280200101d0c770b200141086a280200450d76200141046a280200101d0c760b4110210541d1f0c10021024100210c4101210a200b0d710c720b200341e0046a41026a2202200341d0026a41026a2d00003a000020034198016a41086a200341c0046a41086a29030037030020034198016a410d6a2205200341c0046a410d6a290000370000200320032f01d0023b01e004200320032903c00437039801200941ff01714101470d06200341e0036a200a41067610b00120032802e003210520032802e803200a413f7122024d0d0e200341d0036a41026a200520024105746a220241026a2d00003a00002002280003210a2002280007210b20022f000021042003419d036a200241186a29000037000020034198036a200241136a290000370300200320043b01d0032003200229000b370390034101210220032802e403450d4e0c4d0b200341e0016a412c6a220510e501200320063703b803200320073703b0032003200d3602c0034112101f2202450d27200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d28200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341e0046a41086a220a4200370300200342003703e00420024132200341e0046a1001200341d0036a41086a200a290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d0c200342103702442003200341d0036a360240200341e0036a200341c0006a10eb0220032d00f803220a4102460d2b200341a8036a20034191046a290000370300200341a0036a20034189046a29000037030020034190036a41086a20034181046a2900003703002003413c6a41026a2003419c046a2d00003a0000200341b0026a41086a200341ad046a290000370300200341bd026a200341b2046a290000370000200320032900f9033703900320032003419a046a2f01003b013c2003200341a5046a2900003703b00220034199046a2d0000210d2003419d046a280000210b200341a1046a28000021090c420b200341e8036a280200210420032802e403210a20032802e003210d0b200341d0036a4110200d200410030240200a450d00200d101d0b4101210c02402009450d002008101d0b4100210a0c660b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a2002290000370000200320032f01e0043b01d0032003200329039801370390030c4f0b41b2f2c100210241172105410121042012450d690c680b4118101f2204450d252004200f370300200420113703102004200e3703082005450d09200241186a2105200c200d41186c6a41686a21124101210d4101210b03402005210202400340200241086a290300210e2002290300210f2010200241106a2903002211540d0142002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22051b21064200200f20051b2107200241186a2202200a470d000c0d0b0b0240200b200d470d00200d41016a2205200d490d66200d410174220b20052005200b491b220bad42187e2219422088a70d662019a722054100480d660240200d450d002004200d41186c2005101e22040d010c270b2005101f2204450d260b200241186a21052004200d41186c6a2208200e3703082008200f37030020082011370310200d41016a210d20122002470d000c0b0b0b200341d0036a41026a20022d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a2005290000370000200320032f01e0043b01d0032003200329039801370390030c480b4100210b0c090b201721040b4100210c4101210241002113410021054100450d5c0c5d0b42e807210f0b024020034188026a280200220220034184026a280200470d00200241016a22052002490d5f20024101742204200520052004491b2204ad42187e2210422088a70d5f2010a7220a4100480d5f2002450d0720034180026a280200200241186c200a101e2205450d080c3f0b20034180026a28020021050c3f0b4100210220032802e4030d440c450b200341e0046a41086a220a4200370300200342003703e00441c8d8c100411a200341e0046a1001200341d0036a41086a220c200a290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d07200341f8036a4200370300200341e0036a41106a4200370300200341e0036a41086a4200370300200342003703e003200341d0036a4110200341e0036a412041001002220a417f460d1f200a411f4d0d1f200341e0046a41026a220d20032d00e2033a0000200341f0026a41086a220a200341f3036a290000370300200341f0026a410d6a220c200341f8036a290000370000200320032f01e0033b01e004200320032900eb033703f00220032800e303210b20032800e703210920034190016a41026a2208200d2d00003a0000200341d0026a41086a220d200a290300370300200341d0026a410d6a2212200c290000370000200320032f01e0043b019001200320032903f0023703d00220034194016a41026a20082d00003a0000200a200d290300370300200c2012290000370000200320032f0190013b019401200320032903d0023703f0024112101f220a450d20200a41106a41002f00ddc5413b0000200a41086a41002900d5c541370000200a41002900cdc541370000200a41124132101e220a450d21200a20032f0194013b0012200a2009360019200a200b360015200a20032903f00237001d200a41146a20034194016a41026a2d00003a0000200a41256a200341f0026a41086a290300370000200a412a6a200341fd026a290000370000200341e0046a41086a220c4200370300200342003703e004200a4132200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d222003421037029c012003200341d0036a36029801200341e0036a20034198016a10eb0220032d00f803220c4102460d23200341e0036a41086a290300210620032802f003210d20032903e0032107200341c0006a200341f9036a41c70010ce031a20034198016a200341c0006a41c10010ce031a2003200c3a00e003200341e0036a41017220034198016a41c10010ce031a200341dc006a20034182046a410020032d0081044101461b3602002003200637034820032007370340200320053602582003200d360250200341e0046a41086a220c4200370300200342003703e004200a4132200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341003602a0012003420137039801200341d0006a20034198016a10622003200341c0006a360220200341206a20034198016a10f302200328029c01210c20032802a001210d20032802582213450d09200c200d470d0a200d41016a220c200d490d5c200d4101742208200c200c2008491b220c4100480d5c200d450d0c200328029801200d200c101e2208450d0d0c270b4100210220032802e4030d3e0c3f0b4101210d4101210b0b2009450d00200c101d0b200341e0036a41186a201437030020034188046a200d36020020034184046a2202200b360200200341a4046a20034190036a41186a2903003702002003419c046a200341a0036a29030037020020034194046a20034198036a290300370200200320153703f003200320073703e003200320032903900337028c042003200436028004200320063703e803200341e0016a200341e0036a1088032002280200450d4520034180046a280200101d0c450b200a101f22050d370b200a41081020000b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a20034198016a410d6a290000370000200320032f01e0043b01d0032003200329039801370390030c500b200a4200370300200342003703e00441c8d8c100411a200341e0046a1001200c200a290300370300200320032903e0043703d0034120101f220a450d1c200a2005290000370000200a41186a200541186a290000370000200a41106a200541106a290000370000200a41086a200541086a290000370000200341d0036a4110200a41201003200a101d4100210d0c2c0b4100210220032802b4030d4c0c4d0b200c200d470d01200d41016a220c200d490d52200d4101742208200c200c2008491b220c4100480d52200d450d04200328029801200d200c101e2208450d050c1b0b20032802980121080c1d0b20032802980121080c1a0b200c101f22080d1a0b200c41011020000b200c101f22080d160b200c41011020000b200341f4036a4101360200200341183602e401200341c0adc4003602e001200342013702e403200341c8adc4003602e0032003200341e0016a3602f003200341e0036a41f882c40010cf01000b200b41011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b410e41011020000b412e41011020000b410d41011020000b412d41011020000b41df88c0004133103a000b411241011020000b413241011020000b200541081020000b411841081020000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b4193f1c100419f01103a000b41df88c0004133103a000b412041011020000b2003200c36029c0120032008360298010b200341a0016a200d41016a22123602002008200d6a41003a0000200341dc006a280200220d0d020c030b2003200c36029c0120032008360298010b20034198016a41086a2216200d41016a3602002008200d6a41013a000002400240024002400240200328029c0122122016280200220d6b411f4b0d00200d41206a220c200d490d3820124101742218200c200c2018491b220c4100480d382012450d0120082012200c101e2208450d020c030b2012210c0c030b200c101f22080d010b200c41011020000b2003200c36029c0120032008360298010b2016200d41206a22123602002008200d6a220d41086a201341086a290000370000200d41106a201341106a290000370000200d41186a201341186a290000370000200d2013290000370000200341dc006a280200220d450d010b200c2012470d08200c41016a2213200c490d32200c4101742216201320132016491b22134100480d32200c450d012008200c2013101e2208450d020c070b200c2012470d05200c41016a220d200c490d31200c4101742213200d200d2013491b220d4100480d31200c450d022008200c200d101e2208450d030c040b2013101f22080d050b201341011020000b200d101f22080d010b200d41011020000b2003200d36029c0120032008360298010b200341a0016a220c201241016a360200200820126a41003a0000200c2802002113200328029c012108200328029801210c0c020b2003201336029c0120032008360298010b200341a0016a220c201241016a360200200820126a41013a000002400240024002400240200328029c012208200c28020022126b41204f0d00201241206a220c2012490d2e20084101742213200c200c2013491b22134100480d2e2008450d0120032802980120082013101e220c450d020c030b200328029801210c0c030b2013101f220c0d010b201341011020000b2003201336029c012003200c36029801201321080b20034198016a41086a201241206a2213360200200c20126a221241086a200d41086a290000370000201241106a200d41106a290000370000201241186a200d41186a2900003700002012200d2900003700000b200341d0036a4110200c2013100302402008450d00200c101d0b200a101d200341e0046a41086a220a4200370300200342003703e00441c8d8c100411a200341e0046a1001200341d0036a41086a200a290300370300200320032903e0043703d0034120101f220a450d02200a2005290000370000200a41186a200541186a290000370000200a41106a200541106a290000370000200a41086a200541086a290000370000200341d0036a4110200a41201003200a101d2003413c6a41026a20034194016a41026a2d00003a0000200341b0026a41086a200341f0026a41086a290300370300200341b0026a410d6a200341f0026a410d6a290000370000200320032f0194013b013c200320032903f0023703b0024101210d0b4100210a0b200341e0036a41186a20034190036a41186a290300370300200341e0036a41106a20034190036a41106a290300370300200341e0036a41086a20034190036a41086a290300370300200341d0026a41026a2003413c6a41026a2d00003a0000200341c0006a41086a200341b0026a41086a290300370300200341c0006a410d6a200341b0026a410d6a29000037000020032003290390033703e003200320032f013c3b01d002200320032903b002370340200341e0046a41086a22054200370300200342003703e00420024132200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341003602a0012003420137039801200420034198016a10622003200341b0036a3602f002200341f0026a20034198016a10f302200328029c01210520032802a00121040240024002400240024002400240200a4101470d0020052004470d01200441016a22052004490d2d2004410174220a20052005200a491b22054100480d2d2004450d0320032802980120042005101e220a450d040c0a0b20052004470d01200441016a22052004490d2c2004410174220a20052005200a491b22054100480d2c2004450d0420032802980120042005101e220a450d050c070b200328029801210a0c090b200328029801210a0c060b2005101f220a0d060b200541011020000b2005101f220a0d020b200541011020000b412041011020000b2003200536029c012003200a360298010b200341a0016a200441016a220c360200200a20046a41003a00000c020b2003200536029c012003200a360298010b20034198016a41086a2208200441016a360200200a20046a41013a000002400240024002400240200328029c01220c200828020022046b411f4b0d00200441206a22052004490d26200c4101742212200520052012491b22054100480d26200c450d01200a200c2005101e220a450d020c030b200c21050c030b2005101f220a0d010b200541011020000b2003200536029c012003200a360298010b2008200441206a220c360200200a20046a220441086a200341e0036a41086a290300370000200441106a200341e0036a41106a290300370000200441186a200341e0036a41186a290300370000200420032903e0033700000b0240024002400240024002400240024002400240200d41ff01714101470d002005200c470d08200541016a22042005490d2a2005410174220d20042004200d491b22044100480d2a2005450d01200a20052004101e220a450d020c070b2005200c470d05200541016a22042005490d292005410174220d20042004200d491b22044100480d292005450d02200a20052004101e220a450d030c040b2004101f220a0d050b200441011020000b2004101f220a0d010b200441011020000b2003200436029c012003200a360298010b200341a0016a2205200c41016a360200200a200c6a41003a00002005280200210c200328029c01210a20032802980121040c020b2003200436029c012003200a360298010b200341a0016a2205200c41016a360200200a200c6a41013a000002400240024002400240200328029c01220a200528020022056b41204f0d00200541206a22042005490d26200a410174220c20042004200c491b220c4100480d26200a450d01200328029801200a200c101e2204450d020c030b20032802980121040c030b200c101f22040d010b200c41011020000b2003200c36029c012003200436029801200c210a0b20034198016a41086a200541206a220c360200200341d0026a41026a2d0000210d20032f01d0022108200420056a220520093600072005200b360003200541026a200d3a0000200520083b0000200541186a200341cd006a290000370000200541136a200341c0006a41086a2903003700002005200329034037000b0b200341d0036a41102004200c10030240200a450d002004101d0b2002101d20034184026a280200450d0d20034180026a280200101d0c0d0b20034184026a200436020020034180026a200536020020034188026a28020021020b2005200241186c6a220220063703082002200e3703002002200f20077c37031020034188026a2202200228020041016a36020020034198016a200341e0016a10880320034184026a28020021020b2002450d0a20034180026a280200101d0c0a0b2005101d0b20020d004101210241d7c0c100210a4115210b0c010b20034198016a41026a200341d0036a41026a2d00003a0000200341e0036a41086a20034190036a41086a290300370300200341e0036a410d6a20034190036a410d6a290000370000200320032f01d0033b01980120032003290390033703e003410021020b20034194016a41026a220520034198016a41026a2d00003a0000200341b0036a41086a2204200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f0198013b019401200320032903e0033703b00302402002450d00200b2105200a21020c120b200341f3016a2004290300370000200341f8016a200341bd036a290000370000200320032f0194013b01e0012003200b3600e7012003200a3600e301200320032903b0033700eb01200320052d00003a00e2010240024002400240024002400240410e101f2202450d00200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d01200220032903e00137000e200241266a200341e0016a41186a22042903003700002002411e6a200341e0016a41106a220a290300370000200241166a200341e0016a41086a220c290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a220d2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f470d0b200341e0036a41186a2004290300370300200341e0036a41106a200a290300370300200d200c290300370300200320032903e0013703e003410e101f2202450d02200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d032002200329034037000e200241266a200341c0006a41186a2903003700002002411e6a200341c0006a41106a290300370000200241166a200341c0006a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d0034120101f2205450d04200520032903e003370000200541186a200341e0036a41186a290300370000200541106a200341e0036a41106a290300370000200541086a200341e0036a41086a290300370000200341d0036a41102005412010032005101d2002101d410d101f2202450d05200241056a41002900e1ee41370000200241002900dcee413700002002410d412d101e2202450d062002200329034037000d200241256a200341c0006a41186a22052903003700002002411d6a200341c0006a41106a2204290300370000200241156a200341c0006a41086a220a290300370000200341e0046a41086a220c4200370300200342003703e0042002412d200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341103602e4032003200341d0036a3602e0032008200341e0036a10f7022002101d2003200341c0006a10eb01200341086a290300210f2003290300210e20034188046a4100360200200341e0036a41186a200f2006200e200754200f200654200f2006511b22021b2206370300200341a4046a20052903003702002003419c046a200429030037020020034194046a200a29030037020020034208370380042003200e200720021b22073703f003200320063703e803200320073703e0032003200329034037028c04200341e0016a200341e0036a10880320034184046a280200450d0d20034180046a280200101d0c0d0b410e41011020000b412e41011020000b410e41011020000b412e41011020000b412041011020000b410d41011020000b412d41011020000b2005101d0b20020d004101210241d7c0c100210d4115210b0c010b200341e0016a41026a200341d0036a41026a2d00003a0000200341e0036a41086a20034190036a41086a290300370300200341e0036a410d6a20034190036a410d6a290000370000200320032f01d0033b01e00120032003290390033703e003410021020b20034194016a41026a2205200341e0016a41026a2d00003a0000200341b0036a41086a2204200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00302402002450d004101210a4101210c200b2105200d210220012d00002204410f4d0d1e0c1f0b20034183036a200429030037000020034188036a200341bd036a290000370000200320032f0194013b01f0022003200b3600f7022003200d3600f302200320032903b0033700fb02200320052d00003a00f202410e101f2202450d03200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d04200220032903f00237000e200241266a20034188036a2903003700002002411e6a200341f0026a41106a290300370000200241166a200341f0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f470d00200341f0026a200341d0026a412010d003450d02410e101f2202450d05200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d06200220032903b00237000e200241266a200341b0026a41186a2903003700002002411e6a200341b0026a41106a290300370000200241166a200341b0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d0034120101f2205450d07200520032903f002370000200541186a200341f0026a41186a290300370000200541106a200341f0026a41106a290300370000200541086a200341f0026a41086a290300370000200341d0036a41102005412010032005101d2002101d410e101f2202450d0841002105200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d09200220032903d00237000e200241266a200341d0026a41186a2903003700002002411e6a200341d0026a41106a290300370000200241166a200341d0026a41086a290300370000200341e0046a41086a22044200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2004290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342103702e4042003200341d0036a3602e004200341e0036a200341e0046a10fc022003280280042205450d0b200341c0046a41186a200341e0036a41186a290300370300200341c0046a41106a200341e0036a41106a290300370300200341c0046a41086a200341e0036a41086a290300370300200341e0016a41086a2003418c046a290200370300200341e0016a41106a20034194046a290200370300200341e0016a41186a2003419c046a29020037030020034180026a200341a4046a29020037030020034188026a200341ac046a280200360200200320032903e0033703c00420032003290284043703e001200341d0036a411010090b200341b0036a41186a200341c0046a41186a290300370300200341b0036a41106a200341c0046a41106a290300370300200341b0036a41086a200341c0046a41086a290300370300200341c0006a41086a200341e0016a41086a290300370300200341c0006a41106a200341e0016a41106a290300370300200341c0006a41186a200341e0016a41186a290300370300200341c0006a41206a2204200341e0016a41206a290300370300200341c0006a41286a220a200341e0016a41286a280200360200200320032903c0043703b003200320032903e0013703402005450d0120034190036a41186a220c200341b0036a41186a29030037030020034190036a41106a220d200341b0036a41106a29030037030020034190036a41086a220b200341b0036a41086a29030037030020034198016a41086a2209200341c0006a41086a29030037030020034198016a41106a2208200341c0006a41106a29030037030020034198016a41186a2212200341c0006a41186a29030037030020034198016a41206a2213200429030037030020034198016a41286a2204200a280200360200200320032903b0033703900320032003290340370398012002101d200341e0036a41186a200c290300370300200341e0036a41106a200d290300370300200341e0036a41086a200b29030037030020034184046a2003290398013702002003418c046a200929030037020020034194046a20082903003702002003419c046a2012290300370200200341a4046a2013290300370200200341ac046a2004280200360200200320053602800420032003290390033703e003410e101f2202450d0b200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d0c200220032903f00237000e200241266a20034188036a2903003700002002411e6a200341f0026a41106a290300370000200241166a200341f0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341103602e4012003200341d0036a3602e001200341e0036a200341e0016a10f8022002101d20034184046a280200450d0220034180046a280200101d0c020b4199f0c1002102411921050c0c0b2002101d0b410021024101210a4101210c0c190b410e41011020000b412e41011020000b410e41011020000b412e41011020000b412041011020000b410e41011020000b412e41011020000b41df88c0004133103a000b410e41011020000b412e41011020000b4101210a4101210c20012d00002204410f4d0d0f0c100b200c101d0b20020d0041d7c0c100210c41012102410021134100210541d7c0c1000d020c010b200341d0026a41026a220c200341d0036a41026a2d00003a0000200341e0016a41086a220920034190036a41086a290300370300200341e0016a410d6a221320034190036a410d6a290000370000200320032f01d0033b01d00220032003290390033703e00102400240024002404120101f2202450d00200220032f01d0023b00002002201836000720022005360003200220032903e00137000b200241026a200c2d00003a0000200241136a2009290300370000200241186a20132900003700000240024020172004460d00200341f0026a41026a2205200d41276a2d00003a0000200341e0036a41086a220c200d41386a290000370300200341e0036a410d6a2209200d413d6a2900003700002003200d2f00253b01f0022003200d2900303703e003200d41c8006a2104200d41246a2d000022134102470d014100210c410121134101210541000d070c060b201721044100210c410121134101210541000d060c050b200d28002c211b200d2800282116200341e0046a41026a20052d00003a000020034198016a41086a200c29030037030020034198016a410d6a2009290000370000200320032f01f0023b01e004200320032903e003370398010240024020134101470d00200341b0036a201641067610b00120032802b003210c20032802b8032016413f7122054d0d01200341d0036a41026a200c20054105746a220541026a2d00003a0000200528000321162005280007211b20052f000021092003419d036a200541186a29000037000020034198036a200541136a290000370300200320093b01d0032003200529000b370390034101210520032802b403450d040c030b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a20034198016a410d6a290000370000200320032f01e0043b01d0032003200329039801370390030c040b410021052018211b20032802b4030d010c020b412041011020000b200c101d0b20050d0041d7c0c100210c410121134101210541d7c0c1000d020c010b200341d0026a41026a221c200341d0036a41026a221d2d00003a0000200341e0016a41086a221e20034190036a41086a221f290300370300200341e0016a410d6a222020034190036a410d6a2221290000370000200320032f01d0033b01d00220032003290390033703e001200a41246c41b87f6a2122200341eb036a211a200341e7036a2123200341e3036a21244102212541202118410221134100210941012105024002400240024003402023201b36000020242016360000201a20032903e001370000200341e0036a41026a201c2d00003a0000201a41086a201e290300370000201a410d6a2020290000370000200320032f01d0023b01e00302402013417f6a2005470d002025201320132025491b2205ad4205862206422088a70d0a2006a7220c4100480d0a20022018200c101e2202450d050b200220186a220c20032901e003370000200c41186a200341e0036a41186a290100370000200c41106a200341e0036a41106a290100370000200c41086a200341e0036a41086a2226290100370000200941f803460d02024020222009460d00200341f0026a41026a2227200d20096a220c41cb006a2d00003a00002026200c41dc006a290000370300200341e0036a410d6a2228200c41e1006a2900003700002003200c41c9006a2f00003b01f0022003200c41d4006a2900003703e003200c41c8006a2d000022294102460d02200c41d0006a280000212a200c41cc006a2800002116200341e0046a41026a222b20272d00003a000020034198016a41086a2227202629030037030020034198016a410d6a22262028290000370000200320032f01f0023b01e004200320032903e003370398010240024020294101470d00200341b0036a201641067610b0012016413f7121264100212720032802b00321280240200341b0036a41086a28020020264d0d00201d202820264105746a222641026a2d00003a0000202628000321162026280007211b20262f000021272021202641186a290000370000201f202641136a290000370300200320273b01d0032003202629000b37039003410121270b024020032802b403450d002028101d0b20270d010c060b201d202b2d00003a0000201f202729030037030020212026290000370000200320032f01e0043b01d003200320032903980137039003202a211b0b200441246a2104201c201d2d00003a0000201e201f29030037030020202021290000370000200320032f01d0033b01d00220032003290390033703e001202541026a2125201841206a2118201341016a2113200941246a21090c010b0b201721044100210c41000d050c040b200c41ec006a21040b4100210c41000d030c020b200c41ec006a210441d7c0c100210c41d7c0c1000d020c010b200c41011020000b410021160c010b4101211602402005450d002002101d0b200c2102411521050b200341c0006a412c6a2109200d200a41246c6a210c02400340200c2004460d0120042d0000210a200441246a2104200a4102470d000b0b0240200b450d00200d101d0b02402016450d004100210420120d050c060b200910e40120032013360228200320053602242003200236022002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2208450d01200820092900003700122008412a6a200941186a290000370000200841226a200941106a2900003700002008411a6a200941086a290000370000200341e0046a41086a22024200370300200342003703e00420084132200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200341e0016a200341d0036a105d0240024002400240024020032d00ec0122024102470d00200341e0046a41086a22024200370300200342003703e00441adeec100411a200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d01200341f8036a4200370300200341e0036a41106a4200370300200341e0036a41086a4200370300200342003703e003200341d0036a4110200341e0036a4120410010022202417f460d072002411f4d0d07200341e0046a41026a220220032d00e2033a0000200341f0026a41086a2205200341f3036a290000370300200341f0026a410d6a2204200341f8036a290000370000200320032f01e0033b01e004200320032900eb033703f00220032800e303211320032800e703211620034190016a41026a220a20022d00003a0000200341d0026a41086a22022005290300370300200341d0026a410d6a22052004290000370000200320032f01e0043b019001200320032903f0023703d00220034194016a41026a200a2d00003a0000200341b0036a41086a2002290300370300200341b0036a410d6a2005290000370000200320032f0190013b019401200320032903d0023703b0034112101f2202450d08200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2212450d09201220032f0194013b00122012201636001920122013360015201220032903b00337001d201241146a20034194016a41026a2d00003a0000201241256a200341b0036a41086a2903003700002012412a6a200341bd036a290000370000200341e0046a41086a22024200370300200342003703e00420124132200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003200341e0036a200341d0036a105d20032d00ec034102460d0a20032802e403211720032802e003211820032802e803210420034198016a200341ec036a41c20010ce031a200341e0036a20034198016a41c20010ce031a20032d008104211a20024200370300200342003703e00420124132200341e0046a100120052002290300370300200320032903e0043703d0032003420137039801200341003602a001200320043602f002200341f0026a20034198016a106220032802a00121052004450d022004410574210b410020056b2104200328029c01210a2018210203400240024002400240200a20046a41204f0d00200541206a220c2005490d15200a410174220d200c200c200d491b220d4100480d15200a450d01200328029801200a200d101e220c0d020c090b200328029801210c0c020b200d101f220c450d070b2003200d36029c012003200c36029801200d210a0b20034198016a41086a200541206a220d360200200c20056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a2104200d2105200241206a2102200b41606a220b0d000c040b0b20034190036a41086a200341f5016a290000370300200341a0036a200341fd016a29000037030020034190036a41186a20034185026a2900003703002003413c6a41026a20034190026a2d00003a00002003200341e0016a410d6a2900003703900320032003418e026a2f01003b013c2003418d026a2d0000210520034191026a280000211320034195026a280000211620032802e401210420032802e001210a200341b0026a410d6a200341a6026a290000370000200341b0026a41086a200341a1026a290000370300200320034199026a2900003703b0022004450d0d200a101d0c0d0b20024200370300200342003703e00441adeec100411a200341e0046a100120052002290300370300200320032903e0043703d0034120101f2202450d0920022009290000370000200241186a200941186a290000370000200241106a200941106a290000370000200241086a200941086a290000370000200341d0036a41102002412010032002101d41002105410021020c0c0b2005210d0b024002400240200328029c01200d470d00200d41016a2202200d490d0f200d4101742205200220022005491b22054100480d0f200d450d01200328029801200d2005101e2202450d020c0b0b20032802980121020c0b0b2005101f22020d090b200541011020000b200d41011020000b411241011020000b413241011020000b41df88c0004133103a000b411241011020000b413241011020000b4193f1c100419f01103a000b412041011020000b2003200536029c0120032002360298010b20034198016a41086a220a200d41016a3602002002200d6a41013a000002400240024002400240200328029c01220c200a28020022046b411f4b0d00200441206a22052004490d07200c410174220d20052005200d491b22054100480d07200c450d012002200c2005101e2202450d020c030b200c21050c030b2005101f22020d010b200541011020000b2003200536029c0120032002360298010b200a200441206a220d360200200220046a220a41086a200941086a290000370000200a41106a200941106a290000370000200a41186a200941186a290000370000200a200929000037000002400240024002400240024002400240024002400240024020034182046a4100201a4101461b220a450d002005200d470d01200541016a220c2005490d0e2005410174220b200c200c200b491b220c4100480d0e2005450d0320022005200c101e2202450d040c090b2005200d470d01200541016a220a2005490d0d2005410174220c200a200a200c491b220b4100480d0d2005450d0420022005200b101e2202450d050c060b2005210c0c080b2005210b0c050b200c101f22020d050b200c41011020000b200b101f22020d010b200b41011020000b2003200b36029c0120032002360298010b200341a0016a200441216a22043602002002200d6a41003a00000c020b2003200c36029c0120032002360298010b20034198016a41086a221a200441216a22053602002002200d6a41013a000002400240024002400240200c20056b411f4b0d00200541206a220d2005490d08200c410174220b200d200d200b491b220b4100480d08200c450d012002200c200b101e2202450d020c030b200c210b0c030b200b101f22020d010b200b41011020000b2003200b36029c0120032002360298010b201a200441c1006a2204360200200220056a220541086a200a41086a290000370000200541106a200a41106a290000370000200541186a200a41186a2900003700002005200a2900003700000b200341d0036a41102002200410030240200b450d002002101d0b02402017450d002018101d0b2012101d200341e0046a41086a22024200370300200342003703e00441adeec100411a200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0034120101f2202450d0420022009290000370000200241186a200941186a290000370000200241106a200941106a290000370000200241086a200941086a290000370000200341d0036a41102002412010032002101d2003413c6a41026a20034194016a41026a2d00003a0000200341b0026a41086a200341b0036a41086a290300370300200341b0026a410d6a200341b0036a410d6a290000370000200320032f0194013b013c200320032903b0033703b00241012105410021020b20034185046a20053a00002003418d046a201636000020034189046a2013360000200341e0036a410d6a20034190036a41086a290300370000200341f5036a20034190036a41106a290300370000200341fd036a20034190036a41186a29030037000020034186046a20032f013c3b010020034188046a2003413e6a2d00003a000020034191046a20032903b00237000020034199046a200341b0026a41086a2903003700002003419e046a200341b0026a410d6a290000370000200320023a00e40320032003290390033700e5032003200341206a3602e003200341e0046a41086a22024200370300200342003703e00420084132200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200341003602e801200342013703e001200328022021022003200341206a41086a28020022053602980120034198016a200341e0016a106202402005450d002005410574210d4100200341e0016a41086a28020022056b210a20032802e001210b20032802e401210c03400240200c200a6a411f4b0d00200541206a22042005490d04200c4101742209200420042009491b22044100480d0402400240200c450d00200b200c2004101e220b0d010c070b2004101f220b450d060b2004210c0b200b20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200a41606a210a200541206a2105200241206a2102200d41606a220d0d000b200341e8016a20053602002003200c3602e4012003200b3602e0010b200341e0036a410472200341e0016a10ca0120032802e4012102200341d0036a411020032802e0012205200341e0016a41086a280200100302402002450d002005101d0b2008101d02402003280224450d002003280220101d0b0240200341e4006a280200450d00200341e0006a280200101d0b4100210c4101210a0b4100210220012d00002204410f4d0d080c090b1021000b200441011020000b412041011020000b2008101d0b20040d004100210c4101210a20012d00002204410f4d0d030c040b4100210c4101210a200b450d010b200d101d20012d00002204410f4d0d010c020b20012d00002204410f4b0d010b410120047441beff01710d01024020044106460d002004410f470d01200a450d02200141086a280200450d02200141046a280200101d0c020b200c450d01200141086a280200450d01200141046a280200101d0c010b200141086a280200450d00200141046a280200101d0b2000200536020420002002360200200341f0046a24000b130020004102360204200041c8afc4003602000b130020004100360204200041f8b3c2003602000b130020004101360204200041a4d9c3003602000b13002000410336020420004188f4c2003602000b130020004101360204200041d4c1c3003602000b13002000410336020420004190ddc3003602000b13002000410936020420004194d9c2003602000b130020004104360204200041b08cc3003602000b130020004102360204200041e8aac3003602000b130020004105360204200041cca4c4003602000b13002000410136020420004180acc3003602000b13002000410536020420004198c2c3003602000b130020004108360204200041e8f5c1003602000b130020004111360204200041c894c4003602000b130020004104360204200041e08fc4003602000b130020004106360204200041d08cc4003602000b130020004102360204200041b4adc3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242003700000f0b410841011020000bd40101017f024002400240024002404104101f2202450d002002410036000020024104410c101e2202450d01200242013700042002410c4118101e2202450d022002420137000c200241184130101e2202450d03200242013700242002420137001c200242013700142002413041e000101e2202450d042002428080848080023700442002420137003c200242013700342002420137002c200042e0808080c009370204200020023602000f0b410441011020000b410c41011020000b411841011020000b413041011020000b41e00041011020000b3401017f02404108101f2202450d0020004288808080800137020420002002360200200242c0843d3700000f0b410841011020000b3301017f02404104101f2202450d0020004284808080c00037020420002002360200200241e4003600000f0b410441011020000b3301017f02404108101f2202450d0020004288808080800137020420002002360200200242af013700000f0b410841011020000b3301017f02404108101f2202450d002000428880808080013702042000200236020020024287013700000f0b410841011020000b3901017f02404110101f2202450d002002420037000820024215370000200042908080808002370204200020023602000f0b411041011020000bb50806047f017e017f017e017f077e230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100222032003417f461b2203410420034104491b20012802086a220436020802400240200341034d0d00200228020821054200210620024200370308200141086a220741002001280200200141046a280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d01200229030821084200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210a4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210b4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210c4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210d4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210e4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210f4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d01200229030821102009280200210320024100360208200141086a2207410020012802002003200241086a41042004100222032003417f461b2203410420034104491b20072802006a2204360200200341034d0d0120022802082109200141046a2802002103200241003602082007410020012802002003200241086a41042004100222012001417f461b2201410420014104491b20072802006a360200200141034d0d01200041d0006a2002280208360200200041cc006a2009360200200041c8006a2005360200200041c0006a2010370300200041386a200f370300200041306a200e370300200041286a200d370300200041206a200c370300200041186a200b370300200041106a200a37030020002008370308420121060c010b420021060b20002006370300200241106a24000be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041e0f2c1004111200141106a1001200141086a220320022903003703002001200129031037030042002104024002402001411041f8b3c200410041001002417f460d002001420037031020014110200141106a41084100100241016a41084d0d01200129031021040b200242003703002001420037031041e0f2c1004111200141106a100120032002290300370300200120012903103703002001200420007c37031020014110200141106a41081003200141206a24000f0b41df88c0004133103a000be94902107f037e23004190046b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d0020044102470d11200141216a2d00002105200141246a2802002106200341306a200141196a290000370300200341286a200141116a290000370300200341186a41086a200141096a29000037030020032001290001370318200241096a2800002107200241056a280000210820022d0001210920022d0000210a20034180046a41026a200241046a2d00003a0000200341b0026a41086a220b200241156a290000370300200341b0026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01800420032002410d6a2900003703b002200a450d01410121020c020b200141086a2802002104200141046a2802002106200241096a2800002107200241056a280000210820022d0001210a20022d0000210120034180046a41026a2209200241046a2d00003a0000200341b0026a41086a220b200241156a290000370300200341b0026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01800420032002410d6a2900003703b0022001450d03410121020c040b200341c0006a41026a220a20034180046a41026a2d00003a0000200341d0016a41086a200b290300370300200341d0016a410d6a200c290000370000200320032f0180043b0140200320032903b0023703d00141012102200941ff01714101470d00200341f0006a41026a200a2d00003a0000200341b0026a41086a200341d0016a41086a290300370300200341b0026a410d6a200341d0016a410d6a290000370000200320032f01403b0170200320032903d0013703b002410021020c010b41f1b4c0002108412a21070b2003413c6a41026a220a200341f0006a41026a2d00003a0000200341a0036a41086a2209200341b0026a41086a290300370300200341a0036a41106a200341b0026a41106a290300370300200320032f01703b013c200320032903b0023703a00320020d23200341e3006a2009290300370000200341e8006a200341ad036a290000370000200320032f013c3b01502003200736005720032008360053200320032903a00337005b2003200a2d00003a0052200341d0006a10cd02450d034115101f2202450d0e2002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b42370000200241154135101e2202450d0f200220032903183700152002412d6a200341306a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341c0006a411041f8b3c200410041001002417f460d062003200341c0006a3602d001200341103602d401200341003602b00220034100200341c0006a4110200341b0026a41044100100222072007417f461b22074104200741044922081b22073602d80120080d1320032802b002210d200341003602b002200341d8016a4100200341c0006a4110200341b0026a41042007100222082008417f461b2208410420084104491b20076a360200200841034d0d1320032802b002210e200341a0036a200341d0016a105e20032802a003220f450d13200341a0036a41086a280200210920032802a4032110200341b0026a200341d0016a105e20032802b0022211450d12200341b0026a41086a280200210b20032802b40221122002101d2006200d470d08200f20094105746a210a200f2102410021080340200a20026b41ff004d0d0b200341d0006a2002460d0c20082002200341d0006a412010d00322074100476a21082007450d0c200241206a2207200341d0006a460d0c20082007200341d0006a412010d00322074100476a21082007450d0c200241c0006a2207200341d0006a460d0c20082007200341d0006a412010d00322074100476a21082007450d0c200241e0006a2207200341d0006a460d0c20024180016a210220082007200341d0006a412010d00322074100476a210820070d000c0c0b0b200341c0006a41026a20092d00003a0000200341d0016a41086a200b290300370300200341d0016a410d6a200c290000370000200320032f0180043b0140200320032903b0023703d00141012102200a41ff01714101470d00200341d0006a41026a200341c0006a41026a2d00003a0000200341b0026a41086a200341d0016a41086a290300370300200341b0026a410d6a200341d0016a410d6a290000370000200320032f01403b0150200320032903d0013703b002410021020c010b41f1b4c0002108412a21070b2003413c6a41026a2201200341d0006a41026a2d00003a0000200341a0036a41086a220a200341b0026a41086a290300370300200341a0036a41106a200341b0026a41106a290300370300200320032f01503b013c200320032903b0023703a00320020d0220034183016a200a290300370000200341f0006a41186a200341ad036a290000370000200320032f013c3b01702003200736007720032008360073200320032903a00337007b200320012d00003a0072200341f0006a10cd02450d01200341003602b802200342013703b0022004200341b0026a10b20120032802b402210820032802b802210a20032802b0022107200341b0026a41186a22094200370300200341b0026a41106a22024200370300200341b0026a41086a22014200370300200342003703b0022007200a200341b0026a1000200341d0016a41186a2009290300370300200341d0016a41106a220a2002290300370300200341d0016a41086a22092001290300370300200320032903b0023703d00102402008450d002007101d0b200341b0026a41186a200341d0016a41186a2903003703002002200a29030037030020012009290300370300200320032903d0013703b0024119101f2202450d0d200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d0e200220032903b002370019200241316a200341c8026a290300370000200241296a200341b0026a41106a290300370000200241216a200341b0026a41086a29030037000020034180046a41086a2201420037030020034200370380042002413920034180046a1001200341a0036a41086a200129030037030020032003290380043703a003200341a0036a411041f8b3c20041004100100221012002101d2001417f460d0441949bc2002108411f21070c020b41939cc20021084114210720044101460d200c210b41b39bc2002108411721070b2004103c2004101d0c1f0b2002101d41a79cc20021084113210720044101460d1d0c1e0b200641014b0d01200341b0026a200441e00010ce031a200341013a00a003200341013602a403200341086a200341b0026a200341a0036a108a01200341d5026a2003280208453a0000200341c5026a200341e0016a290300370000200341cd026a200341e8016a290300370000200341083a00b002200341bd026a200341d0016a41086a290300370000200341043a00b402200320032903d0013700b502200341b0026a108b010c110b41ba9cc2002108411021072010450d190c180b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a200229030037030020032003290380043703404100210f0240200341c0006a411041f8b3c200410041001002417f460d00200341003602b002200341c0006a4110200341b0026a41044100100241016a41044d0d0b20032802b002210f0b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a2002290300370300200320032903800437034002400240200341c0006a411041f8b3c200410041001002417f460d00200341003602b002200341c0006a4110200341b0026a41044100100241016a41044d0d0d20032802b00241016a21010c010b410121010b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a220720022903003703002003200329038004370340200320013602b002200341c0006a4110200341b0026a4104100320024200370300200342003703800441e69bc200411820034180046a10012007200229030037030020032003290380043703404100210202400240200341c0006a411041f8b3c200410041001002417f460d00200342103702a4032003200341c0006a3602a003200341b0026a200341a0036a105e20032802b0022205450d0e200341b0026a41086a2201280200210720032802b4022102200341b0026a41186a200341d0016a41186a290300370300200341b0026a41106a200341d0016a41106a2903003703002001200341d0016a41086a290300370300200320032903d0013703b002200341b0026a21012002211120072002460d010c100b200341b0026a41186a200341d0016a41186a290300370300200341b0026a41106a200341d0016a41106a290300370300200341b0026a41086a200341d0016a41086a290300370300200320032903d0013703b00241012105200341b0026a21010b200241016a22072002490d1020024101742208200720072008491b2211ad4205862213422088a70d102013a722084100480d10024002402002450d0020022107200520024105742008101e2205450d010c100b200221072008101f22050d0f0b200841011020000b2002200a460d01200f20094105746a210a0340200341d0006a2002460d0120082002200341d0006a412010d00322074100476a21082007450d0141002106200a200241206a2202470d000c0d0b0b410121060c0b0b410021060c0a0b200341c4026a4101360200200341183602a403200341c0adc4003602a003200342013702b402200341c8adc4003602b0022003200341a0036a3602c002200341b0026a41d0adc40010cf01000b411541011020000b413541011020000b411941011020000b413941011020000b2010450d00200f101d0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b2011200b4105746a210c2011210241002107024002400240024002400240024002400240024002400240024002400240024002400340200c20026b41ff004d0d01200341d0006a2002460d0220072002200341d0006a412010d003220a4100476a2107200a450d02200241206a220a200341d0006a460d022007200a200341d0006a412010d003220a4100476a2107200a450d02200241c0006a220a200341d0006a460d022007200a200341d0006a412010d003220a4100476a2107200a450d02200241e0006a220a200341d0006a460d0220024180016a21022007200a200341d0006a412010d003220a4100476a2107200a0d000c020b0b2002200c460d022011200b4105746a210c0340200341d0006a2002460d0120072002200341d0006a412010d003220a4100476a2107200a450d014100210a200c200241206a2202470d000c020b0b4101210a0b200541ff0171450d010c020b4100210a200541ff01710d010b200a0d01200341b0026a41186a2207200341d0006a41186a290300370300200341b0026a41106a220a200341d0006a41106a290300370300200341b0026a41086a220c200341d0006a41086a290300370300200320032903503703b00202402012200b470d00200b41016a2202200b490d0f200b4101742212200220022012491b2212ad4205862213422088a70d0f2013a722024100480d0f02400240200b450d002011200b4105742002101e2211450d010c020b2002101f22110d010b200241011020000b2011200b4105746a220220032903b002370000200241186a2007290300370000200241106a200a290300370000200241086a200c290300370000200b41016a210b2006450d030240200920084d0d00200f2009417f6a22094105746a220229000021132002290008211420022900102115200f20084105746a220741186a200241186a2900003700002007201537001020072014370008200720133700000c040b4198adc40020082009104b000b20060d00200341b0026a41186a2208200341d0006a41186a290300370300200341b0026a41106a220c200341d0006a41106a290300370300200341b0026a41086a2206200341d0006a41086a290300370300200320032903503703b00220102009470d01200941016a22022009490d0d20094101742210200220022010491b2210ad4205862213422088a70d0d2013a722024100480d0d024002402009450d00200f20094105742002101e220f450d010c030b2002101f220f0d020b200241011020000b41ca9cc20021084116210720100d130c140b200f20094105746a220220032903b002370000200241186a2008290300370000200241106a200c290300370000200241086a2006290300370000200941016a2109200a450d00200b20074d0d012011200b417f6a220b4105746a220229000021132002290008211420022900102115201120074105746a220741186a200241186a2900003700002007201537001020072014370008200720133700000b200341d5026a2003290318370000200341b0026a41156a200341d0006a41106a290300370000200341cd026a200341d0006a41186a290300370000200341e5026a200341186a41106a290300370000200341ed026a200341186a41186a290300370000200341083a00b002200341bd026a200341d0006a41086a290300370000200341dd026a200341186a41086a290300370000200341013a00b402200320032903503700b502200341fc026a200b360200200341f8026a2009360200200341f5026a20053a0000200341b0026a108b0120034180046a41086a22024200370300200342003703800441dfd9c000411520034180046a1001200341b0026a41086a200229030037030020032003290380043703b002410021020240024002400240200341b0026a411041f8b3c200410041001002417f460d00200342103702d4012003200341b0026a3602d001200341a0036a200341d0016a10a40120032802a0032207450d0120032902a4032213422088a721022013a7450d002007101d0b02402009200e4f22080d0041002002200b6b2207200720024b1b200e490d00200341cc026a200b360200200341c8026a2012360200200341c0026a2009360200200341bc026a2010360200200320113602c4022003200f3602b8022003200e3602b4022003200d3602b0024115101f2202450d022002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b42370000200241154135101e2202450d03200220032903183700152002412d6a200341306a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341103602a4032003200341c0006a3602a003200341b0026a200341a0036a10b6022002101d2010450d0b0c0a0b024002402008450d00200341c5026a200341186a41106a290300370000200341cd026a200341186a41186a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341023a00b402200320032903183700b502200341b0026a108b014119101f2202450d06200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d0720022003290318370019200241316a200341306a290300370000200241296a200341186a41106a290300370000200241216a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413920034180046a1001200341c0006a41086a20072903003703002003200329038004370340410f21070240200341c0006a411041f8b3c200410041001002417f460d0020034210370284042003200341c0006a36028004200341b0026a20034180046a10a30120032802b0022207410f460d09200341a0036a200341b0026a41047241dc0010ce031a200341c0006a411010090b200341d0016a200341a0036a41dc0010ce031a2007410f470d012002101d411521074115101f22020d090c0a0b200341c5026a200341286a290300370000200341cd026a200341306a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341033a00b402200320032903183700b502200341b0026a108b01411521074115101f2202450d090c080b200341f0006a200341d0016a41dc0010ce031a2002101d200320073602b002200341b0026a410472200341f0006a41dc0010ce031a200341013a00a0032003200e3602a403200341106a200341b0026a200341a0036a108a01200341d5026a2003280210453a0000200341c5026a200341286a290300370000200341cd026a200341306a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341043a00b402200320032903183700b502200341b0026a108b01411521074115101f22020d070c080b41df88c0004133103a000b411541011020000b413541011020000b4198adc4002007200b104b000b411941011020000b413941011020000b41df88c0004133103a000b2002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b4237000002400240200220074135101e2202450d00200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a2903003700004200211320034180046a41086a2207420037030020034200370380042002413520034180046a1001200341a0036a41086a200729030037030020032003290380043703a003200341a0036a411010092002101d20074200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a2007290300370300200320032903800437034002400240200341c0006a411041f8b3c200410041001002417f460d00200342103702a4032003200341c0006a3602a003200341b0026a200341a0036a105e20032802b0022205450d0320032902b40221130c010b410121050b4100210c02400240024002402013422088a7220a450d00410021094100210c410021070240034002400240200c450d00200520074105746a21022005200720096a4105746a210803402007200a4f0d06200341186a2002460d022002200341186a412010d003450d02200920076a220b200a4f0d0720082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200241206a2102200841206a2108200a200741016a2207470d000c050b0b200520074105746a210203402007200a4f0d05200341186a2002460d012002200341186a412010d003450d01200241206a2102200a200741016a2207470d000c030b0b2009417f6a2109200c41016a210c200741016a2207200a470d000c020b0b4100210c0b20034180046a41086a22024200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a20022903003703002003200329038004370340200341003602b802200342013703b0022003200a200c6b22023602a003200341a0036a200341b0026a1062024002402002450d00200a410574200c4105746b210b4100200341b0026a41086a28020022076b210a20032802b002210c20032802b402210920052102034002402009200a6a411f4b0d00200741206a22082007490d0e20094101742206200820082006491b22084100480d0e024002402009450d00200c20092008101e220c0d010c080b2008101f220c450d070b200821090b200c20076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200a41606a210a200741206a2107200241206a2102200b41606a220b0d000b200341b8026a2007360200200320093602b4022003200c3602b0020c010b200341b0026a41086a280200210720032802b402210920032802b002210c0b200341c0006a4110200c2007100302402009450d00200c101d0b02402013a7450d002005101d0b20100d060c070b41c8aac3002007200a104b000b41d8aac300200b200a104b000b200841011020000b413541011020000b41df88c0004133103a000b200741011020000b200f101d0b02402012450d002011101d0b4100210820044101470d0d0c0c0b2005200741057422086a22022001290000370000200241186a200141186a290000370000200241106a200141106a290000370000200241086a200141086a29000037000020034180046a41086a22024200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a20022903003703002003200329038004370340200341003602b802200342013703b0022003200741016a22023602a003200341a0036a200341b0026a1062024002402002450d00200841206a21094100200341b0026a41086a28020022016b210820032802b002210b20032802b402210a2005210203400240200a20086a411f4b0d00200141206a22072001490d05200a410174220c20072007200c491b22074100480d0502400240200a450d00200b200a2007101e220b0d010c080b2007101f220b450d070b2007210a0b200b20016a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200841606a2108200141206a2101200241206a2102200941606a22090d000b200341b8026a20013602002003200a3602b4022003200b3602b0020c010b200341b0026a41086a280200210120032802b402210a20032802b002210b0b200341c0006a4110200b200110030240200a450d00200b101d0b02402011450d002005101d0b200341a0036a41186a200341d0016a41186a290300370300200341a0036a41106a200341d0016a41106a290300370300200341a0036a41086a200341d0016a41086a290300370300200320032903d0013703a003200341b0026a200441e00010ce031a4119101f2202450d03200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d04200220032903a003370019200241316a200341a0036a41186a2201290300370000200241296a200341a0036a41106a2207290300370000200241216a200341a0036a41086a220829030037000020034180046a41086a220a420037030020034200370380042002413920034180046a1001200341c0006a41086a200a29030037030020032003290380043703402003410036025820034201370350200341b0026a200341d0006a10b2012003280254210a200341c0006a411020032802502209200328025810030240200a450d002009101d0b2002101d200341b0026a103c2001200341d0016a41186a2903003703002007200341d0016a41106a2903003703002008200341d0016a41086a290300370300200320032903d0013703a0034120101f2202450d0520022003290370370000200341cc026a4100360200200341bc026a428180808010370200200241186a200341f0006a41186a290300370000200241106a200341f0006a41106a290300370000200241086a200341f0006a41086a290300370000200342013702c402200320023602b802200320063602b4022003200f3602b0024115101f2201450d062001410d6a410029008b9c42370000200141086a41002900869c42370000200141002900fe9b42370000200141154135101e2201450d07200120032903a0033700152001412d6a200341a0036a41186a290300370000200141256a200341a0036a41106a2903003700002001411d6a200341a0036a41086a29030037000020034180046a41086a2207420037030020034200370380042001413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341103602542003200341c0006a360250200341b0026a200341d0006a10b6022001101d2002101d200341b0026a410d6a200341f0006a41086a290300370000200341c5026a200341f0006a41106a290300370000200341b0026a411d6a200341f0006a41186a290300370000200341b0026a41256a20032903d001370000200341b0026a412d6a200341d0016a41086a290300370000200341b0026a41356a200341d0016a41106a290300370000200341ed026a200341d0016a41186a290300370000200341003a00b402200341083a00b002200320032903703700b502200341fc026a2006360200200341f8026a200f360200200341b0026a108b010b2004101d410021080c0b0b1021000b200741011020000b411941011020000b413941011020000b412041011020000b411541011020000b413541011020000b200f101d0b2012450d002011101d20044101470d020c010b20044101470d010b200141086a2802002202103c2002101d0b200020073602042000200836020020034190046a24000bdc0d08047f077e017f017e037f057e017f057e23004180016b22012400200141286a41086a220242003703002001420037032841878ec2004118200141286a1001200141086a41086a2002290300370300200120012903283703084100210341102104024002400240200141086a411041f8b3c200410041001002417f460d002001421037021c2001200141086a360218200141286a200141186a10a40320012903284201520d02200141386a2903002105200141c0006a2903002106200141c8006a2903002107200141d0006a2903002108200141d8006a2903002109200141e0006a290300210a200141e8006a290300210b200141f0006a2802002103200141f4006a280200210c200141f8006a28020021042001290330210d2001200141fc006a280200220e360274200120043602702001200c36026c200120033602682001200b3703602001200a37035820012009370350200120083703482001200737034020012006370338200120053703302001200d3703280c010b4201210b41808004210c4201210a42012109420121084201210742012106420121054201210d0b200141286a41086a220242003703002001420037032841c4b9c000411b200141286a1001200141086a41086a220f200229030037030020012001290328370308024002400240024002400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022210417f460d022010410f4d0d02200141306a2903002111200129032821120c010b42002112420021110b200242003703002001420037032841d48ec2004111200141286a1001200f200229030037030020012001290328370308024002400240200141086a411041f8b3c200410041001002417f460d0020014100360228200141086a4110200141286a41044100100241016a41044d0d022001280228210f0c010b41e400210f0b42002113200141286a41086a220242003703002001420037032841e58ec2004114200141286a1001200141086a41086a20022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022202417f460d042002410f4d0d04200141306a2903002113200129032821140c010b421521140b42002115200141286a41086a220242003703002001420037032841f98ec2004114200141286a1001200141086a41086a221020022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022216417f460d052016410f4d0d05200141306a2903002117200129032821180c010b42002118420021170b2002420037030020014200370328418d8fc2004114200141286a1001201020022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022202417f460d062002410f4d0d06200141306a2903002119200129032821150c010b420021190b200141286a41086a220242003703002001420037032841a18fc2004114200141286a1001200141086a41086a2002290300370300200120012903283703080240024002400240200141086a411041f8b3c200410041001002417f460d0020014200370328200141086a4110200141286a41084100100241016a41084d0d022001290328211a0c010b428701211a0b200141286a41086a220242003703002001420037032841b58fc2004116200141286a1001200141086a41086a20022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d0020014200370328200141086a4110200141286a41084100100241016a41084d0d032001290328211b0c010b42af01211b0b20002012370350200020153703800120002018370370200020143703602000200f3602a0012000200e36024c200020043602482000200c360244200020033602402000200b3703382000200a37033020002009370328200020083703202000200737031820002006370310200020053703082000200d3703002000201b370398012000201a37039001200041d8006a201137030020004188016a2019370300200041f8006a2017370300200041e8006a201337030020014180016a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b130020004102360204200041e8a7c4003602000b13002000410e360204200041a797c2003602000b130020004104360204200041b8a9c4003602000b02000b3101017f02404101101f2202450d00200042818080801037020420002002360200200241003a00000f0b410141011020000bd839030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a20091044200328021420014d0d03200328021020014102746a2207450d03200341086a20041044200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b01304110101f2207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010b50320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210b60320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210b60320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110b60320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110b60320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110b60320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210b6032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c20014104742012101e220f0d140c5c0b200341306a200341186a410110b60320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010b50320032802304101460d2f200341306a200341186a2003280234280204220510b60320032802300d41200341306a200341186a410110b60320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210b60320032802300d34200341306a200341186a410110b60320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110b6032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110b6032003280230450d0d0c2f0b2003200410442003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810b60320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010b50320032802304101460d32200341306a200341186a200328023428020410b60320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210b00320032802304101460d25200341306a200341186a2003280234220528020810b60320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110b60320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110b6032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010b50320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010b50320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10b60320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110b60320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b2012101f220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110b60320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c101d200341c0006a24000f0b4113101f2207450d382007410f6a41002800f4a642360000200741086a41002900eda642370000200741002900e5a642370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f101f2207450d38200741076a41002900ffa642370000200741002900f8a642370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f101f2207450d38200741076a410029008ea74237000020074100290087a742370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b4125101f2207450d392007411d6a41002900b3a742370000200741186a41002900aea742370000200741106a41002900a6a742370000200741086a410029009ea74237000020074100290096a742370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b4125101f2207450d392007411d6a41002900b3a742370000200741186a41002900aea742370000200741106a41002900a6a742370000200741086a410029009ea74237000020074100290096a742370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b4127101f2207450d3a2007411f6a41002900daa742370000200741186a41002900d3a742370000200741106a41002900cba742370000200741086a41002900c3a742370000200741002900bba742370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e101f2207450d3a200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e101f2207450d39200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e101f2207450d38200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e101f2207450d37200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e101f2207450d36200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b4127101f2207450d352007411f6a41002900a6a842370000200741186a410029009fa842370000200741106a4100290097a842370000200741086a410029008fa84237000020074100290087a842370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e101f2207450d34200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b4117101f2207450d332007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e101f2207450d33200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e101f2207450d30200741066a41002900b4a842370000200741002900aea842370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e101f2207450d2b200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b4117101f2207450d292007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e101f2207450d29200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e101f2207450d29200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b4117101f2207450d282007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b4117101f2207450d232007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e101f2207450d22200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b4117101f2207450d212007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b411341011020000b410f41011020000b410f41011020000b41f0aec40020072005104b000b412541011020000b412541011020000b411041041020000b412741011020000b1021000b201241041020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b412741011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b200328021c101d0b200341c0006a24000b19002000200141186a280200360204200020012802103602000b1100200028020035020041012001108b020bba0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a2008104420032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741f8b3c20020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a200810442003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41f8b3c200200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a2008104420032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c200341f8adc4003602382003200341206a3602282003200341286a360248200341d0006a200341386a10282003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41b4a2c20041dd00103a000b41f2a1c20041c200103a000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c20034188aec4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a1028200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000b0e00200035020041012001108b020bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b2000101d2007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b2001101d2007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d002006101d0b20020d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021052001101d2005450d00024020052802002201450d0003402005101d2001210520012802002200210120000d000b0b2005101d0b0bcb0a03037f017e027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002202417e6a2203412e4b0d0020030e2f061e220000141f18001d0a00000d0c1c26190b151b232111102728041a09080f24162503130520070201172a29120e060b200020023a00000f0b200020012d00013a00012000412b3a00000f0b200041046a200141046a2902003702002000412a3a00000f0b200041046a200141046a290200370200200041253a00000f0b200041046a200141046a2902003702002000411d3a00000f0b200041046a200141046a290200370200200041273a00000f0b200020012d00013a0001200041023a00000f0b200041046a200141046a290200370200200041293a00000f0b200041046a200141046a290200370200200041203a00000f0b200041046a200141046a2902003702002000411f3a00000f0b200020012d00013a0001200041046a200141046a2802003602002000410c3a00000f0b200041046a200141046a290200370200200041143a00000f0b200041046a200141046a280200360200200041103a00000f0b200041046a200141046a2802003602002000410f3a00000f0b200041086a200141086a290300370300200041303a00000f0b200041046a200141046a290200370200200041213a00000f0b200041046a200141046a2902003702002000411a3a00000f0b200041046a200141046a290200370200200041193a00000f0b200041046a200141046a2802003602002000412f3a00000f0b200041046a200141046a290200370200200041263a00000f0b200041046a200141046a280200360200200041073a00000f0b200041046a200141046a290200370200200041153a00000f0b200041046a200141046a290200370200200041233a00000f0b200020012d00013a00012000412c3a00000f0b200141086a2802002204ad2205421e88a70d142005420286a72203417f4c0d14200141046a28020021022003450d122003101f22060d13200341041020000b200041046a200141046a280200360200200041133a00000f0b200041046a200141046a2902003702002000411e3a00000f0b200041046a200141046a290200370200200041163a00000f0b200041046a200141046a280200360200200041113a00000f0b200041046a200141046a2802003602002000410b3a00000f0b200020012d00013a0001200041033a00000f0b200041046a200141046a280200360200200041083a00000f0b200041046a200141046a290200370200200041283a00000f0b200041046a200141046a290200370200200041183a00000f0b200020012d00013a0001200041043a00000f0b200041046a200141046a290200370200200041173a00000f0b200041046a200141046a290200370200200041223a00000f0b200041046a200141046a290200370200200041243a00000f0b200041046a200141046a280200360200200041123a00000f0b200041046a200141046a2902003702002000411b3a00000f0b200041046a200141046a2902003702002000411c3a00000f0b200041086a200141086a2903003703002000412e3a00000f0b200041046a200141046a2802003602002000412d3a00000f0b410421060b02402004450d002004410274210720062103034020032002280200360200200341046a2103200241046a21022007417c6a22070d000b0b200041086a2004360200200041046a20063602002000410c6a2001410c6a280200360200200041093a00000f0b102e000b9e0302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200028020822046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d01200028020020034104742004101e2207450d020c040b2000280200210720062005460d040c050b2004101f22070d020b200441081020000b1021000b20002007360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b200241ac013a00000c010b2001200641106a3602002002200610b30320022d000041ac01460d00200441016a2103200720044104746a2106024003402003210420062002290300370300200641086a200241086a29030037030020012802002203200141046a280200460d012001200341106a3602002002200310b303200441016a2103200641106a210620022d000041ac01470d000c020b0b200241ac013a00000b200041086a2004360200200241106a24000ba00201027f02400240024002402001410c6a2802002203417f6a220420034d0d004116101f2201450d01200020013602042001410e6a41002900eba942370000200141086a41002900e5a942370000200141002900dda942370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b101f2201450d0220002001360204200141176a410028008aaa42360000200141106a4100290083aa42370000200141086a41002900fba942370000200141002900f3a942370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b411641011020000b411b41011020000b4180afc40020022003104b000bf60201037f230041106b22032400024002402002450d0020032001410010b50320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f101f2202450d022000428f808080f00137020420002002360200200241076a41002900d5a942370000200241002900cea942370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b4125101f2202450d01200042a5808080d004370204200020023602002002411d6a41002900c6a942370000200241186a41002900c1a942370000200241106a41002900b9a942370000200241086a41002900b1a942370000200241002900a9a942370000200341106a24000f0b410f41011020000b412541011020000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200101d20022003470d140c150b0240200441086a280200450d00200441046a280200101d0b0240200441146a2802002200450d00200441186a280200450d002000101d0b200441246a280200450d12200441206a280200101d20022003470d130c140b0240200441086a280200450d00200441046a280200101d0b200441146a280200450d11200441106a280200101d20022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d002000280200101d0b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200101d20022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d002000280200101d0b0240200041106a280200450d002000410c6a280200101d0b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200101d20022003470d100c110b200441086a280200450d0e200441046a280200101d20022003470d0f0c100b200441086a280200450d0d200441046a280200101d20022003470d0e0c0f0b200441086a280200450d0c200441046a280200101d20022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d002000280200101d0b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200101d20022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200101d20022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d002005101d0b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200101d20022003470d080c090b2004410c6a280200450d06200441086a280200101d0c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d002007280200101d0b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a280200101d0b200a411c6a21000240200a41146a280200450d00200a280210101d0b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d280200101d0b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a280200101d0b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a280200101d0b2010411c6a21000240201041146a280200450d002010280210101d0b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d002005101d0b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a280200101d0b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200101d20022003470d050c060b200441086a280200450d03200f280200101d20022003470d040c050b200441086a280200450d02200c280200101d20022003470d030c040b200441086a280200450d012009280200101d20022003470d020c030b200441086a280200450d002006280200101d20022003470d010c020b20022003470d000b0b0be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d05200228020020032005101e2204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d08200228020020042003101e2204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003101e22040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005101e22040d0a0c0e0b2005101f22040d110b200541011020000b200228020021040c050b200228020021040c070b2003101f22040d0b0b200341011020000b2003101f2204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b2005101f2204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003101e22040d020c070b200228020021040c020b2003101f2204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b1021000b200341011020000b200541011020000b200341011020000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a280200200210a202200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a2802002200200110a1022000450d01200041186c2103200241146a21000340200041706a280200200041746a280200200110a2022000417c6a2802002000280200200110a202200041186a2100200341686a22030d000c020b0b200041086a2802002200200110a1022000450d00200041186c2103200241146a21000340200041706a280200200041746a280200200110a2022000417c6a2802002000280200200110a202200041186a2100200341686a22030d000b0b0bd90601037f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d07200128020020022004101e2203450d080c120b200141046a280200200141086a2802002202470d01200241016a22032002490d0e20024101742204200320032004491b22044100480d0e2002450d04200128020020022004101e2203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0d20024101742204200320032004491b22044100480d0d2002450d07200128020020022004101e2203450d080c090b200128020021030c0b0b200128020021030c0f0b200128020021030c070b2004101f22030d070b200441011020000b2004101f22030d0a0b200441011020000b2004101f22030d010b200441011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a280200200110a2020f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041086a2802002000410c6a280200200110a202200041146a280200200041186a280200200110a202024002400240200141046a28020020042802002202470d00200241016a22032002490d0320024101742204200320032004491b22044100480d032002450d01200128020020022004101e2203450d020c040b200128020021030c040b2004101f22030d020b200441011020000b1021000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041016a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a0000200041086a2802002000410c6a280200200110a202200041146a280200200041186a280200200110a202200041206a280200200041246a280200200110a2022000412c6a280200200041306a280200200110a2020b2700200028020c200041106a280200100a200041146a3502001018200041186a350200101800000b080020002001100a0b0600200010190b06002000101a0b2801017f0240200210192203450d002003200020022001200120024b1b10ce031a2000101a0b20030b1c01017f0240200010192201450d0020014100200010cd031a0b20010b9a09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1100000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a36020020002802044124470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a22002802044124470d03200028020028020021040b410121020c020b0c010b41f0b3c40020002004104b000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a36020020002802044124470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a22002802044124470d03200028020028020021040b410121020c020b0c010b41f0b3c40020002004104b000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001106000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110000450d010c050b0b4180b4c40020022004104b000b4190b3c400102c000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1100000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001106000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110000450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110000450d010b200341c0006a240041010f0b200341c0006a240041000b7701017f230041c0006b220024002000413336020c200041e3b0c200360208200041346a4125360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000b1c00200128021841accfc20041052001411c6a28020028020c1100000b02000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d01200028020020032004101e2203450d020c040b200028020021030c040b2004101f22030d020b200441011020000b1021000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a2001200210ce031a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d01200028020020032004101e2203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d03200028020020042003101e2204450d040c060b200028020021040c060b2004101f22030d060b200441011020000b2003101f22040d020b200341011020000b1021000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a200110ce031a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a0b1c400200241086a10c1032101200241206a240020010b0d0042ef81ecf9c6fdac889c7f0b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101106000d010b2002450d012000280218200220032000411c6a28020028020c11000021040b20040f0b41000b7c01017f230041306b22022400200241146a411b3602002002411b36020c200220003602082002200041046a3602102001411c6a2802002100200128021821012002412c6a41023602002002420237021c200241e0b3c4003602182002200241086a36022820012000200241186a10c1032101200241306a240020010b820c03037f017e167f410121020240200128021841272001411c6a2802002802101106000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b200310ec02450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641d8b7c2002107410021084102210941b002210a41a8b8c200210b41a8b8c200210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe037141087621134193bdc20021144100211541022116419f01211741d5bdc200211841d5bdc2002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff0371210041d7bac20021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e4193bdc200460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f20024193bdc200470d000b0b41012102200f4101710d0e0c0c0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041f3bec20021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41f0c1c200460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241f0c1c200470d000b0b41012102200f4101710d0d0c0b0b20082011102a000b201141af02102b000b20152011102a000b2011419e01102b000b4190b3c400102c000b4190b3c400102c000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110600450d000b41010f0b200141186a28020041272001411c6a28020028021011060021020b20020b0e00200035020041012001108b020b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b2205240020052001200220032004410010d503200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bb70502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d002003500d012004500d03200479a7200279a76b2207413f4b0d0241ff0020076b2108200741016a21070c0c0b200450450d012005450d0520034200510d0d20054200370308200520012003823703000c060b2004500d0c20014200510d032004427f7c2209200483500d07200479a7200279a76b2207413e4d0d090b2005450d012005200137030020052002370308420021010c070b2003427f7c2209200383500d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa710d403200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff007110d303200641106a20012002200741ff007110d403200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bfec0040200418080c0000bb1cf02746f6f206d616e7920696e737472756374696f6e73547269656420746f20736872696e6b20746f2061206c617267657220636170616369747974686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f657865632e727372656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e746961746520666565636f6e747261637420616c7265616479206578697374736e6f7420656e6f7567682067617320746f20706179207472616e736665722066656572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c2066656563616e2774206465636f6465207761736d20636f6465657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163656d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e76616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706552657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e74207479706573746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970656465706c6f796d656d6f727976616c69646174696f6e206572726f72657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e72733a617574683a41757261204c61737454696d657374616d7054696d657374616d70204d656469616e54696d657374616d702055706461746554696d657374616d7020526563656e7448696e747346696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f55736572732f612f7372632f737562737472617465322f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e727346696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265722f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e73656e7375732f7372632f6c69622e7273000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f73726d6c2f617572612f7372632f6c69622e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c6f66666c726570304e6f20606f66666c696e655f7265706f72746020666f756e6420696e2074686520696e686572656e742064617461214765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e7420646174614175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f55736572732f612f7372632f737562737472617465322f73726d6c2f617572612f7372632f6c69622e72734f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742e436f6e73656e737573204f726967696e616c417574686f7269746965736e6f74655f6f66666c696e6572656d61726b7365745f686561705f70616765737365745f636f64657365745f73746f726167656b696c6c5f73746f72616765204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b204e6f74652074686174207468652070726576696f757320626c6f636b27732076616c696461746f72206d697373656420697473206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e6f66666c696e653c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e74436f6e73656e7375734f726967696e616c417574686f7269746965735665633c543a3a53657373696f6e4b65793e53746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f55736572732f612f7372632f737562737472617465322f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e54696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656454696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f207061792074686569722066656573626164207369676e617475726520696e2065787472696e7369635472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e66696e616c5f68696e742048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e743a6865617070616765733a636f64655461626c6564537461727465645061737365644e6f7450617373656443616e63656c6c656444656c656761746564556e64656c6567617465645265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74696e67506572696f6444656d6f637261637920566f74654f6644656d6f63726163792050726f787944656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204c61756e6368506572696f6444656d6f6372616379205075626c696350726f707344656d6f6372616379205075626c696344656c617944656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7343616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d0000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72737365636f6e6470726f78795f766f746573746172745f7265666572656e64756d63616e63656c5f7265666572656e64756d63616e63656c5f7175657565647365745f70726f787972657369676e5f70726f787972656d6f76655f70726f787964656c6567617465756e64656c656761746520556e64656c656761746520766f74652e2044656c656761746520766f74652e746f6c6f636b5f706572696f64734c6f636b506572696f647320436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e77686963682052656d6f76652061207265666572656e64756d2e7265665f696e646578436f6d706163743c5265666572656e64756d496e6465783e2053746172742061207265666572656e64756d2e64656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b566f7465436f6d706163743c50726f70496e6465783e2050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e44656d6f63726163795075626c696350726f70436f756e745075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e4465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e294c61756e6368506572696f644d696e696d756d4465706f7369745075626c696344656c61794d61784c6f636b506572696f64735265666572656e64756d436f756e744e65787454616c6c795265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e566f74657273466f72566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e7449642950726f787944656c65676174696f6e7328543a3a4163636f756e7449642c204c6f636b506572696f6473292047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e20546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2f55736572732f612f7372632f737562737472617465322f73726d6c2f64656d6f63726163792f7372632f6c69622e727344656d6f6372616379204d696e696d756d4465706f73697476616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f77616c726561647920612070726f787977726f6e672070726f78796e6f742064656c65676174656444656d6f6372616379204d61784c6f636b506572696f6473766f74652068617320746f6f206772656174206120737472656e677468766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e736963734c656e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e646578426c6f636b206e756d626572206d6179206e65766572206265207a65726f2f55736572732f612f7372632f737562737472617465322f73726d6c2f73797374656d2f7372632f6c69622e7273626164206f726967696e3a20657870656374656420746f20626520616e20696e686572656e74206f726967696e53797374656d2045787472696e736963446174614e65774163636f756e745265617065644163636f756e74205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7453797374656d2044696765737453797374656d20506172656e744861736853797374656d2052616e646f6d5365656453797374656d204e756d62657253797374656d2045787472696e73696373526f6f7442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e4279746546656553797374656d20426c6f636b4861736853797374656d204576656e747353797374656d204163636f756e744e6f6e636542616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636542616c616e636573204c6f636b7373657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a09090971656453797374656d4163636f756e744e6f6e6365543a3a496e64657845787472696e736963436f756e74416c6c45787472696e736963734c656e426c6f636b4861736845787472696e7369634461746152616e646f6d536565644e756d626572506172656e744861736845787472696e73696373526f6f74446967657374543a3a4469676573744576656e74735665633c4576656e745265636f72643c543a3a4576656e743e3e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2052616e646f6d2073656564206f66207468652063757272656e7420626c6f636b2e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d6170732065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e67746820696e20627974657320666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e7472616e736665727365745f62616c616e636520536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920616e6420726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e66726565436f6d706163743c543a3a42616c616e63653e7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e42616c616e6365732056657374696e6742616c616e636573546f74616c49737375616e6365543a3a42616c616e63654578697374656e7469616c4465706f73697456657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e4672656542616c616e6365526573657276656442616c616e63654c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e20416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f64656e6f7420656e6f75676820667265652066756e64732f55736572732f612f7372632f737562737472617465322f73726d6c2f62616c616e6365732f7372632f6c69622e727342616c616e636573204372656174696f6e46656542616c616e636573205472616e7366657246656564657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7462616c616e636520746f6f206c6f7720746f2073656e642076616c7565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756566696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e64566f746572526561706564426164526561706572536c617368656454616c6c795374617274656454616c6c7946696e616c697a656420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572647572696e6720657865637574696f6e2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e7273436f756e63696c205265676973746572496e666f4f66436f756e63696c20416374697665436f756e63696c000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a090909097165647365745f617070726f76616c7370726f78795f7365745f617070726f76616c73726561705f696e6163746976655f766f746572726574726163745f766f7465727375626d69745f63616e64696461637970726573656e745f77696e6e65727365745f646573697265645f736561747372656d6f76655f6d656d6265727365745f70726573656e746174696f6e5f6475726174696f6e7365745f7465726d5f6475726174696f6e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e20546869732069732065666665637469766520696d6d6564696174656c792e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e2829606020607369676e6564602073686f756c642068617665206174206c6561737463616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473766f7465735665633c626f6f6c3e436f756e63696c43616e646964616379426f6e64566f74696e67426f6e6450726573656e74536c617368506572566f7465724361727279436f756e7450726573656e746174696f6e4475726174696f6e496e6163746976654772616365506572696f64566f7465496e6465785465726d4475726174696f6e446573697265645365617473416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e566f7465436f756e74417070726f76616c734f665265676973746572496e666f4f6628566f7465496e6465782c20753332294c6173744163746976654f66566f7465727343616e6469646174657343616e646964617465436f756e744e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29536e617073686f7465645374616b65735665633c42616c616e63654f663c543e3e4c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e2047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e20546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e205468652070726573656e742063616e646964617465206c6973742e205468652070726573656e7420766f746572206c6973742e20546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e436f756e63696c20566f74696e67506572696f64436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6e436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c20566f74657273436f756e63696c20536e617073686f7465645374616b6573436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f617264436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e6466696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e00000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f73656174732e72736e6f7420612070726f7879436f756e63696c204c6173744163746976654f6663616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665626164207265706f7274657220696e646578436f756e63696c20496e6163746976654772616365506572696f64436f756e63696c20566f74696e67426f6e646261642074617267657420696e64657863616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f74657272657472616374696f6e20696e64657820696e76616c696472657472616374696f6e20696e646578206d69736d617463686475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647363616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c656374656470726573656e7465642063616e646964617465206d7573742062652063757272656e74436f756e63696c2050726573656e74536c617368506572566f7465726475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c436f756e63696c20417070726f76616c734f666e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520617070726f76616c20766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e646964617465735468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f722142616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b696e697469616c697a655f626c6f636b6170706c795f65787472696e736963696e686572656e745f65787472696e73696373636865636b5f696e686572656e747376616c69646174655f7472616e73616374696f6e6f6666636861696e5f776f726b65726772616e6470615f70656e64696e675f6368616e67656772616e6470615f666f726365645f6368616e6765617373657274696f6e206661696c65643a20696e646578203c206c656e000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962616c6c6f632f7665632e727354696d657374616d702044696455706461746554616c6c7943616e63656c6174696f6e54616c6c795265666572656e64756d204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652e204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652e4e6577417574686f726974696573204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c2853657373696f6e4b65792c20753634293e3a6772616e6470613a617574683a6c656e54696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f55736572732f612f7372632f737562737472617465322f73726d6c2f74696d657374616d702f7372632f6c69622e727354696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b54696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7754696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f64436f756e63696c566f74696e6720436f756e63696c566f74654f662f55736572732f612f7372632f737562737472617465322f73726d6c2f7375646f2f7372632f6c69622e7273000000000000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f766f74696e672e727354696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746153756469644b65794368616e67656420546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e7665746f7365745f636f6f6c6f66665f706572696f647365745f766f74696e675f706572696f64626c6f636b7370726f706f73616c5f68617368426f783c543a3a50726f706f73616c3e436f756e63696c566f74696e67436f6f6c6f6666506572696f64566f74696e67506572696f64456e61637444656c6179506572696f645665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e543a3a50726f706f73616c50726f706f73616c566f74657273436f756e63696c566f74654f6628543a3a486173682c20543a3a4163636f756e744964295665746f656450726f706f73616c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e29204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e7265706f72745f6d69736265686176696f72205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479204e657874466f726365644772616e64706146696e616c69747950656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e4e657874466f7263656473657420536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d704e6f77426c6f636b506572696f644d696e696d756d506572696f6444696455706461746520446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e436f756e63696c566f74696e672050726f706f73616c73436f756e63696c566f74696e672050726f706f73616c4f66436f756e63696c566f74696e67205665746f656450726f706f73616c436f756e63696c566f74696e6720456e61637444656c6179506572696f6447757275206d656469746174696f6e6f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f5375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b657952657475726e207479706573206c656e6774682073686f756c642062652030206f722031436f756e63696c566f74696e6720566f74696e67506572696f6470726f706f73657220776f756c64206e6f74206265206f6e20636f756e63696c70726f706f73616c206973207665746f6564436f756e63696c566f74696e672050726f706f73616c566f746572736f6e6c7920636f756e63696c6c6f7273206d617920766f7465206f6e20636f756e63696c2070726f706f73616c736120636f756e63696c6c6f72206d6179206e6f74207665746f20612070726f706f73616c2074776963656f6e6c7920636f756e63696c6c6f7273206d6179207665746f20636f756e63696c2070726f706f73616c7370726f706f73616c206d75737420657869737420746f206265207665746f6564436f756e63696c566f74696e6720436f6f6c6f6666506572696f642041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e5375646f4b65792054686520604163636f756e74496460206f6620746865207375646f206b65792e53657373696f6e20466f7263696e674e657753657373696f6e4e657753657373696f6e204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e426c6f636b4e756d6265725370656e64696e67417761726465644275726e74526f6c6c6f766572205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e53657373696f6e2043757272656e74496e64657853657373696f6e2053657373696f6e4c656e67746853657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f72547265617375727920506f7454726561737572792050726f706f73616c73616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f7765642f55736572732f612f7372632f737562737472617465322f73726d6c2f73657373696f6e2f7372632f6c69622e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f74726561737572792f7372632f6c69622e7273636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e72737365745f6b65797365745f6c656e677468666f7263655f6e65775f73657373696f6e20466f726365732061206e65772073657373696f6e2e205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e2053657473207468652073657373696f6e206b6579206f6620605f76616c696461746f726020746f20605f6b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e6b6579543a3a53657373696f6e4b657953657373696f6e53657373696f6e4c656e67746843757272656e74496e64657843757272656e745374617274543a3a4d6f6d656e74466f7263696e674e657753657373696f6e4c6173744c656e6774684368616e67654e6578744b6579466f724e65787453657373696f6e4c656e67746820546865206e6578742073657373696f6e206c656e6774682e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e20426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e204e65772073657373696f6e206973206265696e6720666f72636564206966207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c7565206973207768657468657220746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e2054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e2043757272656e7420696e646578206f66207468652073657373696f6e2e2043757272656e74206c656e677468206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e70726f706f73655f7370656e647365745f706f74636f6e66696775726572656a6563745f70726f706f73616c617070726f76655f70726f706f73616c20417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f6964202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d7370656e645f706572696f646275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e62656e6566696369617279547265617375727950726f706f73616c426f6e645065726d696c6c50726f706f73616c426f6e644d696e696d756d5370656e64506572696f644275726e506f7450726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e417070726f76616c735665633c50726f706f73616c496e6465783e2050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e53657373696f6e204c6173744c656e6774684368616e676553657373696f6e2043757272656e74537461727453657373696f6e204e65787453657373696f6e4c656e67746800000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72735472656173757279205370656e64506572696f64547265617375727920417070726f76616c735472656173757279204275726e50726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465784e65774163636f756e74496e6465782041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d6974206279207072696365496e646963657320456e756d53657400000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f696e64696365732f7372632f6c69622e7273696e76616c6964206163636f756e7420696e646578000000000000000000000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564496e64696365734e657874456e756d536574543a3a4163636f756e74496e646578456e756d5365742054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d5365740000000000000000000000000000000000000000005265776172644f66666c696e655761726e696e674f66666c696e65536c617368204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c2077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c6564676572626f6e64626f6e645f6578747261756e626f6e6477697468647261775f756e626f6e64656476616c69646174656e6f6d696e6174656368696c6c7365745f70617965657365745f636f6e74726f6c6c65727365745f73657373696f6e735f7065725f6572617365745f626f6e64696e675f6475726174696f6e7365745f76616c696461746f725f636f756e74666f7263655f6e65775f6572617365745f6f66666c696e655f736c6173685f67726163657365745f696e76756c6e657261626c657320536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72735665633c543a3a4163636f756e7449643e2053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e6170706c795f726577617264732054686520696465616c206e756d626572206f662076616c696461746f72732e6e657720546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e2053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e436f6d706163743c543a3a426c6f636b4e756d6265723e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e636f6e74726f6c6c657220546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b207165645374616b696e67204f66666c696e65536c6173685374616b696e6720466f7263696e674e65774572614c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656468656164206f66205374616b696e672056616c696461746f72735374616b696e67205374616b6572730000000000000000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e727356616c696461746f72436f756e744d696e696d756d56616c696461746f72436f756e7453657373696f6e73506572457261543a3a426c6f636b4e756d62657253657373696f6e52657761726450657262696c6c4f66666c696e65536c6173684772616365426f6e64696e674475726174696f6e496e76756c6e657261626c6573426f6e6465644c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e506179656556616c696461746f72734e6f6d696e61746f72735374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e43757272656e74456c656374656443757272656e7445726143757272656e7453657373696f6e52657761726443757272656e744572615265776172644e65787453657373696f6e735065724572614c6173744572614c656e6774684368616e6765536c6f745374616b65536c617368436f756e74466f7263696e674e65774572612829526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202877686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e2057652061726520666f7263696e672061206e6577206572612e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e20546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e20746865206073657373696f6e7360206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e20546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e20546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e2f55736572732f612f7372632f737562737472617465322f73726d6c2f7374616b696e672f7372632f6c69622e72735374616b696e672043757272656e7453657373696f6e5265776172645374616b696e672043757272656e744572615265776172645374616b696e67204c6173744572614c656e6774684368616e67655374616b696e672053657373696f6e735065724572615374616b696e672043757272656e74456c65637465645374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e67204e65787453657373696f6e735065724572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e67204e6f6d696e61746f72735374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f20646976696465206279207a65726f636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f7420612073746173686e6f74206120636f6e74726f6c6c65725374616b696e6720426f6e64696e674475726174696f6e756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d707479436f6e7472616374204163636f756e74436f756e746572436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e7472616374205072697374696e65436f6465436f6e7472616374204163636f756e74496e666f4f66436f6e747261637420436f646553746f72616765436f6e747261637420436f6465486173684f66436f6e7472616374204761735072696365436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e4279746546656573797374656d6175726174696d657374616d70636f6e73656e737573696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f766f74696e67636f756e63696c5f6d6f74696f6e7366696e616c6974795f747261636b65726772616e6470617472656173757279636f6e74726163747375646f5472616e73666572496e7374616e746961746564436f646553746f7265645363686564756c655570646174656444697370617463686564436f6e747261637420416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e5665633c75383e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e42616c616e63657570646174655f7363686564756c657075745f636f646563616c6c63726561746520437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d207468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2074686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20746865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792063726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e74436f6d706163743c42616c616e63654f663c543e3e6761735f6c696d6974436f6d706163743c543a3a4761733e636f64655f68617368436f6465486173683c543e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e646573743c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636576616c75652053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e5472616e7366657246656542616c616e63654f663c543e4372656174696f6e4665655472616e73616374696f6e426173654665655472616e73616374696f6e42797465466565436f6e747261637446656543616c6c42617365466565543a3a4761734372656174654261736546656547617350726963654d61784465707468426c6f636b4761734c696d69744761735370656e7443757272656e745363686564756c65436f6465486173684f66543a3a4163636f756e7449645072697374696e65436f6465436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c654163636f756e74436f756e7465727536344163636f756e74496e666f4f664163636f756e74496e666f20546865207375627472696520636f756e7465722041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f722074686520657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e7375627374726174652d6e6f6465df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d4010000007801759919ee83e501000000446570726563617465642c20706c65617365207573652060417574686f726974696573417069602e2f55736572732f612f7372632f737562737472617465322f6e6f64652f72756e74696d652f7372632f6c69622e72734469676573744974656d206e6f7420657175616c2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f6c69622e7273436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e747261637420437265617465426173654665656e6f7420616c6c6f77656420746f206661696c20696e2072756e74696d652f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e322e302f7372632f636f6465632e7273626164206f726967696e3a20657870656374656420746f2062652061207468726573686f6c64206e756d626572206f6620636f756e63696c206d656d6265727350726f706f736564566f746564417070726f766564446973617070726f76656445786563757465642041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e48617368626f6f6c2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e4163636f756e7449647533322041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e50726f706f73616c496e64657800000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e727300000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e727370726f706f7365766f746570726f706f73616c543a3a48617368696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f76657468726573686f6c64436f6d706163743c7533323e426f783c3c542061732054726169743e3a3a50726f706f73616c3e436f756e63696c4d6f74696f6e7350726f706f73616c735665633c543a3a486173683e50726f706f73616c4f663c542061732054726169743e3a3a50726f706f73616c566f74696e672850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2950726f706f73616c436f756e742050726f706f73616c7320736f206661722e20566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e205468652028686173686573206f662920746865206163746976652070726f706f73616c732e00000000002f55736572732f612f7372632f737562737472617465322f73726d6c2f7374616b696e672f7372632f70687261676d656e2e727370726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b20716564436f756e63696c4d6f74696f6e732050726f706f73616c4f666475706c69636174652070726f706f73616c73206e6f7420616c6c6f77656470726f706f736572206e6f74206f6e20636f756e63696c436f756e63696c4d6f74696f6e732050726f706f73616c436f756e74436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67766f746572206e6f74206f6e20636f756e63696c70726f706f73616c206d7573742065786973746d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f726564696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e6578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d5f736565646578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e7466756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e647343616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a202f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a090909097165645369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e7667617300000000000000000000002f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e7273617373657274696f6e206661696c65643a20656e64203c3d206c656e617373657274696f6e206661696c65643a20696e646578203c3d206c656e6066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64000000002f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e647300002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e7273547261696c696e6744617461556e6578706563746564456f66496e76616c696444617461492f4f204572726f723a20696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f55736572732f612f7372632f737562737472617465322f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e727361757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e644578706c69636974207265706f7274696e67206e6f7420616c6c6f77656474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e45787472696e7369635375636365737345787472696e7369634661696c656420416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e48617368206e6f7420657175616c000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f636f72652f73722d7072696d6974697665732f7372632f6c69622e72730000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e727352756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e67617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a206361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e72736120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f727372632f6c6962636f72652f726573756c742e727300000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e6465782069732030303031303230333034303530363037303830393130313131323133313431353136313731383139323032313232323332343235323632373238323933303331333233333334333533363337333833393430343134323433343434353436343734383439353035313532353335343535353635373538353936303631363236333634363536363637363836393730373137323733373437353736373737383739383038313832383338343835383638373838383939303931393239333934393539363937393839397372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d7372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f66206000000000000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e00010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e85927372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f723a20204572726f720041b8cfc2000bb8f10115001000240000004c98100017000000400200000900000039001000340000006d0010003100000097000000030000002600000000000000010000002700000028000000290000002a0000002b00000018000000040000002c0000002d0000002e0000002f000000ae0410007c0000002a051000350000007a00000006000000ac05100031000000dd0510003800000079000000040000001506100023000000dd051000380000007a00000004000000879510002800000038061000310000001a010000010000007006100048000000eb0900000a000000c006100019000000e00610002c000000ed0000001e0000009f07100022000000c10710002c000000b300000003000000ed07100028000000c10710002c000000b90000000300000000000000394b1000120000000000000014dc10000100000000000000000000002cdc1000010000000000000000000000320810000c000000000000000caa100001000000000000000000000024aa10000100000000000000000000003e08100006000000000000002caa100001000000000000000000000044aa1000010000000000000000000000440810000e000000000000004caa100001000000000000000000000064aa10000100000000000000000000005208100008000000000000006caa100001000000000000000000000084aa10000100000000000000000000005a0810000b000000000000008caa1000010000000000000000000000a4aa1000010000000000000000000000650810000c00000000000000acaa1000010000000000000000000000c4aa10000100000000000000000000009409100007000000000000009b0910003d000000400910005400000000000000390910000700000000000000137b1000070000001e0910001b00000000000000190910000500000000000000c882100003000000da0810003f00000000000000e56410000300000000000000137b100007000000c80810001200000000000000b60810000500000000000000bb0810000d0000009b0810001b000000000000008f08100004000000000000009308100008000000710810001e00000000000000e1091000130000000000000000000000f40910001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100030ab10000000000000000000f899100000000000000000000000000026000000000000000100000030000000970c10001c0000002e0a1000310000006900000003000000730c1000240000002e0a1000310000007100000003000000210c1000380000002e0a100031000000ae0000002a000000f90b1000280000002e0a100031000000af00000032000000d10b1000280000002e0a100031000000b10000002c000000a50b10002c0000002e0a100031000000b00000004c000000860a1000320000002e0a100031000000e5000000030000005f0a1000270000002e0a100031000000ed00000004000000060a1000280000002e0a100031000000f300000003000000620b100043000000dd05100038000000b20000000400000000000000b30c10000a000000000000005cac100001000000000000000000000074ac1000020000000000000000000000150d100004000000000000003a65100017000000bd0c10003d000000fa0c10001b00000038061000310000001a010000010000000000000081881000080000000000000020ae1000020000000000000000000000f8991000000000000000000000000000280d1000060000000000000030ae1000030000000000000000000000f89910000000000000000000000000002e0d1000070000000000000048ae1000020000000000000000000000f8991000000000000000000000000000350d1000060000000000000058ae1000010000000000000000000000f89910000000000000000000000000003b0d1000090000000000000058ae1000010000000000000000000000f8991000000000000000000000000000440d1000090000000000000058ae1000010000000000000000000000f8991000000000000000000000000000a1881000080000000000000060ae1000020000000000000000000000f89910000000000000000000000000004d0d1000090000000000000078071100020000000000000000000000f8991000000000000000000000000000560d10000b000000000000001cd71000010000000000000000000000f899100000000000000000007d0d1000090000006f7c1000070000007d0d1000090000006f7c100007000000112c10000e000000610d10000f000000700d10000d000000610d10000f000000610d10000f000000ee88100004000000500f100039000000900f100048000000100200002d000000000f100048000000f10900000e000000000000003b8b10000700000000000000a8b01000020000000000000000000000d8b01000010000000000000000000000d80f10000600000000000000e0b01000010000000000000000000000d8b01000010000000000000000000000428b10000400000000000000f8b0100002000000000000000000000028b11000020000000000000000000000de0f10000a00000000000000f8b0100002000000000000000000000038b11000020000000000000000000000e80f1000100000000000000048b1100003000000000000000000000090b11000010000000000000000000000f80f1000110000000000000098b11000010000000000000000000000b0b11000010000000000000000000000091010000d00000000000000b8b11000020000000000000000000000e8b11000010000000000000000000000161010000900000000000000f0b1100001000000000000000000000008b210000100000000000000000000001f1010000c00000000000000f899100000000000000000000000000010b210000100000000000000000000002b1010000c00000000000000f0b1100001000000000000000000000018b2100001000000000000000000000037101000080000000000000020b2100002000000000000000000000050b210000100000000000000000000003f1010000a00000000000000f899100000000000000000000000000058b21000010000000000000000000000468b10000800000000000000f44910001000000000000000b88010000500000000000000b77e1000150000006d1210002800000000000000468b100008000000000000005b12100012000000000000003f1110000900000000000000481110001800000000000000428b1000040000000000000057121000040000000a1210004d000000db1110002f0000007911100062000000db1110002f00000000000000468b10000800000000000000f44910001000000000000000778b10000900000000000000700d10000d00000000000000741110000500000000000000f96c10000e0000006011100014000000000000003f111000090000000000000048111000180000002a11100015000000000000002111100004000000000000003a6510001700000000000000251110000500000000000000808b10000c000000f91010002800000000000000f41010000500000000000000818210000c000000ce10100026000000a810100026000000821010002600000000000000691010000200000000000000818210000c000000000000006b1010000c00000000000000771010000b0000005a1010000f0000004910100011000000000000009e1210000f00000000000000000000007d0d10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b910000000000000000000a0b8100001000000000000000100000000000000ad1210000b0000000000000000000000b81210002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100058b910000000000000000000a8b8100001000000000000000100000000000000e31210000900000001000000000000007d0d10000900000000000000ec1210002100000000000000000000000000000000000000000000000000000000000000f8991000b0b810000000000000000000c0b81000010000000000000000000000000000000d1310000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100008b910000000000000000000c8b8100001000000000000000100000000000000191310000e0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d0b810000000000000000000e0b8100001000000000000000100000000000000271310000b0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e8b810000000000000000000f8b8100001000000000000000100000000000000321310000e0000000000000000000000771010000b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070b91000000000000000000000b91000010000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100008b91000000000000000000080d3100001000000000000000100000000000000401310000f0000000000000000000000610d10000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b91000000000000000000018b91000010000000000000001000000000000004f131000090000000000000000000000610d10000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b91000000000000000000030b910000100000000000000010000000000000058131000100000000100000000000000610d10000f00000000000000681310002d00000000000000000000000000000000000000000000000000000000000000f899100098b91000000000000000000038b9100001000000000000000000000000000000951310000d0000000100000000000000f96c10000e00000000000000a21310002b00000000000000000000000000000000000000000000000000000000000000f899100040b91000000000000000000050b9100001000000000000000100000000000000cd131000090000000100000000000000610d10000f00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100058b91000000000000000000068b9100001000000000000000100000000000000d6131000060000000100000000000000dc1310001f00000000000000571210000400000000000000000000000000000000000000000000000000000000000000f899100070b91000000000000000000080b9100003000000000000000100000000000000fb131000050000000100000000000000818210000c00000000000000818210000c00000000000000000000000000000000000000000000000000000000000000f899100098b910000000000000000000a8b9100001000000000000000000000000000000001410000b0000000101000000000000818210000c000000000000000b1410001b00000000000000000000000000000000000000000000000000000000000000f8991000b0b910000000000000000000c0b910000100000000000000010000009b1810003d0000007b18100020000000260000000000000001000000310000005a18100021000000211810003900000026000000000000000100000032000000d41710004d000000260000000000000001000000330000009f17100035000000291710007600000026000000000000000100000034000000db1610004e00000026000000000000000100000035000000a9161000320000007c1610002d000000260000000000000001000000360000004c1610003000000026000000000000000100000036000000231610002900000026000000000000000100000030000000e4141000750000005915100072000000cb1510005800000026000000000000000100000030000000761410006e0000002600000000000000010000003700000026141000500000008795100028000000d8181000310000005300000001000000d8181000310000005300000001000000ab1a10001e000000c91a10002e000000ad0100000300000000000000381b10000a0000000000000044ef10000200000000000000000000008cba1000010000000000000000000000421b10000d000000000000001cd7100001000000000000000000000094ba1000010000000000000000000000b17a100008000000000000009cba1000040000000000000000000000bcba10000100000000000000921b10001b0000007b1b100017000000d789100009000000d7891000090000006f7c1000070000006f7c1000070000004f1b10002c0000008795100028000000af9510003d000000370100000900000000000000f51d10000c0000000100000000000000818210000c00000000000000011e10000800000000000000000000000000000000000000000000000000000000000000f899100068bf1000000000000000000028bf100001000000000000000100000000000000091e10000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000030bf100001000000000000000000000000000000171e1000100000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000038bf100001000000000000000000000000000000271e1000090000000100000000000000f96c10000e000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000040bf100001000000000000000100000000000000301e10000d0000000100000000000000e08910000300000000000000137b10000700000000000000000000000000000000000000000000000000000000000000f899100048bf1000000000000000000058bf1000010000000000000001000000000000003d1e10000a00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000060bf100001000000000000000100000000000000471e1000060000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100068bf1000000000000000000078bf1000010000000000000001000000000000004d1e10000a00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000080bf100001000000000000000100000000000000571e10000e00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000098bf100001000000000000000100000000000000651e10000600000000000000000000006b1e10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0bf10000000000000000000b0bf100001000000000000000100000000000000741e10000600000000000000000000007a1e10001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8bf10000000000000000000c8bf1000010000000000000001000000ab2010001f0000007d2010002e0000002f2010004e000000092010002600000026000000000000000100000036000000bd1f10004c0000009b1f10002200000026000000000000000100000033000000591f1000420000003d1f10001c00000026000000000000000100000038000000f81e10004500000026000000000000000100000036000000bc1e10003c00000026000000000000000100000036000000941e10002800000000000000ca201000080000000000000028c0100002000000000000000000000058c01000080000000000000000000000d22010000b0000000000000098c01000030000000000000000000000e0c01000080000000000000000000000918010000400000000000000958010002300000000000000b8801000050000000000000038221000130000005322100036000000f8991000000000008922100042000000cb221000480000001323100045000000582310002d000000f8991000000000008523100046000000000000001132100003000000000000009580100023000000000000003422100004000000000000003822100013000000000000004b22100008000000000000003822100013000000dd20100025000000f899100000000000022110004000000042211000460000008821100049000000d121100036000000f899100000000000072210002d00000000000000e32310000d0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000008c5100001000000000000000100000000000000fa231000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000010c5100001000000000000000100000000000000d48110000b0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000ec10110001000000000000000100000000000000eb8110000b0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000f410110001000000000000000100000000000000f6811000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000fc1011000100000000000000010000000000000008821000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000014111100010000000000000001000000000000000c241000070000000100000000000000818210000c00000000000000132410001b00000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000028c51000010000000000000000000000000000002e2410000b0000000100000000000000818210000c00000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000030c510000b000000000000000100000000000000392410000f0000000100000000000000818210000c00000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000098c510000b00000000000000010000000000000048241000050000000100000000000000818210000c000000000000004d2410002c00000000000000000000000000000000000000000000000000000000000000f8991000f0c51000000000000000000000c61000010000000000000001000000d729100026000000a229100035000000260000000000000001000000300000006c29100036000000f226100027000000f8991000000000001927100050000000692710005d000000c6271000550000001b2810004f0000006a28100051000000bb28100015000000f899100000000000d028100057000000272910004500000026000000000000000100000032000000a72410005d0000000425100027000000f8991000000000002b2510005b0000008625100049000000f899100000000000cf2510005d0000002c2610002d000000f8991000000000005926100053000000ac2610004600000026000000000000000100000036000000792410002e0000008795100028000000692a1000300000006901000001000000692a100030000000690100000100000000000000822b10000b0000000000000078071100020000000000000000000000e0c610000100000000000000000000008d2b100010000000000000001cd71000010000000000000000000000e8c610000100000000000000000000009d2b10000c0000000000000098071100010000000000000000000000f0c61000010000000000000000000000a92b10000e00000000000000f8c6100002000000000000000000000008c7100001000000000000006b2c1000150000005c2c10000f0000001f2c10003d000000112c10000e000000112c10000e000000b72b10005a0000008795100028000000902c1000390000005c00000008000000002d100019000000202d100048000000bb0100002d00000000000000d92f10000d00000000000000f8c8100002000000000000000000000028c91000020000000000000000000000e62f10001300000000000000f8c8100002000000000000000000000038c91000020000000000000000000000f92f1000130000000000000048c91000040000000000000000000000a8c910000500000000000000000000000c3010000d00000000000000d0c91000010000000000000000000000e8c91000010000000000000000000000193010001000000000000000f0c9100001000000000000000000000008ca1000030000000000000000000000293010000e0000000000000020ca100003000000000000000000000068ca100003000000000000000000000037301000110000000000000080ca100001000000000000000000000098ca1000030000000000000000000000483010000d00000000000000b0ca1000010000000000000000000000c8ca1000030000000000000000000000553010001900000000000000e0ca1000010000000000000000000000f8ca10000200000000000000000000006e3010001100000000000000e0ca100001000000000000000000000008cb10000200000000000000000000009736100005000000000000009c3610000900000000000000558b10000500000000000000c2331000120000003f361000580000002f36100010000000ca351000650000002f3610001000000000000000a13510000e00000000000000808b10000c00000000000000113210000300000000000000958010002300000000000000af3510000900000000000000808b10000c00000000000000b83510001200000000000000c2331000120000008534100058000000dd3410005c0000003935100028000000f899100000000000613510004000000000000000558b10000500000000000000808b10000c0000003a3410004b00000000000000363410000400000000000000808b10000c000000d43310001e000000f899100000000000f23310004400000000000000b43310000900000000000000958010002300000000000000bd3310000500000000000000b77e10001500000000000000558b10000500000000000000c233100012000000d4321000590000002d33100069000000963310001e00000000000000413110000500000000000000808b10000c00000014321000590000006d3210005a000000c73210000d000000000000001132100003000000000000009580100023000000463110005c000000a231100050000000f23110001f000000000000004131100005000000000000003a65100017000000eb30100056000000d3301000180000007f30100054000000d33010001800000000000000ac3610000d0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e8d210000000000000000000f8d2100001000000000000000100000000000000b93610000a0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100000d31000000000000000000010d3100001000000000000000100000000000000c3361000140000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d31000000000000000000028d3100001000000000000000100000000000000d73610000a0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100030d31000000000000000000040d3100001000000000000000100000000000000e1361000140000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070d31000000000000000000048d3100001000000000000000100000000000000f5361000130000000000000000000000083710000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100050d31000000000000000000060d31000020000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070d31000000000000000000080d3100001000000000000000100000000000000113710000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088d31000000000000000000098d31000010000000000000001000000000000001d3710000c0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000a0d3100001000000000000000100000000000000293710000d0000000000000000000000363710002300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d410000000000000000000a8d310000400000000000000010000000000000059371000090000000000000000000000083710000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000c8d3100001000000000000000100000000000000623710000b0000000100000000000000818210000c000000000000009c3610000900000000000000000000000000000000000000000000000000000000000000f899100040d410000000000000000000d0d31000020000000000000001000000000000006d3710000e0000000100000000000000818210000c000000000000007b3710001000000000000000000000000000000000000000000000000000000000000000f8991000f0d310000000000000000000e0d31000020000000000000000000000000000008b3710000c0000000100000000000000818210000c00000000000000083710000900000000000000000000000000000000000000000000000000000000000000f8991000f0d31000000000000000000000d410000100000000000000000000000000000097371000060000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000008d41000010000000000000001000000000000009d3710000a0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000010d4100001000000000000000100000000000000a73710000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000f899100000000000000000000100000000000000b53710000c0000000000000000000000c13710002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028d41000000000000000000038d4100001000000000000000000000000000000e9371000100000000000000000000000f93710001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000050d41000010000000000000001000000000000000a3810000b0000000000000000000000153810002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100058d41000000000000000000068d4100001000000000000000000000026000000000000000100000039000000dd3d100041000000260000000000000001000000320000009b3d1000420000002600000000000000010000003a000000583d1000430000002600000000000000010000003b0000000b3d10004d000000bc3c10004f0000002600000000000000010000003c000000403c100068000000a83c10001400000026000000000000000100000034000000123c10002e0000002600000000000000010000003d000000ec3b100026000000b23b10003a000000853a10005b000000e03a10005c0000003c3b10005c000000983b10001a000000443a100041000000d93910005b000000343a100010000000643910005f000000c3391000160000002600000000000000010000003000000024391000400000000c39100018000000f03810001c0000002600000000000000010000003500000026000000000000000100000031000000a838100048000000260000000000000001000000360000006e3810003a000000260000000000000001000000310000003638100038000000b03f100039000000202d100048000000100200002d000000603f100048000000eb0900000a000000603f100048000000f10900000e0000008795100028000000e93f100031000000ab00000001000000e93f100031000000ab00000001000000004510000d000000e54410001b000000948610002f000000f1000000010000000d451000100000001d4510000f0000002c451000130000003f4510000f0000004e45100014000000624510000f000000714510001600000087451000150000009c4510001d00000045921000130000009603000009000000c045100043000000860a000025000000c0451000430000008c0a00002c00000000000000164610001000000000000000c0d51000040000000000000000000000e0d51000020000000000000000000000264610000f00000000000000c0d51000040000000000000000000000f0d510000200000000000000ea88100004000000e089100003000000e089100003000000e089100003000000904610004000000068461000280000003546100033000000684610002800000000000000d04610000e000000000000002cd6100001000000000000000000000034d6100001000000000000000247100016000000de46100024000000294710002b0000005447100031000000f10000000400000085471000300000005447100031000000db00000004000000b54710004e0000005447100031000000dc000000040000008795100028000000574810002c0000008c000000010000008795100028000000d8481000320000003a00000001000000000000005749100005000000000000000cd7100001000000000000000000000014d710000100000000000000000000005c4910000a000000000000001cd7100001000000000000000000000024d710000100000000000000ee88100004000000a249100018000000d789100009000000664910003c000000000000003b8b1000070000000000000008d81000010000000000000000000000f8991000000000000000000000000000428b1000040000000000000020d81000020000000000000000000000f8991000000000000000000000000000ba491000040000000000000050d81000010000000000000000000000f8991000000000000000000000000000be491000120000000000000068d81000010000000000000000000000f8991000000000000000000000000000d0491000110000000000000068d81000010000000000000000000000f8991000000000000000000000000000468b10000800000000000000f44910001000000000000000468b100008000000000000004e8b10000700000000000000708b10000700000000000000ee8810000400000000000000e74910000d000000000000004e8b10000700000000000000e149100006000000000000003a6510001700000000000000114a10000d0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0db10000000000000000000f8991000000000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040df10000000000000000000f8991000000000000000000001000000000000002a4a1000100000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b0db10000000000000000000c0db100001000000000000000100000000000000b58b10000900000000000000000000003a4a10001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c8db10000000000000000000f899100000000000000000000100000000000000ca8b10000a00000001000000000000004e8b10000700000000000000584a10000b00000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000634a10000e00000001000000000000004e8b10000700000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f8991000c8db10000000000000000000f899100000000000000000000100000000000000714a10000d00000001000000000000007e4a10001700000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000954a10000e00000001000000000000004e8b10000700000000000000a34a10002300000000000000000000000000000000000000000000000000000000000000f8991000d8db10000000000000000000f89910000000000000000000000000002600000000000000010000003400000026000000000000000100000033000000c64a100073000000260000000000000001000000360000002600000000000000010000003100000000000000394b1000120000000000000014dc10000100000000000000000000002cdc1000010000000000000000000000644b10000700000000000000137b1000070000004b4b10001900000000000000b14b10000d0000000000000000000000be4b10003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000f04b10000a0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000fa4b1000030000000000000028dd100001000000000000000000000040dd1000080000000000000000000000384d100003000000000000003b4d100012000000fd4b100016000000f899100000000000134c10005d000000704c10002f000000f8991000000000009f4c100063000000aba7100001000000024d10003600000000000000564d10000300000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010df1000000000000000000020df100001000000000000000100000000000000594d10000b00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df1000000000000000000038df100001000000000000000000000000000000644d10000d00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040df1000000000000000000050df100004000000000000000100000000000000714d1000090000000000000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070df1000000000000000000080df100001000000000000000100000026000000000000000100000033000000214f10002400000026000000000000000100000030000000d04e1000510000002600000000000000010000003e000000a74d10005a000000014e10005a0000005b4e100059000000b44e10001c000000260000000000000001000000300000007a4d10002d0000009048100048000000eb0900000a000000574810002c0000008c00000001000000d8481000320000003a0000000100000000000000ad7a1000040000000000000008d8100001000000000000000000000010e010000300000000000000000000005d551000070000000000000028e0100001000000000000000000000040e010000300000000000000f35110004e000000f899100000000000bf5110003400000000000000e564100003000000000000009580100023000000625110005d000000f899100000000000bf511000340000000000000045521000030000000000000000000000818210000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000bce010000000000000000000cce010000100000000000000010000002600000000000000010000003f000000485210002100000000000000825210000a0000000000000000e1100001000000000000000000000008e110000200000000000000035310000b0000008c52100055000000e15210002200000000000000818810000800000000000000f4e11000010000000000000000000000fce110000100000000000000000000000e531000080000000000000014ef100001000000000000000000000004e210000100000000000000000000001653100007000000000000000ce2100003000000000000000000000024e210000100000000000000000000001d531000050000000000000014ef10000100000000000000000000002ce2100001000000000000000000000022531000080000000000000014ef100001000000000000000000000034e2100001000000000000003c8a10000d000000f35310000e000000b95310003a0000003c8a10000d0000006f7c100007000000d789100009000000995310002000000076531000230000002a5310004c0000008795100028000000945410002f0000003b000000010000008795100028000000c3541000300000003800000001000000f35410003300000026551000370000008300000005000000000000005d551000070000000000000008e3100001000000000000000000000020e31000020000000000000000000000645510000a0000000000000070f4100001000000000000000000000030e310000100000000000000000000006e5510001100000000000000b8f4100001000000000000000000000038e31000010000000000000000000000515610000300000000000000545610000d000000f0551000580000004856100009000000955510005b0000007f5510001600000000000000926d10000a0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100054ec1000000000000000000060e6100001000000000000000100000000000000685610000d0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100068e61000000000000000000078e6100001000000000000000100000000000000755610000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088e61000000000000000000080e6100001000000000000000100000000000000815610000c00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088e61000000000000000000098e610000100000000000000010000000000000096561000110000000000000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000a0e6100002000000000000000000000000000000a7561000100000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000b0e6100001000000000000000000000000000000b75610000a0000000100000000000000818210000c00000000000000545610000d00000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000b8e6100001000000000000000000000000000000c1561000110000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000d0e61000010000000000000000000000625810001f00000026000000000000000100000034000000435810001f000000255810001e00000026000000000000000100000033000000fd571000280000003f5710005e0000009d571000600000000f57100030000000eb5610002400000026000000000000000100000030000000d25610001900000000000000815810000d00000000000000b4e71000020000000000000000000000e4e710000300000000000000000000008e5810000700000000000000fce7100001000000000000000000000014e810000100000000000000000000009558100009000000000000001ce810000400000000000000000000007ce810000100000000000000000000009e5810000f0000000000000084e810000100000000000000000000009ce81000010000000000000000000000ad581000100000000000000084e81000010000000000000000000000a4e81000020000000000000000000000b88010000500000000000000b77e10001500000000000000c85a10000b0000000000000095801000230000001b5a10004b000000665a10004d000000b35a10001500000000000000145a10000700000000000000b77e100015000000e75910002d00000000000000a55910000d00000000000000b25910001000000000000000c25910001500000000000000b77e10001500000000000000d75910000c000000000000003a6510001700000000000000e35910000400000000000000b259100010000000895910001c000000000000007e5910000b000000000000005a8b1000160000003f5910003f000000bd58100057000000145910002b00000000000000db5a10000c0000000000000000000000e75a10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec10000000000000000000d4eb100002000000000000000100000000000000ee5a1000130000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910000cec10000000000000000000e4eb100001000000000000000100000000000000015b10000b0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000eceb10000000000000000000fceb1000010000000000000001000000000000000c5b1000040000000000000000000000e75a10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec1000000000000000000004ec100001000000000000000100000000000000105b1000030000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910000cec100000000000000000001cec1000010000000000000001000000000000002a8c10000d00000000000000000000003c8a10000d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec1000000000000000000034ec100001000000000000000100000000000000b58b10000900000001000000000000003c8a10000d00000000000000135b10002400000000000000000000000000000000000000000000000000000000000000f89910003cec100000000000000000004cec100001000000000000000000000000000000375b1000090000000000000000000000405b10001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100054ec1000000000000000000064ec1000010000000000000001000000c35c100054000000175d100037000000715c100052000000260000000000000001000000400000004f5c1000220000000b5c10004400000026000000000000000100000032000000d85b10003300000026000000000000000100000035000000af5b10002900000026000000000000000100000030000000905b10001f00000026000000000000000100000036000000525b10003e000000a05d100039000000e05d100048000000100200002d000000945410002f0000003b00000001000000c354100030000000380000000100000000000000d55e10000f00000000000000d0ec1000020000000000000000000000e0ec10000400000000000000d7891000090000005f5f10000c000000e45e100022000000f899100000000000065f100041000000475f100018000000c05f100019000000e05f100048000000bb0100002d0000008795100028000000286010002f0000004800000001000000286010002f0000004800000001000000b560100036000000e9871000580000008d01000005000000786010003d000000e987100058000000940100000500000000000000f26010000b0000000000000000000000fd6010000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100038ee1000000000000000000048ee1000010000000000000001000000000000000c611000070000000100000000000000fd6010000f00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100050ee1000000000000000000060ee100001000000000000000100000026000000000000000100000035000000296110001f000000260000000000000001000000360000001361100016000000b560100036000000e987100058000000b401000005000000e987100058000000bb010000050000000000000070611000060000000000000014ef10000100000000000000000000001cef1000010000000000000000000000766110000e0000000000000024ef100002000000000000000000000034ef1000020000000000000000000000846110000c0000000000000044ef100002000000000000000000000054ef100001000000000000006f7c1000070000007562100038000000d789100009000000e089100003000000db611000550000003062100045000000d7891000090000006f7c100007000000906110004b00000000000000ed6210000400000000000000f0f1100003000000000000000000000038f21000040000000000000000000000f16210000a0000000000000058f2100001000000000000000000000070f21000060000000000000000000000fb6210000600000000000000a0f21000010000000000000000000000b8f210000a0000000000000000000000016310001100000000000000f899100000000000000000000000000008f3100008000000000000000000000012631000080000000000000048f3100001000000000000000000000060f310000500000000000000000000001a631000080000000000000088f31000010000000000000000000000a0f31000050000000000000000000000226310000500000000000000f8991000000000000000000000000000c8f31000050000000000000000000000276310000900000000000000f0f3100001000000000000000000000008f41000050000000000000000000000306310000e0000000000000030f4100001000000000000000000000048f410000500000000000000000000003e631000140000000000000070f4100001000000000000000000000088f4100001000000000000000000000052631000140000000000000070f4100001000000000000000000000090f4100001000000000000000000000066631000130000000000000098f41000010000000000000000000000b0f41000010000000000000000000000796310000d00000000000000b8f41000010000000000000000000000d0f4100002000000000000000000000086631000170000000000000098f41000010000000000000000000000e0f410000100000000000000000000009d6310001100000000000000e8f4100001000000000000000000000000f510000100000000000000000000000b6610000a00000000000000958010002300000000000000b88010000500000000000000b77e100015000000000000006a66100005000000000000006f66100011000000986a100060000000f86a10001a000000f899100000000000126b100049000000000000008a6a10000e00000000000000b77e100015000000d06910005d0000002d6a100009000000f899100000000000366a100054000000f899100000000000b66510005500000000000000b88010000500000000000000b77e10001500000046681000550000009b68100040000000db6810004d000000f89910000000000028691000520000007a69100030000000f8991000000000001566100055000000f899100000000000aa69100026000000806710004b000000f899100000000000cb6710004d0000001868100013000000f8991000000000001566100055000000f8991000000000002b6810001b000000000000005f6710000500000000000000646710001c000000256710003a000000f8991000000000007f65100037000000f899100000000000156610005500000000000000f66610000700000000000000fd66100028000000b266100044000000f8991000000000007f65100037000000f89910000000000015661000550000008066100032000000f8991000000000007f65100037000000f8991000000000001566100055000000000000006a66100005000000000000006f66100011000000516510002e000000f8991000000000007f65100037000000f8991000000000001566100055000000000000000b6610000a000000000000009580100023000000516510002e000000f8991000000000007f65100037000000f899100000000000b66510005500000000000000e564100003000000000000003a651000170000001465100026000000e86410002c00000000000000e56410000300000000000000808b10000c000000c56410002000000000000000b86410000d00000000000000ee88100004000000206410004f0000006f64100049000000fc6310002400000000000000e16310000a00000000000000eb63100011000000ae63100033000000806c100048000000f10900000e00000000000000c86c10000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e0ff1000000000000000000078fe100001000000000000000100000000000000d66c1000150000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100080fe1000000000000000000090fe100001000000000000000100000000000000eb6c10000e0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d8fe1000000000000000000098fe100001000000000000000100000000000000076d10000d0000000000000000000000146d10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0fe10000000000000000000b0fe100001000000000000000100000000000000846110000c0000000000000000000000146d10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8fe10000000000000000000c8fe1000010000000000000001000000000000001b6d1000110000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e0ff10000000000000000000d0fe1000010000000000000001000000000000002c6d10000f0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d8fe10000000000000000000e8fe1000010000000000000001000000000000003b6d10000d0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000100011000000000000000000f0fe100002000000000000000100000000000000486d1000060000000100000000000000818210000c00000000000000818210000c00000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000000ff1000010000000000000000000000000000004e6d1000060000000100000000000000818210000c00000000000000546d10003900000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000008ff1000010000000000000000000000000000008d6d1000050000000100000000000000818210000c000000000000006f6610001100000000000000000000000000000000000000000000000000000000000000f899100010ff1000000000000000000020ff100001000000000000000100000000000000926d10000a0000000101000000000000818210000c00000000000000646710001c00000000000000000000000000000000000000000000000000000000000000f899100028ff1000000000000000000038ff1000010000000000000001000000000000009c6d10000a0000000101000000000000818210000c00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000040ff100001000000000000000100000000000000a66d1000070000000100000000000000818210000c00000000000000ad6d10002400000000000000000000000000000000000000000000000000000000000000f899100048ff1000000000000000000058ff100004000000000000000100000000000000d16d10000e0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000078ff100001000000000000000100000000000000df6d10000a0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0ff1000000000000000000080ff100001000000000000000100000000000000e96d1000140000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff10000000000000000000b0fe100001000000000000000100000000000000fd6d1000100000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff1000000000000000000088ff1000020000000000000001000000000000000d6e1000120000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000098ff1000010000000000000000000000000000001f6e1000130000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0ff10000000000000000000b0ff100001000000000000000100000000000000326e1000090000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff10000000000000000000c8ff1000030000000000000001000000000000003b6e10000a0000000100000000000000818210000c00000000000000e08910000300000000000000000000000000000000000000000000000000000000000000f8991000e0ff10000000000000000000f0ff100001000000000000000100000000000000456e10000d0000000000000000000000526e10000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000f8ff100000000000000000000800110001000000000000000000000000000000546e10000f0000000000000000000000636e10002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000020001100010000000000000001000000e97510002a000000260000000000000001000000410000009975100050000000707510002900000026000000000000000100000042000000287510004800000026000000000000000100000043000000d474100054000000867410004e00000026000000000000000100000034000000587410002e0000008473100069000000ed7310006b0000004473100040000000f37210005100000026000000000000000100000030000000ba72100039000000260000000000000001000000440000006972100051000000107210005900000026000000000000000100000045000000507110006c000000bc71100030000000f899100000000000ec71100024000000117110003f000000fa701000170000006d7010005a000000c770100033000000497010002400000026000000000000000100000033000000117010003800000026000000000000000100000032000000956f10004c000000f899100000000000e16f10003000000026000000000000000100000035000000216f10007400000026000000000000000100000030000000076f10001a000000260000000000000001000000360000008b6e10007c0000008795100028000000137610002f0000002c020000010000000078100019000000b077100048000000bb0100002d0000007077100039000000b077100048000000100200002d0000004600000028000000040000004700000048000000000000000000000049000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000806c100048000000eb0900000a000000137610002f0000002c0200000100000000000000207a100006000000000000004a00000000000000000000004b000000000000000000000002000000000000000000000000000000000000004c000000000000000000000000000000267a100004000000000000004d00000000000000020000000000000000000000000000000200000000000000000000000000000002000000000000000000000000000000000000002a7a100009000000000000004e00000000000000000000004f0000000000000000000000000000005000000000000000000000000200000000000000000000000000000000000000337a100009000000000000005100000000000000000000005200000000000000000000000000000053000000000000000000000002000000000000000000000000000000000000003c7a10000700000000000000540000000000000000000000550000000000000000000000000000005600000000000000000000000000000057000000000000000000000000000000437a10000800000000000000580000000000000000000000590000000000000000000000000000005a0000000000000000000000000000005b0000000000000000000000000000004b7a100007000000000000005c00000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000005f000000000000000000000000000000527a10000700000000000000600000000000000000000000610000000000000000000000000000006200000000000000000000000000000063000000000000000000000000000000597a10000900000000000000640000000000000000000000650000000000000000000000000000006600000000000000000000000000000067000000000000000000000000000000627a10000700000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b000000000000000000000000000000697a10000e000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f000000000000000000000000000000777a10000f00000000000000700000000000000000000000710000000000000000000000000000007200000000000000000000000000000073000000000000000000000000000000867a100010000000000000004d0000000000000002000000000000000000000000000000000000007400000000000000000000000200000000000000000000000000000000000000967a100007000000000000007500000000000000000000007600000000000000000000000000000077000000000000000000000000000000780000000000000000000000000000009d7a100008000000000000007900000000000000000000007a0000000000000000000000000000007b0000000000000000000000000000007c000000000000000000000000000000a57a100008000000000000007d00000000000000000000007e0000000000000000000000000000007f00000000000000000000000000000080000000000000000000000000000000ad7a10000400000000000000810000000000000000000000820000000000000000000000000000008300000000000000000000000000000084000000000000000000000000000000b17a100008000000000000005807110003000000000000000000000070071100010000000000000000000000b97a10000c000000000000007807110002000000000000000000000088071100010000000000000000000000c57a10000a000000000000008813110001000000000000000000000090071100010000000000000000000000cf7a10000f0000000000000098071100010000000000000000000000a0071100010000000000000000000000de7a10000a00000000000000a8071100020000000000000000000000b8071100020000000000000000000000e87a10000800000000000000c8071100020000000000000000000000d80711000100000000000000d789100009000000d7891000090000006f7c1000070000001a7c100055000000d789100009000000d789100009000000e37b100037000000b57b10002e000000e089100003000000857b100030000000d789100009000000ee881000040000001a7b10004e000000687b10001d000000d789100009000000137b100007000000f07a10002300000000000000767c10000f0000000000000090081100010000000000000000000000a8081100030000000000000000000000857c10000800000000000000c0081100020000000000000000000000f00811000200000000000000000000008d7c100004000000000000000009110004000000000000000000000060091100070000000000000000000000917c1000060000000000000098091100040000000000000000000000f80911000a0000000000000000000000bc8110000800000000000000c4811000100000004c8110002d000000f899100000000000798110004300000000000000cc7e10000900000000000000d57e10000f00000000000000488110000400000000000000137b100007000000bd80100056000000138110003500000000000000918010000400000000000000958010002300000000000000b88010000500000000000000b77e10001500000000000000cc7e10000900000000000000d57e10000f00000000000000f87e10000400000000000000137b100007000000fc7e100042000000f8991000000000003e7f10004a000000887f10002c000000b47f100046000000fa7f1000520000004c8010004500000000000000ae7e10000900000000000000b77e10001500000000000000cc7e10000900000000000000d57e10000f00000000000000e47e10000900000000000000ed7e10000b00000000000000f87e10000400000000000000137b100007000000977c10006a000000f899100000000000017d100021000000f899100000000000227d100050000000727d100041000000b37d10005b0000000e7e100057000000657e10002a0000008f7e10001f00000000000000d48110000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000ec10110001000000000000000100000000000000eb8110000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000f410110001000000000000000100000000000000f6811000120000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000fc1011000100000000000000010000000000000008821000120000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100004111100000000000000000014111100010000000000000001000000000000001a8210000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910001c11110000000000000000002c11110001000000000000000100000000000000258210000b0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910003411110000000000000000004411110001000000000000000100000000000000368210000d0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910004c11110000000000000000005c1111000100000000000000010000000000000043821000080000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100064111100000000000000000074111100010000000000000001000000000000004b821000080000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910007c11110000000000000000008c11110001000000000000000100000000000000538210000d0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000941111000000000000000000a41111000100000000000000010000000000000060821000080000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e41111000000000000000000ac11110001000000000000000100000000000000688210000f0000000000000000000000c48110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b41111000000000000000000c411110001000000000000000100000000000000778210000a0000000100000000000000818210000c00000000000000ed7e10000b00000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000cc111100010000000000000000000000000000008d8210000c0000000100000000000000ed7e10000b00000000000000137b10000700000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000d411110001000000000000000000000000000000998210000b0000000100000000000000ed7e10000b00000000000000a48210001600000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000dc11110001000000000000000000000000000000ba8210000e0000000000000000000000c88210000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e41111000000000000000000f411110001000000000000000100000000000000cb8210000d0000000100000000000000818210000c00000000000000d88210000b00000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000cc111100010000000000000000000000d985100025000000b2851000270000007b8510003700000026000000000000000100000032000000388510004300000026000000000000000100000085000000088510003000000026000000000000000100000086000000d68410003200000026000000000000000100000087000000a88410002e0000002600000000000000010000003a0000008a8410001e000000260000000000000001000000880000005884100032000000260000000000000001000000890000001c8410003c000000fc831000200000002600000000000000010000008a000000d783100025000000ad8310002a0000005483100059000000f78210005d00000026000000000000000100000033000000e382100014000000260000000000000001000000300000006c86100028000000948610002f00000000010000040000008795100028000000d786100030000000e800000001000000d786100030000000e80000000100000000000000818810000800000000000000281311000400000000000000000000004813110001000000000000000000000089881000050000000000000050131100050000000000000000000000781311000200000000000000000000008e88100008000000000000008813110001000000000000000000000090131100010000000000000000000000968810000b000000000000008813110001000000000000000000000098131100010000000000000000000000a18810000800000000000000a0131100020000000000000000000000b01311000100000000000000d7891000090000003c8a10000d000000ea88100004000000e089100003000000e389100059000000d789100009000000ea88100004000000ee88100004000000e089100003000000e08910000300000058891000420000009a8910003d000000ea881000040000002789100031000000f288100035000000ea88100004000000ee88100004000000a988100041000000508a100019000000708a100048000000bb0100002d0000008795100028000000088b1000330000004200000001000000000000003b8b1000070000000000000040141100020000000000000000000000f8991000000000000000000000000000428b1000040000000000000070141100030000000000000000000000f8991000000000000000000000000000778b10000900000000000000808b10000c00000000000000468b100008000000000000008c8b10001b00000000000000468b100008000000000000004e8b10000700000000000000558b100005000000000000005a8b10001600000000000000708b10000700000000000000ee8810000400000000000000b58b1000090000000000000000000000be8b10000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910004816110000000000000000005816110001000000000000000100000000000000ca8b10000a00000001000000000000004e8b10000700000000000000d48b10001600000000000000000000000000000000000000000000000000000000000000f89910006816110000000000000000006016110001000000000000000000000000000000ea8b10000600000001000000000000004e8b10000700000000000000f08b10003a00000000000000000000000000000000000000000000000000000000000000f899100068161100000000000000000078161100010000000000000000000000000000002a8c10000d0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910008016110000000000000000009016110001000000000000000100000026000000000000000100000036000000c58c100026000000928c10003300000026000000000000000100000030000000498c10004900000026000000000000000100000035000000378c100012000000c08a100048000000f10900000e000000508a100019000000f08c100034000000df000000180000008a8e100023000000608e10002a000000088b1000330000004200000001000000909010006200000023010000170000006b90100025000000be91100012000000d09110000f000000919110000a0000009b91100014000000af9110000f000000f0911000550000008800000016000000589210001c00000045921000130000007704000009000000749210001e00000045921000130000006e030000090000004793100012000000599310000c0000004094100069000000c8000000110000001095100048000000eb0900000a0000007c9510000b0000008795100028000000af9510003d00000087000000090000008795100028000000af9510003d000000900000000900000000000000b09610001000000000000000f899100000000000000000000000000020181100010000000000000000000000c09610000f00000000000000f8991000000000000000000000000000281811000100000000000000e496100025000000cf9610001500000020971000190000004097100035000000140100002a0000008097100019000000a09710003d0000005500000022000000ff9710002d0000002c9810000c00000038981000030000003b981000110000004c98100017000000ea02000005000000b09810004600000063010000130000008b00000004000000040000008c0000008d0000008e000000f899100000000000a9a71000020000009698100015000000e503000005000000f899100020000000189a1000120000002600000000000000010000008f0000000a9b100006000000109b100022000000f29a1000180000006d09000005000000329b100016000000489b10000d000000f29a1000180000007309000005000000739b10000b0000007aa7100016000000559b1000010000005d9b100016000000da0700000900000058a710000e00000066a71000040000006aa7100010000000559b1000010000005d9b100016000000de0700000500000018a710002b00000043a71000150000005901000015000000739b10000b0000007e9b100026000000a49b100008000000ac9b100006000000559b1000010000005d9b100016000000eb07000005000000f899100000000000d69b100002000000c09b1000160000005404000011000000c09b1000160000004804000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f2010a110004a00000060a310000002000060a510003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b0200010202020203020202020402050602020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202070202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202f0a01000200000002700000019000000f0a01000200000002800000020000000f0a01000200000002a00000019000000f0a01000200000002b00000018000000f0a01000200000002c00000020000000f89910000000000043a71000150000000a0400000500000000f2b202046e616d6501e9b202d603000e6578745f626c616b65325f323536010c6578745f74776f785f31323802146578745f6765745f73746f726167655f696e746f030f6578745f7365745f73746f7261676504166578745f73616e64626f785f6d656d6f72795f6e6577051b6578745f73616e64626f785f6d656d6f72795f74656172646f776e06176578745f73616e64626f785f696e7374616e746961746507126578745f73616e64626f785f696e766f6b65081d6578745f73616e64626f785f696e7374616e63655f74656172646f776e09116578745f636c6561725f73746f726167650a0e6578745f7072696e745f757466380b126578745f737232353531395f7665726966790c126578745f656432353531395f7665726966790d106578745f73746f726167655f726f6f740e186578745f73746f726167655f6368616e6765735f726f6f740f166578745f6b696c6c5f6368696c645f73746f7261676510166578745f73616e64626f785f6d656d6f72795f67657411166578745f73616e64626f785f6d656d6f72795f736574120d6578745f7072696e745f686578131f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765141a6578745f6765745f6368696c645f73746f726167655f696e746f15176578745f636c6561725f6368696c645f73746f7261676516156578745f7365745f6368696c645f73746f7261676517236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74180d6578745f7072696e745f6e756d190a6578745f6d616c6c6f631a086578745f667265651b683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68303231373834323236636231343233301c6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343166626563396365303634353835631d0e5f5f727573745f6465616c6c6f631e0e5f5f727573745f7265616c6c6f631f0c5f5f727573745f616c6c6f632008727573745f6f6f6d2134616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a6833616366383265303938633739353262227d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6861633164616637393865303539383533236f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6830643239336438356235303038613237246f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831626464663939613338333164383761256c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6865623862313862343464343532613865266f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683334343231663138386263626664353927443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306232653038356334663161353834382825616c6c6f633a3a666d743a3a666f726d61743a3a686438386563373064393335303566663229793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68376330653864363138356161333232352a36636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68313561663464353835383639653332612b34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68613764306666373035313035366330352c29636f72653a3a70616e69636b696e673a3a70616e69633a3a68303466613939633333333766636237312d6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343635313466306166363631316662342e48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303034633365323561373234353331352f4c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a686536383336653639623663653239663930783c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a6831333638393631653833383439653730314b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a683634316366316432373163336162653932613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683261656666643363326438316430613633453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a6839656665633039353866393832396633343073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6866613034653962353765383630643161353873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6832613330343133343863346537653133365a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a683762343235343761613964653264316237763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a683735663961393663666637386464613538693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a683139323030383132333337376235383439693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a68316132666430623935303138333234663a2e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68376364373965633566376334346134373b613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68306664666266303865383932306134393c34636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68313539393136656134343138633031342e3131363d8c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a68363665386361666564623633633262353e4e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a68663033353032333132633234666362383f2e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68323061643266343235653637636431374030636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6831326261623832623132626539306631414573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6834336462313937663038333961303033424173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6866356665373862633062626466666533436f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683561613030656163346162616231326244467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a68636638373932656364313466663432614530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68353265653430393034646230386438644648616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6864343535313934306562383633336666473c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a683162363330653433323531623464623248537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a683663373630643862353731303265323549a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a68633735613661336666633237616362644a3a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a68663136663266393332383066626139384b36636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68336234346536633365626435366533364c2d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a68353166653837313062383433326430624d613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68613935353838376436386665376461364e507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a68643736613865343261376432383739664f3c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6862376530623961323733643230613231506b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a686231653864393062663939376531303551783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683761613761336466393062613931363452713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683935383464346538303965303133353653713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68353866396237383561353130386435305482017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a73657269616c697a653a3a683332346565373038633731373864316455457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6833626138623634666430346661633238567c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68343036393565396138663232386130635727636f72653a3a7374723a3a66726f6d5f757466383a3a68633135336561323266613035343736375886017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6863376138363163383064363831386166597a3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173682c4469676573744974656d3e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68313665353862613466623335646662655a5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68666264316237663330356533613936645b4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68343632373061313937333434386363315c3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68336330333938393036636238646566325d3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68376333623861346263396639633061385e4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68613966616165303836353533646562375fb20173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a6465636f64653a3a6839653136326139626137393730653738603773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838396430666234653566663237653566613773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a683633366365376237336339393065306262633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68653732393132396534313839623734386334636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6838383665336534653433393436623365647b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a68303431656636383133636430303034616587013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a68306235333765396639386333316531336687013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a68386239323665333438353962616663316780013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a68363531613536633566336263323062656882013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a68373231306535373336373666333462626982013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a68333461666537333031656533653432646a82013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68633336343732643432366266663236306b83013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68653466323934633563386438356161636c85013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68323666613333323832626438353463376d84013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68623430636566343933313837363236376e83013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a68353561306463633631663665636634396f8d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68383039646565346235396330356435627087013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d5f736565643a3a6839623662636134626164306130353232717f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a68666465636466313134383634313237357289013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a68316636626437656533393566663734627386013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a68386166633762633336346332386338327486013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a68393166656638336438323739656632337588013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a68636136323365373962623234313634617688013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a68313734643139616263626231313638327789013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6832363638633038663464383266373736783273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a686162626266653666646163613461323579135f5f727573745f616c6c6f635f7a65726f65647aa7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a68326231646366636438333337383566667b4473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a68373130613438356236313539636432647c673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a68393361373337353638393938323431347d4473726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a53746f726167655665633a3a6974656d3a3a68666266656138653439303335316265317e463c753332206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68643561393863633337613062326532647f89013c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d5265663c486173682c417574686f7269747949642c5365616c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683732336430396466653838306534633480013973726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a617574686f7269746965733a3a686437393937646361363537383134376581014a3c5b75383b205f5d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a686633633264303833646330316337633182014773726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a736176655f6f726967696e616c5f617574686f7269746965733a3a683662666333326432303636646339363583013c73726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683633646631336262346437626236336184014173726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683838343738633162613537353130633085014673726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683838326263393930373164623062353086016f73726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a68333164363761356437353962353161348701c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a683164373634353263656363363934356488013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6866663338313237373762643066323064890188013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a68333735646534383532333766376232628a01593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68613866303639373235366535363937318b013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e743a3a68636332626339313464623430666431378c0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68313539393136656134343138633031348d017f3c284b2c204c2c204d2c204e2c204f2c20502c20512c20522c20532c20542c20552c20562c20572c20582c20592c205a292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68303466663435363631663366383463308e013673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a68396463396663613336303062646134318f016d3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a74616b653a3a68336536616238666365633866393235369001523c28522c2053292061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e4368616e67653c543e3e3a3a6f6e5f73657373696f6e5f6368616e67653a3a686131616330333134663639646162373091014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686164373363336365323935306364363592013873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a683566663633383833336639343132393593013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683263656466626165303136363661393894018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a683230366630363932626238346662326195013f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a683930343563623531383131356661313596013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a683862366662626237663932306366333297014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683135353039356233333230333163636698018d013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68343835393438383366616236353630309901a1013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a68343138643834393936656535303633669a0186013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68633933656433646439396134353430379b013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a68356265663336396463353466306133669c013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a68623066623437646262373231636332399d018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a68353461333561356664313262643235329e013673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a68653031343464316136323365633131659f0189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a6830346632363231383863383237353236a0012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865643061656435396465626437313838a1014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866353636343864376339386635383033a2013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6834336639393636326434353337373130a3014e3c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861663436646433656138356365363139a4014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863653735316562366533663239323631a5013e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6836623032613031353963656539613138a6016c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6862316432613532333136346434336164a7014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838373237353637663736333033636134a8013b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6838323732396466633733613435643063a9016b3c73726d6c5f6772616e6470613a3a53746f72656450656e64696e674368616e67653c4e2c53657373696f6e4b65793e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834663635663364373639613465383366aa014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839616631653337643566303862316634ab016c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6830353831353836343639386363363734ac01573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6837383966356162393763386234613963ad01e7013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6863313336373666383234633738373334ae013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835346364643137396564626564323365af013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a6834386266306666663437333035316264b0013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6834326566316661666138613832373631b101633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836363439326635333737353530636462b201513c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864373136393462343732353831383831b30130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6839613361306339386638353664626363b401b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831356261356166383161373335613138b5015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832346330393739633831373936643133b601723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836326664616462353332613835353266b7014e3c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831623962313965633766326633353366b8014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837396332633734366561646237383137b901493c73726d6c5f636f6e73656e7375733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6839373239663931646263376539306139ba01e8013c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c206938292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6835376531336239633135623562393336bb013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832306333653233323663643161633565bc014173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832636437353937306633303164316433bd014673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834636635643537373666666465613862be016e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865613334613735353963613363666663bf01703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863646265633837323130656666633239c001ad013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6865623862633439343032323738613139c101493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834323462376132666531646334356265c201443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830336232373937353034346238613035c301483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837393335336438356435613831343934c401463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6838386438336430353632353666383436c501443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830336232373937353034346238613035c6014e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836353136333639666366306136323962c701473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831636664653264616566373562386434c801473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862643436313637613065336263623164c9015e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864656662623833316264383363643762ca01b50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a6832306562643532626264633964653562cb013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6830636365666637356165336332343339cc018a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6862393465323366323863623831643634cd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6834626330623666346562653536343434ce01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830633366323337373562356337376563cf012d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a6864346165346536313239323765393831d00189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6835633734396639373361633237306239d101aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6833326361623031393465353965616537d2013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a6861393238386362393330313863646361d3014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830653134373961663764326533663264d4014d3c6e6f64655f72756e74696d653a3a4c6f67206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864373331623263363162363730356462d5015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837346265646330383730393939353666d6017b6e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a6465636f64653a3a6839366230653135363863346465303538d70130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864633866646436396335316364636166d8017e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6862333231666338636632643934663734d9013e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6864386635613032633438306135336639da014373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6832383133313961643133326131643632db014373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831613230626263376431346535363066dc01693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835613661306463333538343231643039dd013373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6836643033343838623335616336653038de014473726d6c5f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a6835386366366636336363373638303538df014173726d6c5f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a6832333462313364663733346165653161e0013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6864613531373366386431393136323731e1013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6864303136383935623735383133663563e2013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6861656433336466666630386462373963e3016d3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a74616b653a3a6866616466333439613930363736356464e401483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6830663764333330363531636432613064e501483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6830363132383636663366616332393439e6014273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6835386530643637343466616234393961e7014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6863326163376264323035613435613139e8014773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6863383937653938643438623334393966e9016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837353363396261663137353436393830ea013473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a6833333233666331626135663333623731eb0185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a6836353334306139363730663735666334ec018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6836633136336436393538326663356536ed017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6864393738313639643866343430323533ee018e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6835623861636564623266613033333965ef017e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6863663836373962666133396137366437f00181013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6837303462323831373834633364363066f101483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835666639616632646565363364336333f20191013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6836623863376662303131663863393838f301573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6830623839383963663932366331373130f4015f3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862303835646633613366353764643735f501653c73726d6c5f62616c616e6365733a3a696d62616c616e6365733a3a506f736974697665496d62616c616e63653c542c493e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6864353234613664353030623036653638f601453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864656235633237313961643566643735f7017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6834326439383833333363306334353135f80148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6838313735656261373465333866313235f9012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6866373633616431616364626565376131fa014173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830666533333634346463313339306561fb014573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6830623138666161343364656562356639fc014673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832613536343336363966323861623438fd014b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834373130313239616163356537323136fe01733c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744c6561646572626f6172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838353362663566643962306263633931ff01713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68663732396531666235303232643436648002743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686466633039653830643635656536653781027b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68383030663437356366653633656432358202723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683163646664316239323935333033386583027c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353637643139373161643264623262358402753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683730313432393037373835323966313985023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686562623863343131323964643564313886024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686133313037363339333163316237303987023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686132366561343533326231373163346288022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68633738393462653033333133663234308902303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68386361323931366261396231353938618a0249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68623865633133616138306266343336628b022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68633866633061633330666230666261668c0235636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68343935396261356235646261323136378d02483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68303934323930356435346335326262668e02633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68396538626530373531353164323264638f024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a686464386531646336343934366462383190023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a686437643932326139393163313464663291023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a683738386562613133633036613562356292024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68336664323864366239616262363930339302477375627374726174655f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a68353266326233396365623830383966399402613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683837346631333761373364336161323995024b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a686132336466636237343739383366353696020c436f72655f76657273696f6e970212436f72655f657865637574655f626c6f636b9802af0173725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a5f494d504c5f4445434f44455f464f525f426c6f636b3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c4865616465722c45787472696e7369633e3e3a3a6465636f64653a3a686436323935373633643839386664353299024173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a68636461373638353339316461383237619a026c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a68353734643032343837386337373065639b02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68313537333163316639393731323431379c02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68376636353732323937396536356166399d0215436f72655f696e697469616c697a655f626c6f636b9e0210436f72655f617574686f7269746965739f02ea033c6e6f64655f72756e74696d653a3a52756e74696d65206173207375627374726174655f636c69656e743a3a72756e74696d655f6170693a3a72756e74696d655f6465636c5f666f725f436f72653a3a436f72653c73725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c7536342c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362c6e6f64655f72756e74696d653a3a4c6f673e2c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c3c73726d6c5f696e64696365733a3a4d6f64756c653c6e6f64655f72756e74696d653a3a52756e74696d653e2061732073725f7072696d6974697665733a3a7472616974733a3a5374617469634c6f6f6b75703e3a3a536f757263652c7536342c6e6f64655f72756e74696d653a3a43616c6c2c73725f7072696d6974697665733a3a416e795369676e61747572653e3e3e3e3a3a617574686f7269746965733a3a6838303033626131353731623761323739a002114d657461646174615f6d65746164617461a102603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864336166356331373438303332613533a202433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864616238363466366462306539396431a302623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6831306162633066353230373361633965a402623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865633865626432623763623633306263a502623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838336435336365626363626530303232a6021c426c6f636b4275696c6465725f6170706c795f65787472696e736963a7021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636ba80220426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373a9025d3c7375627374726174655f696e686572656e74733a3a496e686572656e7444617461206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833653539646237303030313332316466aa023873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6831613630653361666261643938633361ab024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861376230653362313263303530353035ac021c426c6f636b4275696c6465725f636865636b5f696e686572656e7473ad0218426c6f636b4275696c6465725f72616e646f6d5f73656564ae022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6eaf02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572b002214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765b102204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765b2021e4772616e6470614170695f6772616e6470615f617574686f726974696573b302513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6863313734616331643238353830663939b40215417572614170695f736c6f745f6475726174696f6eb5021a417574686f7269746965734170695f617574686f726974696573b6023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830653533386166613664313761633336b70283023c6e6f64655f72756e74696d653a3a4c6f6720617320636f72653a3a636f6e766572743a3a46726f6d3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c7072696d69746976655f74797065733a3a483235362c3c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572652061732073725f7072696d6974697665733a3a7472616974733a3a5665726966793e3a3a5369676e65722c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572653e3e3e3a3a66726f6d3a3a6862333431313736326533653061653665b8024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832363463383630333534353863653832b9024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832613762376238656637343363386664ba024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864313737323730336136633061373338bb02723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832363966333130653832663064346434bc02753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6863626661633530356236343334633939bd024273726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861323161396662336337316435623433be024773726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6862393063386633303761656464663561bf024c73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6864383231393832653466346134303262c002703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863376463303831616435396464646439c1023a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832353337653232383835343539323061c2023f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830653737376638343866653139373866c3024473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830363530353361306232376333303235c4023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864643064393364303465313734643439c5024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838313535663930623261633963363964c6024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834623963376263646563663165393465c702593c73726d6c5f7375646f3a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6839653437646665373165613162656638c8025e3c73726d6c5f74696d657374616d703a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834363034653561366430353930626161c902e8023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63652c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3e3a3a6765743a3a6830303636326637346131363731343236ca025e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836363538656434616432373634303632cb023373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a6865623334333063393133303166633532cc02643c73726d6c5f636f756e63696c3a3a766f74696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6836366439636431393835353065386633cd024173726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a6835313734356662366630616566653962ce023b73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a7665746f5f6f663a3a6832316561333231356464373031356236cf023773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6836663434313536373062663335613132d0023c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832353961613361386537303765396536d1024173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836383562336265633833366561306636d202613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835393330643435346362333165653237d302773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6863636264376561326534663962356466d402773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6832326333653736326537356336383664d502723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831323734306235396161613235656661d602723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6861393732356232353734663562303866d702723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6865323262646364623065613431316232d802743c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a6866346232643336386662336565366231d9027b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6838653730306565666337316639643737da023a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839643634616537323931386535646330db023f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6835636539303563336139386136656266dc024473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830386562646632663134373032373839dd023b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835333136383464663961363665303530de024073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832653935373463313734653439323732df024573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836363638383231653130393432616265e0026d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832633632393837626436333163343935e102960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6832336161626137383062313937653134e2025d3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834326236623361343737323639666135e302303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834623666613939336565363363333435e4023a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6838383062346539346238633538313662e5023f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830363938636334313162306530613662e6024473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830313437356234333262623433333762e702483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6866663562663463616536646239633137e8026c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6837376464383231383636636139323834e9022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a6830643035343133373931333139353039ea02d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6831313030396136663362653765663734eb026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6831303733643437343662396136613334ec023d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a6831356633316530323266343132643538ed028001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a6864363134356462303933373037396266ee022e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a6839393563623332643064353935353865ef022c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6863336264343661346238313564373035f0025c3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864363138303439303437646438323464f1025d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839303362396232333538393463643063f2025e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832336636623133323165356663393331f302643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834323164616166636164636135393865f402303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830316335396636666535376435303564f502673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6864633463396435346466383730353064f602ac013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6830626566656239656361663863643061f7023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6838623164626130663761633733653063f8023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863313466613337646132353265303765f9023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6865373263643766376565633464343365fa023a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835336635396533616532376536623536fb023f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6862633165336464316437663565623238fc02aa0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63652c426c6f636b4e756d6265723e3e3a3a6465636f64653a3a6832653232303132393866323262383863fd024473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6832326536316437643165343431313334fe02683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832323634643935663335636331623838ff026b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68623065633463626465633865613335378003703c73726d6c5f7374616b696e673a3a5f5f47657442797465537472756374426f6e64696e674475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686135633133313731356638663931336181036d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683832616331383330343165656466346682036e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68356131633238636236353933306366658303763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683864316162376237316365656233353784036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6835626665666563306565666632633730850344636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a68306165633039666136363334363663358603f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683062623538633466653033666237646587033773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a683533336165323238333764666566656688033973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6866356633316661666236356633363839890330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303331323363633864323730346161328a033e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a68656361343962303764646631303162368b035c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68343431303237666233323462376233648c03406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a68303034656238323765376535633331388d0339636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a68313831306333396638633363316362388e03416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a68646434353231356261336437333331648f03426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a68383132346438613237333363343633339003416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a68623234323431623939343635633230349103416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a68663434386234353230356662653139669203436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a68653364373438366635643062633932339303416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a68653232336263353131656564313935649403486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f766f74696e673a3a68616637633738346333663565613136339503496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a68326534383838333862373038623535669603416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a68333363393933373338613533626635659703426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a683562366662326164316231306531663098034073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683133613230376434353463653230303399034573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68383261363361343365313331313534619a033b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68633936386638646363373839313731639b03426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a68656635393366366432303632363832369c033e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a68643138323233373363623662373839669d03703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68616261623533313033653636373330649e03713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68633832613637366666633739363233339f036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866653066343930666435643039386530a0036a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832663066376632333230656537306337a1036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866623833306561336332326362353030a2036d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861346461363331313962656539653065a3036d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866643638386264363535663063303931a403880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a6861386637326234656235633362346361a503483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6837303265386236346165376565646437a603653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834636533653761393762323533356333a7033473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a6836346661656632313835303461376265a8034373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834393966366164646133376161663961a9034873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6863383630376262353834613638313031aa034d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831356132323636666362323737333062ab0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830313434373961346534633736343566ac03703c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a5f5f47657442797465537472756374566f74696e673c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835666163306434653535366566633636ad0341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6839613261366631323833636163366166ae03457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6865343938373330343461306462363538af03323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6864393661393531333532353061346236b0033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6862663661323466373461373662366561b1034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6866373334643231306263306535306163b203613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6836383666323163626362616662656331b303593c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837316132663536333639646337303835b403533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6839653530393739346266613037323438b50346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6836616266373966373361373332656265b6034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6865333834663963313732323632366261b703463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6832366632653835396333323134373735b803423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838313365363465636263346263653333b903623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865643465656533366136346462353631ba039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6837326333323035316235613561393937bb0311727573745f626567696e5f756e77696e64bc034473725f696f3a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6833616463386163666233393635663765bd030a5f5f72675f616c6c6f63be030c5f5f72675f6465616c6c6f63bf030c5f5f72675f7265616c6c6f63c003115f5f72675f616c6c6f635f7a65726f6564c10323636f72653a3a666d743a3a77726974653a3a6835373533323730386538656535653662c2032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6861653035386131346261313135353835c3033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832633763376435666536393831336636c40330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6836643765616566373035313736376237c5033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6862666130393430636234636131663636c6033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6863633966666234663633333765363136c7033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6863383432656231363666313035636634c803313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6834626338663232373330353834653263c90343636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6835653566363261653930643737373762ca034a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832336564313662613434663138646432cb03323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836333734393939616461643536393839cc0334636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a6838343038363330336236363939643335cd03066d656d736574ce03066d656d637079cf03076d656d6d6f7665d003066d656d636d70d103095f5f75646976746933d203085f5f6d756c746933d3033f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f693132385f73686c3a3a6863643939383262636633653062306538d4033f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f753132385f7368723a3a6837653838373665633035356166623362d5030c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33352e302d6e696768746c79202865333432386462376320323031392d30332d333129", - "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", - "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", - "0x486c67c9e8930b1573c6958381ae437a": "0x2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678", - "0xdade128e67a5ed110063f56a01ab6bbf": "0x0000000000000000", - "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x1060779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e1772b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c", - "0x3a6772616e6470613a617574683a00000000": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed0100000000000000", - "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", - "0x34de7fc8c73e4252b9e09a9e3bf602f8": "0x6400000000000000", - "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", - "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", - "0x3a6772616e6470613a617574683a01000000": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f0187328434950100000000000000" - } - } -} diff --git a/node/cli/res/flaming-fir.json b/node/cli/res/flaming-fir.json new file mode 100644 index 0000000000000000000000000000000000000000..018593b150c59fdff38336052fe70257892ecd33 --- /dev/null +++ b/node/cli/res/flaming-fir.json @@ -0,0 +1,142 @@ +{ + "name": "Flaming Fir", + "id": "flaming-fir", + "properties": { + "tokenDecimals": 15, + "tokenSymbol": "FIR" + }, + "bootNodes": [ + "/ip4/35.246.224.91/tcp/30333/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", + "/ip4/35.246.224.91/tcp/30334/ws/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", + "/ip4/35.246.210.11/tcp/30333/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", + "/ip4/35.246.210.11/tcp/30334/ws/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", + "/ip4/35.198.110.45/tcp/30333/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", + "/ip4/35.198.110.45/tcp/30334/ws/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", + "/ip4/35.198.114.154/tcp/30333/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6", + "/ip4/35.198.114.154/tcp/30334/ws/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6" + ], + "telemetryEndpoints": [ + ["wss://telemetry.polkadot.io/submit/", 0] + ], + "protocolId": "fir", + "consensusEngine": null, + "genesis": { + "raw": { + "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x579ab55d37b1220812be3c3df29d4858": "0x0000000000000000", + "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", + "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", + "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", + "0x3a6772616e6470613a617574683a01000000": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f0100000000000000", + "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", + "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300", + "0x3a6772616e6470613a617574683a02000000": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4400100000000000000", + "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300", + "0x717a2ee9c64ad3424e10e4461ec08296": "0x0000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000100000000000000000001001000000000", + "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", + "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", + "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", + "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", + "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", + "0x3229a363ad5159bc2c48c9558128f00d2646f3a058cadf32077e9c9d9cca483f": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f", + "0x637414312dac3b280120bf15b4f66cee": "0x00000000", + "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", + "0x3a636f6465": "0x0061736d0100000001b6022a60037f7f7f017f60037f7f7f0060047f7f7f7f0060057f7f7f7f7f0060027f7f017f60027f7f0060017f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60047f7f7e7f017f60017e0060017f017f60000060037f7e7f0060087f7f7f7f7f7f7f7f0060047f7f7f7f017e60017f017e60047f7f7e7e0060027e7e0060057f7f7f7e7e0060037f7e7e0060077f7e7e7e7e7e7e0060027f7e0060027e7f0060057f7e7f7f7e0060037f7f7e0060047f7e7e7e0060087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060037e7f7f0060037e7f7f017f60057f7f7e7e7f0060067f7f7e7e7e7f0060027f7f017e60037f7e7f017f60087f7f7f7f7f7e7e7f0060057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f0002ef051c03656e760e6578745f626c616b65325f323536000103656e76146578745f6765745f73746f726167655f696e746f000703656e760c6578745f74776f785f313238000103656e760f6578745f7365745f73746f72616765000203656e76166578745f73616e64626f785f6d656d6f72795f6e6577000403656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000603656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000603656e76116578745f636c6561725f73746f72616765000503656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76156578745f7365745f6368696c645f73746f72616765000a03656e76176578745f636c6561725f6368696c645f73746f72616765000203656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e760e6578745f7072696e745f75746638000503656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76196578745f6765745f616c6c6f63617465645f73746f72616765000003656e76106578745f73746f726167655f726f6f74000603656e76186578745f73746f726167655f6368616e6765735f726f6f74000c03656e76166578745f6b696c6c5f6368696c645f73746f72616765000503656e760d6578745f7072696e745f686578000503656e76166578745f6368696c645f73746f726167655f726f6f74000003656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000203656e760d6578745f7072696e745f6e756d000d03656e760a6578745f6d616c6c6f63000e03656e76086578745f66726565000603f203f0030404010106000e050f0301100505040505050506010f050506060605050506050506050501040601020f0f04050103010106050505050105060105050505050500110202020202020202020202020202020202020202020202120e05010f0606060606060606060606060606060606050505050505050606060505050505050505060602051304010101010101010505141516171405051406011705050505050505050505050f01050301050401051418050606010f03010401050f0606061405190d06011a050505171b05050d050e031c061905050505051d050514150606040005050e0505050e051e041f20050601040406060f06050505060102042108020404051d060501060606050514220505060606050505230004050502052424050501242424050105050524242405052402242424242424052424050505050505060506060505050505050505020105050606060625050606060505050606060606061c05050505060606050406060605050505050505050d0626060504050204040105050504050e010501060606050505050606050606050505050505051405060101030203010101010102040404010201000404040001040101050501010404040404060405010506050e06000e0f04000404130b0204040e0404020600060404060004040000000027272828290407017001b101b10105030100120619037f01418080c0000b7f0041cd82c5000b7f0041cd82c5000b07be0415066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00ba0212436f72655f657865637574655f626c6f636b00bb0215436f72655f696e697469616c697a655f626c6f636b00bf0210436f72655f617574686f72697469657300c002114d657461646174615f6d6574616461746100c1021c426c6f636b4275696c6465725f6170706c795f65787472696e73696300c7021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00c80220426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300c9021c426c6f636b4275696c6465725f636865636b5f696e686572656e747300cc0218426c6f636b4275696c6465725f72616e646f6d5f7365656400ce022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00cf02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200d002214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e676500d102204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500d2021e4772616e6470614170695f6772616e6470615f617574686f72697469657300d30215417572614170695f736c6f745f6475726174696f6e00d5021a417574686f7269746965734170695f617574686f72697469657300d60209c302010041010bb0012a9903478d028e025e5f606162636465666768696a6b6c6d6e6f7071727374758803b50287029e0299029c039d031cfc019d02d203c903ca03cb03d503d003f803ed03f403f503b303e202b102900292027a7bf402f502f3027c7d7e3536347fa502a602a1028001fd02fe02fc028101b003b203af038201ae02af02ad028301df02e002dd028401fa02fb02f9028501d901da01d8018601fb01ef02f002ee028701a903aa03a80388018a038b03890389018503860384038a018c0395028d0394029302e102a702e402b002e802e702e602e502e302f602870393039203910390038f038e03c501c601c901c801c301ca019703d201d301d501d401d001d601ab03b903b803b703b603b503b403bd038103ba03be03ff03dd03d103dc03e203de03df03e003ee03ef03f003f103fc03fb03fd03fe038004810482040aaeec37f0030b0020002802002001101d0bce7601027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a220341aa014b0d00024020030eab010002030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b20012802184186bfc40041032001411c6a28020028020c11000021010cb1010b200128021841fbbec400410b2001411c6a28020028020c11000021010cb0010b200220012802184189bfc40041052001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4190bfc40010cf031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000caf010b2002200128021841a0bfc40041042001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4190bfc40010cf031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000cae010b2002200128021841a4bfc40041022001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4190bfc40010cf031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000cad010b200128021841a6bfc40041042001411c6a28020028020c11000021010cac010b200128021841aabfc40041032001411c6a28020028020c11000021010cab010b2002200128021841adbfc40041022001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450daa01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000caa010b2002200128021841c0bfc40041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca9010b2002200128021841c4bfc40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41ccbfc40010cf03210120022000410c6a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca8010b200128021841dcbfc40041062001411c6a28020028020c11000021010ca7010b2002200128021841e2bfc40041042001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca6010b2002200128021841e6bfc400410c2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c4101210120022002410c6a41b0bfc40010cf0321032002200041016a36020c20032002410c6a41f4bfc40010cf031a20022d0008210020022802042203450da2010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca5010b20012802184184c0c40041042001411c6a28020028020c11000021010ca4010b20012802184188c0c40041062001411c6a28020028020c11000021010ca3010b20022001280218418ec0c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca2010b200220012802184196c0c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca1010b20022001280218419ec0c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450da001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000ca0010b2002200128021841a6c0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9f010b2002200128021841afc0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9e010b2002200128021841b8c0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9d010b2002200128021841bfc0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9c010b2002200128021841c6c0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9b010b2002200128021841cdc0c40041072001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c9a010b2002200128021841d4c0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c99010b2002200128021841ddc0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c98010b2002200128021841e6c0c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c97010b2002200128021841f0c0c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c96010b2002200128021841fac0c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9501200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c95010b200220012802184183c1c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c94010b20022001280218418cc1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c93010b200220012802184196c1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c92010b2002200128021841a0c1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c91010b2002200128021841aac1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d9001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c90010b2002200128021841b4c1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8f010b2002200128021841bcc1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8e010b2002200128021841c4c1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8d010b2002200128021841ccc1c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8c010b2002200128021841d4c1c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8b010b2002200128021841ddc1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c8a010b2002200128021841e7c1c40041092001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c89010b2002200128021841f0c1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c88010b2002200128021841fac1c400410a2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf0321012002200041086a36020c20012002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c87010b200220012802184184c2c400410d2001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41f4bfc40010cf031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c86010b200220012802184191c2c400410a2001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41f4bfc40010cf031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c85010b20022001280218419bc2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41a4c2c40010cf031a20022d0008210120022802042203450d8401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c84010b2002200128021841b4c2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41bcc2c40010cf031a20022d0008210120022802042203450d8301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c83010b2002200128021841ccc2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41b0bfc40010cf031a20022d0008210120022802042203450d8201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c82010b2002200128021841d4c2c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41dcc2c40010cf031a20022d0008210120022802042203450d8101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000c81010b200128021841ecc2c40041062001411c6a28020028020c11000021010c80010b200128021841f2c2c40041052001411c6a28020028020c11000021010c7f0b200128021841f7c2c40041052001411c6a28020028020c11000021010c7e0b200128021841fcc2c40041062001411c6a28020028020c11000021010c7d0b20012802184182c3c40041062001411c6a28020028020c11000021010c7c0b20012802184188c3c40041062001411c6a28020028020c11000021010c7b0b2001280218418ec3c40041062001411c6a28020028020c11000021010c7a0b20012802184194c3c40041062001411c6a28020028020c11000021010c790b2001280218419ac3c40041062001411c6a28020028020c11000021010c780b200128021841a0c3c40041062001411c6a28020028020c11000021010c770b200128021841a6c3c40041062001411c6a28020028020c11000021010c760b200128021841acc3c40041062001411c6a28020028020c11000021010c750b200128021841b2c3c40041052001411c6a28020028020c11000021010c740b200128021841b7c3c40041052001411c6a28020028020c11000021010c730b200128021841bcc3c40041062001411c6a28020028020c11000021010c720b200128021841c2c3c40041062001411c6a28020028020c11000021010c710b200128021841c8c3c40041062001411c6a28020028020c11000021010c700b200128021841cec3c40041062001411c6a28020028020c11000021010c6f0b200128021841d4c3c40041062001411c6a28020028020c11000021010c6e0b200128021841dac3c40041062001411c6a28020028020c11000021010c6d0b200128021841e0c3c40041062001411c6a28020028020c11000021010c6c0b200128021841e6c3c40041062001411c6a28020028020c11000021010c6b0b200128021841ecc3c40041052001411c6a28020028020c11000021010c6a0b200128021841f1c3c40041052001411c6a28020028020c11000021010c690b200128021841f6c3c40041052001411c6a28020028020c11000021010c680b200128021841fbc3c40041052001411c6a28020028020c11000021010c670b20012802184180c4c40041052001411c6a28020028020c11000021010c660b20012802184185c4c40041052001411c6a28020028020c11000021010c650b2001280218418ac4c40041052001411c6a28020028020c11000021010c640b2001280218418fc4c40041052001411c6a28020028020c11000021010c630b20012802184194c4c40041052001411c6a28020028020c11000021010c620b20012802184199c4c40041052001411c6a28020028020c11000021010c610b2001280218419ec4c40041052001411c6a28020028020c11000021010c600b200128021841a3c4c40041052001411c6a28020028020c11000021010c5f0b200128021841a8c4c40041062001411c6a28020028020c11000021010c5e0b200128021841aec4c40041062001411c6a28020028020c11000021010c5d0b200128021841b4c4c40041092001411c6a28020028020c11000021010c5c0b200128021841bdc4c40041062001411c6a28020028020c11000021010c5b0b200128021841c3c4c40041062001411c6a28020028020c11000021010c5a0b200128021841c9c4c40041062001411c6a28020028020c11000021010c590b200128021841cfc4c40041072001411c6a28020028020c11000021010c580b200128021841d6c4c40041072001411c6a28020028020c11000021010c570b200128021841ddc4c40041072001411c6a28020028020c11000021010c560b200128021841e4c4c40041072001411c6a28020028020c11000021010c550b200128021841ebc4c40041062001411c6a28020028020c11000021010c540b200128021841f1c4c40041052001411c6a28020028020c11000021010c530b200128021841f6c4c40041062001411c6a28020028020c11000021010c520b200128021841fcc4c40041062001411c6a28020028020c11000021010c510b20012802184182c5c40041072001411c6a28020028020c11000021010c500b20012802184189c5c40041072001411c6a28020028020c11000021010c4f0b20012802184190c5c40041072001411c6a28020028020c11000021010c4e0b20012802184197c5c40041072001411c6a28020028020c11000021010c4d0b2001280218419ec5c40041062001411c6a28020028020c11000021010c4c0b200128021841a4c5c40041062001411c6a28020028020c11000021010c4b0b200128021841aac5c40041092001411c6a28020028020c11000021010c4a0b200128021841b3c5c40041062001411c6a28020028020c11000021010c490b200128021841b9c5c40041062001411c6a28020028020c11000021010c480b200128021841bfc5c40041062001411c6a28020028020c11000021010c470b200128021841c5c5c40041072001411c6a28020028020c11000021010c460b200128021841ccc5c40041072001411c6a28020028020c11000021010c450b200128021841d3c5c40041072001411c6a28020028020c11000021010c440b200128021841dac5c40041072001411c6a28020028020c11000021010c430b200128021841e1c5c40041062001411c6a28020028020c11000021010c420b200128021841e7c5c40041052001411c6a28020028020c11000021010c410b200128021841ecc5c40041062001411c6a28020028020c11000021010c400b200128021841f2c5c40041062001411c6a28020028020c11000021010c3f0b200128021841f8c5c40041072001411c6a28020028020c11000021010c3e0b200128021841ffc5c40041072001411c6a28020028020c11000021010c3d0b20012802184186c6c40041072001411c6a28020028020c11000021010c3c0b2001280218418dc6c40041072001411c6a28020028020c11000021010c3b0b20012802184194c6c40041062001411c6a28020028020c11000021010c3a0b2001280218419ac6c40041062001411c6a28020028020c11000021010c390b200128021841a0c6c40041072001411c6a28020028020c11000021010c380b200128021841a7c6c40041082001411c6a28020028020c11000021010c370b200128021841afc6c40041082001411c6a28020028020c11000021010c360b200128021841b7c6c400410a2001411c6a28020028020c11000021010c350b200128021841c1c6c40041072001411c6a28020028020c11000021010c340b200128021841c8c6c40041062001411c6a28020028020c11000021010c330b200128021841cec6c40041062001411c6a28020028020c11000021010c320b200128021841d4c6c40041062001411c6a28020028020c11000021010c310b200128021841dac6c40041062001411c6a28020028020c11000021010c300b200128021841e0c6c40041062001411c6a28020028020c11000021010c2f0b200128021841e6c6c40041062001411c6a28020028020c11000021010c2e0b200128021841ecc6c400410b2001411c6a28020028020c11000021010c2d0b200128021841f7c6c40041062001411c6a28020028020c11000021010c2c0b200128021841fdc6c40041062001411c6a28020028020c11000021010c2b0b20012802184183c7c40041072001411c6a28020028020c11000021010c2a0b2001280218418ac7c40041082001411c6a28020028020c11000021010c290b20012802184192c7c40041082001411c6a28020028020c11000021010c280b2001280218419ac7c400410a2001411c6a28020028020c11000021010c270b200128021841a4c7c40041072001411c6a28020028020c11000021010c260b200128021841abc7c40041062001411c6a28020028020c11000021010c250b200128021841b1c7c40041062001411c6a28020028020c11000021010c240b200128021841b7c7c40041062001411c6a28020028020c11000021010c230b200128021841bdc7c40041062001411c6a28020028020c11000021010c220b200128021841c3c7c40041062001411c6a28020028020c11000021010c210b200128021841c9c7c40041062001411c6a28020028020c11000021010c200b200128021841cfc7c400410b2001411c6a28020028020c11000021010c1f0b200128021841dac7c400410a2001411c6a28020028020c11000021010c1e0b200128021841e4c7c400410c2001411c6a28020028020c11000021010c1d0b200128021841f0c7c400410c2001411c6a28020028020c11000021010c1c0b200128021841fcc7c400410c2001411c6a28020028020c11000021010c1b0b20012802184188c8c400410c2001411c6a28020028020c11000021010c1a0b20012802184194c8c400410d2001411c6a28020028020c11000021010c190b200128021841a1c8c400410d2001411c6a28020028020c11000021010c180b200128021841aec8c400410c2001411c6a28020028020c11000021010c170b200128021841bac8c400410c2001411c6a28020028020c11000021010c160b200128021841c6c8c400410c2001411c6a28020028020c11000021010c150b200128021841d2c8c400410c2001411c6a28020028020c11000021010c140b200128021841dec8c400410e2001411c6a28020028020c11000021010c130b200128021841ecc8c400410e2001411c6a28020028020c11000021010c120b200128021841fac8c400410e2001411c6a28020028020c11000021010c110b20012802184188c9c400410e2001411c6a28020028020c11000021010c100b20012802184196c9c400410c2001411c6a28020028020c11000021010c0f0b200128021841a2c9c400410e2001411c6a28020028020c11000021010c0e0b200128021841b0c9c400410e2001411c6a28020028020c11000021010c0d0b200128021841bec9c400410e2001411c6a28020028020c11000021010c0c0b200128021841ccc9c400410e2001411c6a28020028020c11000021010c0b0b200128021841dac9c400410d2001411c6a28020028020c11000021010c0a0b200128021841e7c9c40041112001411c6a28020028020c11000021010c090b200128021841f8c9c40041112001411c6a28020028020c11000021010c080b20012802184189cac40041112001411c6a28020028020c11000021010c070b2001280218419acac40041112001411c6a28020028020c11000021010c060b200021010c050b200021010c040b200021010c030b200021010c020b200021010c010b200021010b200241106a2400200141ff01714100470bc404020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421080240024002400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d0340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d022003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a2002101f2003200c2900003703102003200d29000037001720032d0020220e411a470d052006200a41106a220a470d000c040b0b200422012007470d010c020b200141106a22012007460d010b03400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a22012007470d000b0b02402008450d00200410200b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a28020010200b200141106a2101200a41106a2007470d000b0b2008450d0020041020200341c0006a24000f0b200341c0006a24000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610212205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610212205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810212209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810212206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610212205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810212209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810212209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810212209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610212205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810212209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610212205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910212206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610212205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510212208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610212205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810212209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910212206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610212205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610212205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610212205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610212208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510212208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610212205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610212205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610212205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610212205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610212205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510212208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910212206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610212205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510212208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610212205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610212205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610212205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610212205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610212205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610212205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810212209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610212205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810212209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610212205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610212205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610212205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610212205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610212205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610212205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610212205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610212205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610212205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610212205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610212205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610212205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610212205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810212209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810212209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610212205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610212205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610212205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810212209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810212209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610212205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610212205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610212205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610212205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610212205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610212205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610212205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610212205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810212209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610212205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610212205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610212205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610212205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610212205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610212205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610212205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910212206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610212205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610212205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610212205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610212205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610212205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610212205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610212205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510212208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810212209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610212205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610212205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610212205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610212205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610212205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610212205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610212205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610212205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610212205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610212205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610212205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610212205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610212205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610212205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610212205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610212205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610212205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610212205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610212205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610212205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610212205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610212205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610212205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610212205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610212205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610212205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610212205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610212205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610212205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810212209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810212205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910212206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610212205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610212205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610212205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610212205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610212205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610212205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610212205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610212205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610212205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610212205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610212205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610212205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610212205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610212205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610212205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610212205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610212205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610212205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610212205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810212209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810212209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610212205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610212205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610212205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910212206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610212205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610212205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610212205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810212209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610212205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610212205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610212205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610212205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610212205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610212205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610212205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610212205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510212208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610212205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610212205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810212209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610212205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610212205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810212209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810212209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610212205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110212206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810212209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610212205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810212209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510212208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610212205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510212208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610212205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102222050db4050b200641011023000b2008102222090dad050b200841011023000b2008102222060da9050b200841011023000b2006102222050da5050b200641011023000b2008102222090da1050b200841011023000b2008102222090d9a050b200841011023000b2008102222090d96050b200841011023000b2006102222050d92050b200641011023000b2008102222090d8e050b200841011023000b2006102222050d8a050b200641011023000b2009102222060d86050b200941011023000b2006102222050d82050b200641011023000b2005102222080dfe040b200541011023000b2006102222050dfa040b200641011023000b2008102222090df6040b200841011023000b2009102222060df2040b200941011023000b2006102222050dee040b200641011023000b2006102222050dea040b200641011023000b2006102222050de6040b200641011023000b2006102222080de2040b200641011023000b2005102222080dde040b200541011023000b2006102222050dda040b200641011023000b2006102222050dd6040b200641011023000b2006102222050dd2040b200641011023000b2006102222050dce040b200641011023000b2006102222050dca040b200641011023000b2005102222080dc6040b200541011023000b2009102222060dc2040b200941011023000b2006102222050dbe040b200641011023000b2005102222080dba040b200541011023000b2006102222050db6040b200641011023000b2006102222050db2040b200641011023000b2006102222050dae040b200641011023000b2006102222050daa040b200641011023000b2006102222050da6040b200641011023000b2006102222050da2040b200641011023000b2006102222050dee040b200641011023000b2008102222090d9c040b200841011023000b2006102222050d98040b200641011023000b2008102222090d94040b200841011023000b2006102222050d90040b200641011023000b2006102222050d8c040b200641011023000b2006102222050d88040b200641011023000b2006102222050d84040b200641011023000b2006102222050d80040b200641011023000b2006102222050dfc030b200641011023000b2006102222050df8030b200641011023000b2006102222050df4030b200641011023000b2006102222050df0030b200641011023000b2006102222050dec030b200641011023000b2006102222050de8030b200641011023000b2006102222050de4030b200641011023000b2006102222050de0030b200641011023000b2008102222090ddc030b200841011023000b2008102222090dd8030b200841011023000b2006102222050dd4030b200641011023000b2006102222050dd0030b200641011023000b2006102222050dcc030b200641011023000b2008102222090dc8030b200841011023000b2008102222090dc4030b200841011023000b2006102222050dc0030b200641011023000b2006102222050dbc030b200641011023000b2006102222050db8030b200641011023000b2006102222050db4030b200641011023000b2006102222050db0030b200641011023000b2006102222050dac030b200641011023000b2006102222050da8030b200641011023000b2006102222050da4030b200641011023000b2008102222090da0030b200841011023000b2006102222050d9c030b200641011023000b2006102222050d98030b200641011023000b2006102222050d94030b200641011023000b2006102222050d90030b200641011023000b2006102222050d8c030b200641011023000b2006102222050d88030b200641011023000b2006102222050d84030b200641011023000b2009102222060d80030b200941011023000b2006102222050dfc020b200641011023000b2006102222050df8020b200641011023000b2006102222050df4020b200641011023000b2006102222050df0020b200641011023000b2006102222050dec020b200641011023000b2006102222050de8020b200641011023000b2006102222050de4020b200641011023000b2005102222080de0020b200541011023000b2008102222090ddc020b200841011023000b2006102222050dd8020b200641011023000b2006102222050dd3020b200641011023000b2006102222050dcf020b200641011023000b2006102222050dcb020b200641011023000b2006102222050dc7020b200641011023000b2006102222050dc3020b200641011023000b2006102222050dbf020b200641011023000b2006102222050dbb020b200641011023000b2006102222050db7020b200641011023000b2006102222050db3020b200641011023000b2006102222050daf020b200641011023000b2006102222050dab020b200641011023000b2006102222050da7020b200641011023000b2006102222050da3020b200641011023000b2006102222050d9f020b200641011023000b2006102222050d9b020b200641011023000b2006102222050d97020b200641011023000b2006102222050d93020b200641011023000b2006102222050d8f020b200641011023000b2006102222050d8b020b200641011023000b2006102222050d87020b200641011023000b2006102222050d83020b200641011023000b2006102222050dff010b200641011023000b2006102222050dfb010b200641011023000b2006102222050df7010b200641011023000b2006102222050df3010b200641011023000b2006102222050def010b200641011023000b2006102222050deb010b200641011023000b2006102222050de7010b200641011023000b2008102222090de3010b200841011023000b2008102222050ddf010b200841011023000b2009102222060ddb010b200941011023000b2006102222050dd7010b200641011023000b2006102222050dd3010b200641011023000b2006102222050dcf010b200641011023000b2006102222050dcb010b200641011023000b2006102222050dc7010b200641011023000b2006102222050dc3010b200641011023000b2006102222050dbf010b200641011023000b2006102222050dbb010b200641011023000b2006102222050db7010b200641011023000b2006102222050db3010b200641011023000b2006102222050daf010b200641011023000b2006102222050dab010b200641011023000b2006102222050da7010b200641011023000b2006102222050da3010b200641011023000b2006102222050d9f010b200641011023000b2006102222050d9b010b200641011023000b2006102222050d97010b200641011023000b2006102222050d93010b200641011023000b2006102222050d8f010b200641011023000b2008102222090d8b010b200841011023000b2008102222090d87010b200841011023000b2006102222050d83010b200641011023000b2006102222050d7f0b200641011023000b2006102222050d7b0b200641011023000b2009102222060d770b200941011023000b2006102222050d730b200641011023000b2006102222050d6f0b200641011023000b2006102222050d6b0b200641011023000b2008102222090d670b200841011023000b2006102222050d630b200641011023000b2006102222050d5f0b200641011023000b2006102222050d5b0b200641011023000b2006102222050d570b200641011023000b2006102222050d530b200641011023000b2006102222050d4f0b200641011023000b2006102222050d4b0b200641011023000b2006102222050d470b200641011023000b2005102222080d430b200541011023000b2006102222050d3f0b200641011023000b2006102222050d3b0b200641011023000b2008102222090d370b200841011023000b2006102222050d330b200641011023000b2006102222050d2f0b200641011023000b2008102222090d2b0b200841011023000b2008102222090d270b200841011023000b2006102222050d230b200641011023000b2001102222060d1f0b200141011023000b2008102222090d1b0b200841011023000b2006102222050d170b200641011023000b2008102222090d130b200841011023000b2005102222080d0f0b200541011023000b2006102222050d0b0b200641011023000b2005102222080d070b200541011023000b2006102222050d030b200641011023000b1024000b1024000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011023000b200941011023000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210250240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102122050d020c060b200928020021050c020b200810222205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10200b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1020200341106a24000f0b200841011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102620032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102720032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001020200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011023000b200941011023000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011023000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102122080d020c050b200b28020021080c020b200710222208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610212205450d020c040b200b28020021050c040b2006102222050d020b200641011023000b200741011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102122060d020c070b200728020021060c020b200910222206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1024000b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102122050d020c070b200728020021050c020b200910222205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1024000b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200341106a24000b0700200010e9030b0b0020002001200210ea030b0700200010e8030b0e0041d8d1c400412210e70300000b0a00419cd3c400102f000bc60301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a102122090d020c070b200728020021090c020b200a10222209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a2106200441046a210703402002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d072008410174220a20092009200a491b220a4100480d072008450d0120072802002008200a102122090d020c080b200728020021090c020b200a10222209450d060b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200241046a22022003470d000b0b2000411a3a00000f0b1024000b200a41011023000b200a41011023000bd40301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107200241046a2108034002402005417f470d00200341ff01710d020b0240024002400240200728020020062802002209470d00200941016a22032009490d0620094101742204200320032004491b22044100480d062009450d01200828020020092004102122030d020c070b200828020021030c020b200410222203450d050b2007200436020020082003360200200628020021090b2006200941016a360200200320096a200141807f723a0000200541c000712103200541ff007121042005210120054107752209210520090d002009210520030d000b0b024002400240200241086a2802002002410c6a2802002205470d00200541016a22092005490d0320054101742206200920092006491b22064100480d032005450d01200241046a2802002005200610212209450d020c050b200241046a28020021090c050b2006102222090d030b200641011023000b1024000b200441011023000b200241086a2006360200200241046a20093602002002410c6a28020021050b2002410c6a200541016a360200200920056a20043a00002000411a3a00000bd40301077f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107200241046a2108034002402001427f520d00200441ff01710d020b0240024002400240200728020020062802002204470d00200441016a22052004490d0620044101742209200520052009491b22094100480d062004450d01200828020020042009102122050d020c070b200828020021050c020b200910222205450d050b2007200936020020082005360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a2802002004200610212203450d020c050b200241046a28020021030c050b2006102222030d030b200641011023000b1024000b200941011023000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bd403020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a2001102920022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b102122090d010c050b200b10222209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010200b200741106a2107200641706a22060d000b0b02402008450d00200910200b200241306a24000f0b1024000b200b41081023000bc4bd0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241376a3602282002200241286a360258200241386a200241c8006a102b200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b2002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241376a3602282002200241286a360258200241386a200241c8006a102b200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241086a200241c8006a102b200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241376a3602282002200241286a360258200241386a200241c8006a102b200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a2001102c41042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de802200410222209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241386a3602282002200241286a360258200241186a200241c8006a102b200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b4105210b0c9a020b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b20022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f2005102d000b20052003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f200541016a102d000b200541016a2003102e000b417f200541016a102d000b200541016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b417f200141016a102d000b200141016a2003102e000b1024000b20052001102d000b20012003102e000b417f2009102d000b20092003102e000b417f2001102d000b20012003102e000b417f2001102d000b20012003102e000b417f2009102d000b20092003102e000b417f2009102d000b20092003102e000b20052001102d000b20012003102e000b200441041023000b417f2001102d000b20012003102e000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200310200b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a28020010200b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205102122090d01200541041023000b4100210d02402007450d00200910200b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410136022c2002420137024c200241f8cac4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102b410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d0620091020200241e0006a24000f0b417f2004102d000b20042006102e000b419880c000102f000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000b6b000240024020002d000022004101460d0020004102470d01200128021841edcac400410b2001411c6a28020028020c1100000f0b200128021841e0cac400410d2001411c6a28020028020c1100000f0b200128021841d4cac400410c2001411c6a28020028020c1100000b810301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006102222050d01200641011023000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41ecd3c400200241186a10d3030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10ec03000b41dcd3c4004100410010b501000b1031000bbb07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b41027420081021220c0d010c110b20081022220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241013602142002420137022c200241f8cac40036022820022002410f6a3602102002200241106a360238200241186a200241286a102b410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241013602142002420137022c200241f8cac400360228200220023602102002200241106a360238200241186a200241286a102b20022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f2009102d000b20092007102e000b417f2009102d000b20092005102e000b1024000b200841041023000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c1020200241c0006a24000f0b200241c0006a24000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241b4dac4003602082002200241046a360228200220023602202002200241206a360218200241086a41c4dac4001048000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241d4d9c4003602082002200241046a360228200220023602202002200241206a360218200241086a41e4d9c4001048000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141c8d7c400360210200142013702042001200141186a36020020012003370328200120023703202001200141206a1048000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610212205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610212205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810212209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810212206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610212205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810212209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810212209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810212209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610212205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810212209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610212205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910212206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610212205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510212208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610212205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810212209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910212206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610212205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610212205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610212205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610212208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510212208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610212205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610212205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610212205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610212205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610212205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510212208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910212206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610212205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510212208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610212205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610212205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610212205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610212205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610212205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610212205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810212209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610212205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810212209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610212205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610212205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610212205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610212205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610212205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610212205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610212205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610212205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610212205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610212205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610212205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610212205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610212205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810212209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810212209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610212205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610212205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610212205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810212209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810212209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610212205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610212205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610212205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610212205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610212205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610212205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610212205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610212205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810212209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610212205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610212205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610212205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610212205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610212205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610212205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610212205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910212206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610212205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610212205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610212205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610212205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610212205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610212205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610212205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510212208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810212209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610212205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610212205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610212205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610212205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610212205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610212205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610212205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610212205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610212205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610212205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610212205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610212205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610212205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610212205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610212205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610212205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610212205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610212205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610212205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610212205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610212205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610212205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610212205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610212205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610212205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610212205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610212205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610212205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610212205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810212209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810212205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910212206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610212205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610212205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610212205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610212205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610212205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610212205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610212205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610212205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610212205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610212205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610212205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610212205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610212205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610212205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610212205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610212205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610212205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610212205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610212205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810212209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810212209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610212205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610212205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610212205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910212206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610212205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610212205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610212205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810212209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610212205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610212205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610212205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610212205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610212205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610212205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610212205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610212205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510212208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610212205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610212205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810212209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610212205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610212205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810212209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810212209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610212205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110212206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810212209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610212205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810212209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510212208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610212205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510212208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610212205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102222050db4050b200641011023000b2008102222090dad050b200841011023000b2008102222060da9050b200841011023000b2006102222050da5050b200641011023000b2008102222090da1050b200841011023000b2008102222090d9a050b200841011023000b2008102222090d96050b200841011023000b2006102222050d92050b200641011023000b2008102222090d8e050b200841011023000b2006102222050d8a050b200641011023000b2009102222060d86050b200941011023000b2006102222050d82050b200641011023000b2005102222080dfe040b200541011023000b2006102222050dfa040b200641011023000b2008102222090df6040b200841011023000b2009102222060df2040b200941011023000b2006102222050dee040b200641011023000b2006102222050dea040b200641011023000b2006102222050de6040b200641011023000b2006102222080de2040b200641011023000b2005102222080dde040b200541011023000b2006102222050dda040b200641011023000b2006102222050dd6040b200641011023000b2006102222050dd2040b200641011023000b2006102222050dce040b200641011023000b2006102222050dca040b200641011023000b2005102222080dc6040b200541011023000b2009102222060dc2040b200941011023000b2006102222050dbe040b200641011023000b2005102222080dba040b200541011023000b2006102222050db6040b200641011023000b2006102222050db2040b200641011023000b2006102222050dae040b200641011023000b2006102222050daa040b200641011023000b2006102222050da6040b200641011023000b2006102222050da2040b200641011023000b2006102222050dee040b200641011023000b2008102222090d9c040b200841011023000b2006102222050d98040b200641011023000b2008102222090d94040b200841011023000b2006102222050d90040b200641011023000b2006102222050d8c040b200641011023000b2006102222050d88040b200641011023000b2006102222050d84040b200641011023000b2006102222050d80040b200641011023000b2006102222050dfc030b200641011023000b2006102222050df8030b200641011023000b2006102222050df4030b200641011023000b2006102222050df0030b200641011023000b2006102222050dec030b200641011023000b2006102222050de8030b200641011023000b2006102222050de4030b200641011023000b2006102222050de0030b200641011023000b2008102222090ddc030b200841011023000b2008102222090dd8030b200841011023000b2006102222050dd4030b200641011023000b2006102222050dd0030b200641011023000b2006102222050dcc030b200641011023000b2008102222090dc8030b200841011023000b2008102222090dc4030b200841011023000b2006102222050dc0030b200641011023000b2006102222050dbc030b200641011023000b2006102222050db8030b200641011023000b2006102222050db4030b200641011023000b2006102222050db0030b200641011023000b2006102222050dac030b200641011023000b2006102222050da8030b200641011023000b2006102222050da4030b200641011023000b2008102222090da0030b200841011023000b2006102222050d9c030b200641011023000b2006102222050d98030b200641011023000b2006102222050d94030b200641011023000b2006102222050d90030b200641011023000b2006102222050d8c030b200641011023000b2006102222050d88030b200641011023000b2006102222050d84030b200641011023000b2009102222060d80030b200941011023000b2006102222050dfc020b200641011023000b2006102222050df8020b200641011023000b2006102222050df4020b200641011023000b2006102222050df0020b200641011023000b2006102222050dec020b200641011023000b2006102222050de8020b200641011023000b2006102222050de4020b200641011023000b2005102222080de0020b200541011023000b2008102222090ddc020b200841011023000b2006102222050dd8020b200641011023000b2006102222050dd3020b200641011023000b2006102222050dcf020b200641011023000b2006102222050dcb020b200641011023000b2006102222050dc7020b200641011023000b2006102222050dc3020b200641011023000b2006102222050dbf020b200641011023000b2006102222050dbb020b200641011023000b2006102222050db7020b200641011023000b2006102222050db3020b200641011023000b2006102222050daf020b200641011023000b2006102222050dab020b200641011023000b2006102222050da7020b200641011023000b2006102222050da3020b200641011023000b2006102222050d9f020b200641011023000b2006102222050d9b020b200641011023000b2006102222050d97020b200641011023000b2006102222050d93020b200641011023000b2006102222050d8f020b200641011023000b2006102222050d8b020b200641011023000b2006102222050d87020b200641011023000b2006102222050d83020b200641011023000b2006102222050dff010b200641011023000b2006102222050dfb010b200641011023000b2006102222050df7010b200641011023000b2006102222050df3010b200641011023000b2006102222050def010b200641011023000b2006102222050deb010b200641011023000b2006102222050de7010b200641011023000b2008102222090de3010b200841011023000b2008102222050ddf010b200841011023000b2009102222060ddb010b200941011023000b2006102222050dd7010b200641011023000b2006102222050dd3010b200641011023000b2006102222050dcf010b200641011023000b2006102222050dcb010b200641011023000b2006102222050dc7010b200641011023000b2006102222050dc3010b200641011023000b2006102222050dbf010b200641011023000b2006102222050dbb010b200641011023000b2006102222050db7010b200641011023000b2006102222050db3010b200641011023000b2006102222050daf010b200641011023000b2006102222050dab010b200641011023000b2006102222050da7010b200641011023000b2006102222050da3010b200641011023000b2006102222050d9f010b200641011023000b2006102222050d9b010b200641011023000b2006102222050d97010b200641011023000b2006102222050d93010b200641011023000b2006102222050d8f010b200641011023000b2008102222090d8b010b200841011023000b2008102222090d87010b200841011023000b2006102222050d83010b200641011023000b2006102222050d7f0b200641011023000b2006102222050d7b0b200641011023000b2009102222060d770b200941011023000b2006102222050d730b200641011023000b2006102222050d6f0b200641011023000b2006102222050d6b0b200641011023000b2008102222090d670b200841011023000b2006102222050d630b200641011023000b2006102222050d5f0b200641011023000b2006102222050d5b0b200641011023000b2006102222050d570b200641011023000b2006102222050d530b200641011023000b2006102222050d4f0b200641011023000b2006102222050d4b0b200641011023000b2006102222050d470b200641011023000b2005102222080d430b200541011023000b2006102222050d3f0b200641011023000b2006102222050d3b0b200641011023000b2008102222090d370b200841011023000b2006102222050d330b200641011023000b2006102222050d2f0b200641011023000b2008102222090d2b0b200841011023000b2008102222090d270b200841011023000b2006102222050d230b200641011023000b2001102222060d1f0b200141011023000b2008102222090d1b0b200841011023000b2006102222050d170b200641011023000b2008102222090d130b200841011023000b2005102222080d0f0b200541011023000b2006102222050d0b0b200641011023000b2005102222080d070b200541011023000b2006102222050d030b200641011023000b1024000b1024000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011023000b200941011023000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210250240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102122050d020c060b200928020021050c020b200810222205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10200b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1020200341106a24000f0b200841011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102620032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102720032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001020200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011023000b200941011023000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011023000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102122080d020c050b200b28020021080c020b200710222208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610212205450d020c040b200b28020021050c040b2006102222050d020b200641011023000b200741011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102122060d020c050b200728020021060c020b200910222206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610212205450d020c030b200528020021050c030b2006102222050d010b200641011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102122060d020c070b200728020021060c020b200910222206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1024000b200d41011023000b200941011023000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102122090d020c050b200728020021090c020b200d10222209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102122060d020c060b200728020021060c020b200910222206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410212205450d020c030b200528020021050c030b2004102222050d010b200441011023000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102122090d020c060b200728020021090c020b200d10222209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102122050d020c070b200728020021050c020b200910222205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1024000b200d41011023000b200941011023000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200341106a24000b05001024000bc10703097f047e017f230041e0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a41086a220720052003410c6c6a220a41f0026a280200360200200a41e8026a290200210b2001410c6a200341016a360200200141086a2004360200200141046a20053602002002200b370320200241306a41186a2006290300220b370300200241306a41106a2008290300220c370300200241306a41086a2009290300220d370300200241d8006a2007280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000f0b20004100360200200241e0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210b0c010b2004ad210b410021030b20051020200ba7210402400240200b422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210b0c010b2004ad210b410021050b20031020200ba7210420052103200b422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41086a220f20052006410c6c6a220341f0026a2802003602002002200341e8026a290200370320200520064102746a41f0036a2802002103024020074101460d00410120076b2105034020032802ec032103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241306a41186a2008290300220b370300200241306a41106a2009290300220c370300200241306a41086a200a290300220d370300200241d8006a200f280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000b970603087f017e017f23004180026b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e0001084041a2001410c6a200341016a360200200141086a2004360200200141046a200536020020024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e0001084041a200020024180016a4180011084041a20024180026a24000f0b2000420237032020024180026a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b20051020200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b20031020200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e0001084041a200520064102746a418c0b6a2802002103024020074101460d00410120076b2105034020032802880b2103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a200336020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e0001084041a200020024180016a4180011084041a20024180026a24000b130020004100360204200041c8d7c4003602000b130020004107360204200041b884c0003602000b130020004102360204200041c084c0003602000bc30201047f230041d0006b22022400024002400240410f10222203450d00200341076a41002900ce8240370000200341002900c782403700002003410f411e10212203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a103820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031020200241d0006a24000f0b410f41011023000b411e41011023000b419a88c00041331039000bdd0403027f017e0d7f230041d0006b22022400200241086a2001108e0102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b1031000b200541011023000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e102122060d010c060b200e10222206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d00200610200b200241d0006a24000f0b1024000b200e41011023000b5e01017f230041306b220224002002200136020c20022000360208200241246a41013602002002410336022c20024201370214200241ec81c5003602102002200241086a3602282002200241286a360220200241106a41f481c5001048000b960803037f017e077f23004190016b22012400200141106a41086a2202420037030020014200370310418788c0004113200141106a100220014180016a41086a20022903003703002001200129031037038001410021020240024002400240024020014180016a411041c8d7c400410041001001417f460d002001410036021020014180016a4110200141106a41044100100141016a41044d0d01200128021021020b412010222203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d000121052003102020014180016a20054108742004a7220341c00171724106762205103702400240024002402003413f7122032001280288014f0d00200120012802800120034105746a2203103b2001290300200141086a290300844200510d010b0240200128028401450d0020012802800110200b200141106a20021037024020012802182203413f4d0d00200141186a21050340200241016a210202402001280214450d00200128021010200b200141106a200210372005280200220341c0004f0d000b0b2001280210210620012802142107200141106a41186a2208200041186a290000370300200141106a41106a2209200041106a290000370300200141106a41086a220a200041086a29000037030020012000290000370310200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b10212206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141106a41086a20014180016a41086a28020036020020012001290380013703102005200141106a103c20014190016a24000f0b200b102222060d040b200b41011023000b419a88c00041331039000b412041011023000b1024000b200241067420036a210b200620034105746a22032001290310370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141106a41086a2203420037030020014200370310418788c0004113200141106a100220014180016a41086a200329030037030020012001290310370380012001200241016a36021020014180016a4110200141106a410410030b2001200536021820012007360214200120063602102002200141106a103c200141106a41086a2000290000370300200141106a41106a200041086a290000370300200141106a41186a200041106a290000370300200141306a200041186a2900003703002001200b360214200141013a0010200141106a103d20014190016a24000ba40604027f017e037f037e230041c0006b22022400024002400240411410222203450d00200341106a41002800a5ef40360000200341086a410029009def4037000020034100290095ef4037000020034114413410212203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22054200370300200241206a41106a22064200370300200241206a41086a220742003703002002420037032020034134200241206a1000200241186a2005290300370300200241106a2006290300370300200241086a2007290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012205417f460d022005410f4d0d02200241286a29030021082002290320210420031020411810222203450d010c050b42002108200310204118102222030d040b411841011023000b419a88c00041331039000b411441011023000b413441011023000b200341106a41002900b9ef40370000200341086a41002900b1ef40370000200341002900a9ef40370000024020034118413810212203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002109200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034138200241206a1000200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a290300210a200229032021090c010b4200210a0b200310202000200920047c22043703002000200a20087c2004200954ad7c370308200241c0006a24000f0b419a88c00041331039000b413841011023000bda0401097f230041d0006b2202240002400240410f10222203450d00200341076a41002900ce8240370000200341002900c782403700002003410f411e10212204450d012004200036000f200241286a41186a22004200370300200241286a41106a22054200370300200241286a41086a220342003703002002420037032820044113200241286a1000200241086a41186a2000290300370300200241086a41106a2005290300370300200241086a41086a20032903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a103e02400240024002402000450d00200041057421072003280200210020022802282108200228022c21092006210303400240024002400240200920006b41204f0d00200041206a22052000490d072009410174220a20052005200a491b220a4100480d072009450d0120082009200a102122080d020c080b200041206a21050c020b200a10222208450d060b200a21090b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200741606a22070d000b200241306a20053602002002200936022c200220083602280c010b20032802002105200228022c2109200228022821080b200241086a412020082005100302402009450d00200810200b200410200240200141046a280200450d00200610200b200241d0006a24000f0b1024000b200a41011023000b410f41011023000b411e41011023000bae1e01067f230041e0026b2201240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024041cec6c000411041c8d7c400410041001001417f460d00200141003602880141cec6c000411020014188016a41044100100141016a41044d0d022001280288012102410021030c010b410121030b200141106a200041f0001084041a20014184016a20023602002001200336028001200141c0026a41086a22004200370300200142003703c00241bccec000410d200141c0026a1002200141a8026a41086a2000290300370300200120012903c0023703a8022001410036028801200141a8026a411020014188016a10122102024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280288012200417f460d002002450d002001200036028802200120003602840220012002360280022000450d012001200036028c012001200236028801200141086a20014188016a10bc0102402001280208450d0041012102200128020c220341016a220420034f0d030b410021002001280284020d2c0c2d0b200141003602880220014201370380020b20014100360290012001420137038801200141013602c002200141c0026a20014188016a103e0240024002402001280280014101470d00200128028c0120014190016a2802002200470d01200041016a22022000490d3120004101742203200220022003491b22034100480d312000450d042001280288012000200310212202450d050c2a0b200128028c0120014190016a2802002200470d01200041016a22022000490d3020004101742203200220022003491b22034100480d302000450d052001280288012000200310212202450d060c270b20012802880121020c290b20012802880121020c260b0240200341c000490d0041022102200341808001490d00410441052003418080808004491b21020b410121030240200441c000490d0041022103200441808001490d00410441052004418080808004491b21030b20032002470d04200120014180026a36028801200420014188016a2002108c022001280280014101470d0520012802840220014188026a2802002200470d08200041016a22022000490d2d20004101742203200220022003491b22034100480d2d2000450d0c2001280280022000200310212202450d0d0c210b2003102222020d250b200341011023000b2003102222020d210b200341011023000b2000200320026b6a2200417f4c0d102000450d012000102222050d02200041011023000b20012802840220014188026a2802002200470d03200041016a22022000490d2720004101742203200220022003491b22034100480d272000450d082001280280022000200310212202450d090c190b410121050b200120003602980220012000360294022001200536029002200120014190026a36028801200420014188016a2003108c0220002003490d0e20012802980222042000490d0f20014188026a28020022042002490d10200128029002210520012802800221062001200020036b22003602a0022001200420026b22043602a40220002004470d11200520036a200620026a20001084041a02402001280280014101470d0020012802940220014198026a2802002200470d03200041016a22022000490d2620004101742203200220022003491b22034100480d262000450d092001280290022000200310212202450d0a0c150b20012802940220014198026a2802002200470d03200041016a22022000490d2520004101742203200220022003491b22034100480d252000450d0a2001280290022000200310212202450d0b0c120b20012802800221020c190b20012802800221020c160b20012802900221020c120b20012802900221020c0f0b2003102222020d140b200341011023000b2003102222020d100b200341011023000b2003102222020d0b0b200341011023000b2003102222020d070b200341011023000b419a88c00041331039000b1031000b20032000102d000b20002004102e000b20022004102d000b2001200141a0026a3602d8022001200141a4026a3602dc0220014188016a41146a4100360200200141c0026a41146a4104360200200141cc026a4105360200200141a8026a41146a4103360200200141c8d7c400360298012001420137028c01200141d0d2c40036028801200141053602c402200142033702ac02200141fcd1c4003602a802200120014188016a3602d0022001200141dc026a3602c8022001200141d8026a3602c0022001200141c0026a3602b802200141a8026a418cd3c4001048000b2001200336029402200120023602900220014198026a28020021000b20014198026a2203200041016a360200200220006a41003a000020014184016a2802002104024002400240024002402001280294022202200328020022006b41044f0d00200041046a22032000490d1620024101742200200320032000491b22004100480d162002450d012001280290022002200010212202450d020c030b20012802900221020c030b2000102222020d010b200041011023000b2001200036029402200120023602900220014198026a28020021000b20014198026a200041046a360200200220006a20043600000c020b2001200336029402200120023602900220014198026a28020021000b20014198026a200041016a360200200220006a41013a00000b200141106a20014190026a10b80120014198026a280200210220012802940221032001280290022100200128028402450d0b200128028002102020000d0c0c0d0b2001200336028402200120023602800220014188026a28020021000b20014188026a2203200041016a360200200220006a41003a000020014184016a2802002104024002400240024002402001280284022202200328020022006b41044f0d00200041046a22032000490d1120024101742200200320032000491b22004100480d112002450d012001280280022002200010212202450d020c030b20012802800221020c030b2000102222020d010b200041011023000b2001200036028402200120023602800220014188026a28020021000b20014188026a200041046a360200200220006a20043600000c020b2001200336028402200120023602800220014188026a28020021000b20014188026a200041016a360200200220006a41013a00000b200141106a20014180026a10b80120014188026a2802002102200128028402210320012802800222000d070c080b2001200336028c01200120023602880120014190016a28020021000b20014190016a2203200041016a360200200220006a41003a000020014184016a280200210402400240024002400240200128028c012202200328020022006b41044f0d00200041046a22032000490d0c20024101742200200320032000491b22004100480d0c2002450d012001280288012002200010212202450d020c030b20012802880121020c030b2000102222020d010b200041011023000b2001200036028c01200120023602880120014190016a28020021000b20014190016a200041046a360200200220006a20043600000c020b2001200336028c01200120023602880120014190016a28020021000b20014190016a200041016a360200200220006a41013a00000b200141106a20014188016a10b80120014190016a2802002102200128028c0121032001280288012100200128028402450d010b20012802800210200b2000450d010b200141c0026a41086a22044200370300200142003703c00241bccec000410d200141c0026a1002200141a8026a41086a2004290300370300200120012903c0023703a802200141a8026a411020002002100302402003450d00200010200b024020012d0010417b6a220041064b0d00024002400240024020000e0700020404010403000b200141186a2d00004101470d03200141246a280200450d03200141206a2802001020200141e0026a24000f0b200141186a280200450d0220012802141020200141e0026a24000f0b20012d00144103470d0102402001411c6a280200450d00200141186a28020010200b200141286a280200450d01200141246a2802001020200141e0026a24000f0b200141186a2d00004105490d00200141c0006a280200450d002001413c6a28020010200b200141e0026a24000f0b20014188016a200141106a41f8001084041a02400240024041f80010222200450d00200020014188016a41f80010840421002001428180808010370294022001200036029002200141c0026a41086a22024200370300200142003703c00241bccec000410d200141c0026a1002200141a8026a41086a2002290300370300200120012903c0023703a802200141003602c802200142013703c002200141013602800220014180026a200141c0026a103e024002400240024002400240024020002802704101470d0020012802c40220022802002202470d01200241016a22032002490d0a20024101742204200320032004491b22044100480d0a2002450d0320012802c0022002200410212203450d040c0d0b20012802c40220022802002202470d01200241016a22032002490d0920024101742204200320032004491b22044100480d092002450d0420012802c0022002200410212203450d050c070b20012802c00221030c0c0b20012802c00221030c060b2004102222030d090b200441011023000b2004102222030d020b200441011023000b41f80041081023000b200120043602c402200120033602c002200141c8026a28020021020b200141c8026a2204200241016a360200200320026a41003a0000200041f4006a280200210502400240024020012802c4022203200428020022026b41044f0d00200241046a22042002490d0320034101742202200420042002491b22024100480d032003450d0120012802c0022003200210212203450d020c040b20012802c00221030c040b2002102222030d020b200241011023000b1024000b200120023602c402200120033602c002200141c8026a28020021020b200141c8026a200241046a360200200320026a20053600000c020b200120043602c402200120033602c002200141c8026a28020021020b200141c8026a200241016a360200200320026a41013a00000b2000200141c0026a10b80120012802c4022102200141a8026a411020012802c0022203200141c8026a280200100302402002450d00200310200b20014190026a108f0220001020200141e0026a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d0520012802002000200410212203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d0820012802002003200010212203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000102122030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102122030d0a0c0e0b2004102222030d110b200441011023000b200128020021030c050b200128020021030c070b2000102222030d0b0b200041011023000b200010222203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b200410222203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000102122020d020c070b200128020021020c020b200010222202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b1024000b200041011023000b200441011023000b200041011023000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b4103741085041a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c1085041a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e4011022220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc011084042107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a22014103741084042107200a41e0006a200041b4016a2001410c6c108404210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b4103741085041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c1085041a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b4103741085041a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c1085041a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d0241940210222207450d03200741003b010620074100360200200741086a200241d0006a418c021084042103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a22004103741084042116200741e0006a200941b4016a2000410c6c1084042117200741e4016a20094180026a2001417a6a220e4102741084042118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b22134103741085041a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c1085041a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b4102741085041a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b4103741085041a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c1085041a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b4102741085041a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b41940210222200450d03200041003b010620004100360200200041086a200241d0006a418c0210840421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b22074103741085041a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c1085041a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b4102741085041a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b41940241041023000b41e40141041023000b41940241041023000b200241e0026a24000bfe0705017f037e027f047e027f230041e0016b22032400200241106a290300210420024188016a29030021052002290308210620022802002107200341206a200241186a41f0001084041a20012802002108200341b0016a41186a20034188016a290300370300200341b0016a41106a20034180016a290300370300200341b0016a41086a200341f8006a290300370300200320032903703703b00102400240024041d00010222202450d0042002109200242003703002002410036022420022007360220200241003a0048200241186a4200370300200241106a4200370300200241086a42003703002002200341206a41d0006a2201290300370328200241306a200141086a290300370300200241386a200141106a290300370300200241c0006a200141186a29030037030020034190016a41086a220142003703002003420037039001418feec000411620034190016a1002200341d0016a41086a200129030037030020032003290390013703d001024002400240200341d0016a411041c8d7c400410041001001417f460d0020034200370398012003420037039001200341d0016a411020034190016a4110410010012201417f460d022001410f4d0d024201210a42002109200329039001220b427e5420034190016a41086a290300220c50200c4201511b0d01200341106a200b200c427f4200108704200341106a41086a29030021092003290310210a0c010b4201210a0b200320062004200a200910870420034190016a41186a200341b0016a41186a29030037030020034190016a41106a200341b0016a41106a29030037030020034190016a41086a200341b0016a41086a290300370300200320032903b00137039001200329030021090240024002400240200841046a28020020082802082201470d00200141016a22072001490d032001410174220d20072007200d491b220dad42d0007e220a422088a70d03200aa7220e4100480d032001450d012008280200200141d0006c200e10212207450d020c060b200828020021070c060b200e102222070d040b200e41081023000b1024000b419a88c00041331039000b41d00041081023000b20082007360200200841046a200d360200200841086a28020021010b2007200141d0006c6a22014200370310200142003703082001200937030020012002360220200120032903900137022c200141186a4200370300200141246a428180808010370200200141c4006a20034190016a41186a2903003702002001413c6a20034190016a41106a290300370200200141346a20034190016a41086a290300370200200841086a2202200228020041016a3602002000200437030820002006370300200041106a200341206a41f0001084041a2000200537038001200341e0016a24000bdb1801187f230041c00f6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e0001084041a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b4105741085041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903203700002003200441e0006c6a220041c8036a200041e8026a2200200341066a22032f010020046b41e0006c1085041a2000200241a0026a41e0001084042100200320032f010041016a3b0100200241c00f6a240020000f0b02400240024041880b1022220a450d00200a41003b0106200a4100360200200a41086a20024190046a41800b10840421012002200341ca016a2d00003a00aa03200220032f00c8013b01a803200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e20024190046a200341a8076a41e0001084041a2001200341e8016a200341066a22062f010041796a22004105741084042101200a41e8026a20034188086a200041e0006c1084042107200641063b0100200a20003b0106200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241b0036a20024190046a41e0001084041a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b4105741085041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220f41e0006a200f20002f010020046b41e0006c1085041a200f200241a0026a41e0001084041a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b4105741085041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a290300370000200120022903203700002007200441e0006c6a220041c07b6a200041e07a6a220f200a41066a22002f010020066b41e0006c1085041a200f200241a0026a41e0001084041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e0001084041a2002411c6a41026a221020042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e0001084041a02400240024020032802002207450d0020032f0104211103402002419c026a41026a221620102d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e0001084041a201141ffff0371210620072f01062203410a4d0d0241b80b10222201450d03200141003b010620014100360200200141086a20024190046a41b00b10840421002002200741ca016a2d00003a00aa03200220072f00c8013b01a803200220072900db01370398032002200741e0016a29000037009d03200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a280000211320024190046a200741a8076a41e0001084041a2000200741e8016a200741066a22092f0100220441796a22034105741084042117200141e8026a20074188086a200341e0006c1084042118200141880b6a200741a40b6a2004417a6a22084102741084042119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024190046a41e0001084041a200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241ac036a41026a220820022d0096033a0000200220022f0194033b01ac0320022002290380033703800120022002290085033700850120024190046a200241b0036a41e0001084041a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b22194105741085041a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200741e8026a200641e0006c6a220341e0006a2003201941e0006c1085041a2003200241a0026a41e0001084041a2009201141016a22033b0100200741880b6a2211200641027422196a41086a201120044102746a2211200341ffff037120046b4102741085041a2011200a360200200020092f010022044f0d01200720196a418c0b6a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b4105741085041a200041186a200229008d023700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f019c023b000020002002290388023700132018200641e0006c6a220041c07b6a200041e07a6a220020092f010020036b41e0006c1085041a2000200241a0026a41e0001084041a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b4102741085041a2009200a360200200420064b0d00200120116a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b20024184026a41026a220320082d00003a0000200220022f01ac033b01840220022002290380013703f00120022002290085013700f50120024190016a20024190046a41e0001084041a201020032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e0001084041a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b80b10222203450d03200341003b010620034100360200200341086a20024190046a41b00b10840421012003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f011c3b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290308370013200041026a2002411c6a41026a2d00003a0000200041186a200229000d3700002003200441e0006c6a41e8026a200241206a41e0001084041a200341880b6a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b22014105741085041a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002007200641e0006c6a220041c8036a200041e8026a2200200141e0006c1085041a2000200241a0026a41e0001084041a200741066a2200200341016a22033b0100200741880b6a220120064102746a41086a200120044102746a2201200341ffff037120046b4102741085041a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b80b41081023000b41880b41081023000b41b80b41081023000b200241c00f6a2400200f0bbc0101047f230041306b22012400200120001032024020012802004101470d00200141286a2102200141246a21030340024020032802002204450d002002280200450d00200410200b20012000103220012802004101460d000b0b0240200028020422044180e5c200460d0020042802002103200410202003450d0020032802002100200310202000450d00024020002802002204450d000340200010202004210020042802002203210420030d000b0b200010200b200141306a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010202005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110202005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d00200410200b20020d000b0b024020004180e5c200460d0020002802002101200010202001450d0020012802002104200110202004450d00024020042802002201450d000340200410202001210420012802002200210120000d000b0b200410200b0ba11f01407f23004190066b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a290000370300200420022900003703600240024002400240200128020022054180e5c200460d00200128020421060c010b41ec0310222205450d0141002106200541003b010620054100360200200541086a200441f8016a41e4031084041a20014100360204200120053602000b0c010b41ec0341041023000b41002102024003400240024002400240024002400240024020020e020001010b200541086a2107200541066a210820052f01062209410574210a417f2102024002400240024002400340200a450d01200241016a2102417f4101200441e0006a20074120108604220b4100481b4100200b1b220b450d04200a41606a210a200741206a2107200b4101460d000b20060d010c020b200921022006450d010b2006417f6a2106200520024102746a41ec036a2802002105410021020c0a0b200441086a41186a220b200441e0006a41186a220a290300370300200441086a41106a220c200441e0006a41106a2207290300370300200441086a41086a2209200441e0006a41086a220d290300370300200420042903603703082001200128020841016a360208200a200b2903003703002007200c290300370300200d200929030037030020042004290308370360200441e8016a41086a220c200341086a280200360200200420032902003703e80120082f01002209410b4f0d01200520024105746a220b41286a200b41086a220e200920026b4105741085041a200b41206a200a290300370000200b41186a2007290300370000200b41106a200d290300370000200e200429036037000020052002410c6c6a220a41f4026a200a41e8026a220d200541066a22072f010020026b410c6c1085041a200a41f0026a200c280200360200200d20042903e801370200200720072f010041016a3b01000c0a0b200441f8016a41086a220a20052002410c6c6a220241f0026a22072802003602002004200241e8026a22022902003703f8012007200341086a28020036020020022003290200370200200441e0006a41086a2202200a280200360200200420042903f801370360200041013602002000410c6a20022802003602002000200429036037020420044190066a24000f0b41ec031022220f450d04200f41003b0106200f4100360200200f41086a200441f8016a41e4031084042107200441f8016a41086a220d200541b8036a280200360200200420052902b0033703f8012004200541e0016a2900003700c501200420052900db013703c0012004200541ca016a2d00003a00d201200420052f00c8013b01d001200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a200541066a220b2f010041796a220a4105741084042107200f41e8026a200541bc036a200a410c6c108404210c200b41063b0100200f200a3b0106200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200441286a41086a200d280200360200200420042903f80137032802400240200241064b0d00200541086a20024105746a220a41206a200a20082f010020026b4105741085041a200a41186a200441e0006a41186a290300370000200a41106a200441e0006a41106a290300370000200a41086a200441e0006a41086a290300370000200a2004290360370000200541e8026a2002410c6c6a220a410c6a200a20082f010020026b410c6c1085041a200a41086a200441e8016a41086a280200360200200a20042903e8013702000c010b200720024105746a41c07e6a2007200241796a220d4105746a2207200a41ffff0371200d6b4105741085041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a29030037000020072004290360370000200c2002410c6c6a220241b87f6a200241ac7f6a220a200f41066a22082f0100200d6b410c6c1085041a200241b47f6a200441e8016a41086a280200360200200a20042903e8013702000b4101210d200820082f010041016a3b01004102211420044198016a41026a220220042d00be013a000041082115200441d8016a41086a2216200441286a41086a280200360200200420042f01bc013b019801200420042903a801370350200420042900ad01370055200420042903283703d801200441c0006a41086a221720162802003602002004413c6a41026a221820022d00003a0000200420042903d801370340200420042903503703282004200429005537002d200420042f0198013b013c2005280200220e450d0120052f0104211941ffff03211a410a211b419c04211c4100211d419404211e41ca01211f41db01212041e001212141cb01212241cf01212341d301212441d701212541b803212641b003212741e8012128410621294179212a4105212b41bc03212c41e802212d410c212e418804212f41ec032130417a21314118213241f00321334104210c41ac7f213441b87f213541b47f2136416c213741d40321380c060b20044194016a20146a223d20182d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a20156a223e201728020036020020042004290340370398012019201a712109200e2f01062202201b4d0d01201c1022220b450d02200b201d3b0106200b201d360200200b20156a200441f8016a201e108404210a2004200e201f6a2d00003a00d2012004200e2f00c8013b01d0012004200e20206a2900003703c0012004200e20216a2900003700c501200e20226a2800002139200e20236a280000213c200e20246a280000213b200e20256a280000213a200441f8016a20156a223f200e20266a2802003602002004200e20276a2902003703f801200a200e20286a200e20296a22402f01002207202a6a2202202b741084042141200b202d6a200e202c6a2002202e6c1084042142200b20306a200e202f6a200720316a22082014741084042143204020293b0100200b20023b010602402008450d00410021022043210a0340200a280200220720023b01042007200b360200200a200c6a210a20082002200d6a2202470d000b0b200441e8016a20156a2202203f280200360200200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200420042903f8013703e801200441d4016a20146a220820042d00be013a0000200420042f01bc013b01d401200420042903a8013703f801200420042900ad013700fd0120162002280200360200200420042903e8013703d801024002402019201a71220a20294b0d00200e20156a22022009200d6a2219202b746a20022009202b746a220220402f010020096b202b741085041a200220326a20042900653700002002201336000f2002201236000b2002201136000720022010360003200220146a203d2d00003a0000200220042f0194013b000020022004290360370013200e202d6a2009202e6c6a2202202e6a200220402f0100220720096b202e6c1085041a200220156a203e280200360200200220042903980137020020402007200d6a22023b0100200e20306a2207200920147422116a20156a200720192014746a22402002201a71220720196b2014741085041a2040200f360200200a20074f0d01200e20116a20336a210203402002280200220a2009200d6a22093b0104200a200e3602002002200c6a210220072009470d000c020b0b2041200920316a2207202b746a20412009202a6a2202202b746a220a200b20296a22192f010020026b202b741085041a200a20326a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a20146a203d2d00003a0000200a20042f0194013b0000200a200429036037001320422009202e6c6a220a20356a200a20346a224020192f0100221120026b202e6c1085041a200a20366a203e280200360200204020042903980137020020192011200d6a220a3b01002043200920147422406a20376a204320072014746a2219200a201a71220920076b2014741085041a2019200f360200200720094b0d00200b20406a20386a210a0340200a28020022072002200d6a22023b01042007200b360200200a200c6a210a20092002470d000b0b20044190016a20146a220220082d00003a000020044180016a20156a220a2016280200360200200420042f01d4013b019001200420042903f801370350200420042900fd01370055200420042903d801370380012017200a280200360200201820022d00003a00002004200429038001370340200420042903503703282004200429005537002d200420042f0190013b013c0240200e2802002202450d00200e2f0104211920392110203a2113203b2112203c21112002210e200b210f410121020c070b20392110203a2113203b2112203c2111200b210f0b419c0410222202450d03200241003b010620024100360200200241086a200441f8016a419404108404210d20022001280200220a3602ec03200120023602002001200128020441016a360204200a41003b0104200a2002360200200d20022f010622074105746a220a2004290328370013200a20042f013c3b0000200a201336000f200a201236000b200a2011360007200a2010360003200a41186a200429002d370000200a41026a2004413c6a41026a2d00003a000020022007410c6c6a220a41f0026a200441c0006a41086a280200360200200a41e8026a2004290340370200200241ec036a200741016a220a4102746a200f3602002002200a3b0106200f200a3b0104200f20023602000c060b200e41086a220a200941016a22074105746a200a20094105746a220a200220096b4105741085041a200a41186a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a41026a20044194016a41026a2d00003a0000200a20042f0194013b0000200a2004290360370013200e2009410c6c6a220241f4026a200241e8026a220a200e41066a220d2f0100220b20096b410c6c1085041a200241f0026a20044198016a41086a280200360200200a200429039801370200200d200b41016a22023b0100200e41ec036a220a20094102746a41086a200a20074102746a220a200241ffff0371220d20076b4102741085041a200a200f360200201941ffff0371200d4f0d05200e2007417f6a22024102746a41f0036a210a0340200a2802002207200241016a22023b01042007200e360200200a41046a210a200d2002470d000c060b0b419c0441041023000b41ec0341041023000b419c0441041023000b410121020c000b0b2000410036020020044190066a24000b0a0041fc82c000102f000b4d01017f230041206b22002400200041146a41013602002000410336021c200041eca1c40036021820004201370204200041f4a1c4003602002000200041186a360210200041a884c0001048000b110020012000280200200028020410fd010b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241c8d7c400360204200241c8d7c400360200200210e603000bafba020f2a7f017ec4017f027e257f017e7b7f017e0c7f017e0d7f017e0b7f017e4c7f230041e0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5e2004410174220c200b200b200c491b220c4100480d5e2004450d2d20022802002004200c1021220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d00012108200241046a280200200241086a2802002204470d0d200441016a22062004490d5d2004410174220d20062006200d491b220d4100480d5d2004450d1c20022802002004200d10212206450d1d0c540b2001410c6a280200210e200141086a280200210f200141046a2802002110200241046a280200200241086a2802002204470d0d200441016a220b2004490d5b20044101742205200b200b2005491b22054100480d5b2004450d1d2002280200200420051021220b450d1e0c510b2001410c6a2802002111200141086a2802002112200141046a2802002113200241046a280200200241086a2802002204470d0d200441016a220b2004490d5b20044101742205200b200b2005491b22054100480d5b2004450d1e2002280200200420051021220b450d1f0c4e0b200141146a2802002114200141106a28020021152001410c6a2802002116200141086a2802002117200141056a2d00002118200141046a2d00002119200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1f2002280200200420051021220b450d200c4b0b2001410c6a280200211a200141086a280200211b200141046a280200211c200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d202002280200200420051021220b450d210c480b2001410c6a2802002106200141086a280200211d200141046a280200211e200241046a280200200241086a2802002204470d0d200441016a220b2004490d5820044101742205200b200b2005491b22054100480d582004450d212002280200200420051021220b450d220c450b2001410c6a2802002106200141086a280200211f200141046a2802002120200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d222002280200200420051021220b450d230c420b2001410c6a2802002106200141086a2802002121200141046a2802002122200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d232002280200200420051021220b450d240c3f0b2001410c6a2802002106200141086a2802002123200141046a2802002124200241046a280200200241086a2802002204470d0e200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d262002280200200420051021220b450d270c3c0b2001410c6a2802002125200141086a2802002126200141046a2802002127200241046a280200200241086a2802002204470d0e200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d272002280200200420051021220b450d280c390b200141286a2802002128200141246a2802002129200141206a280200212a2001411c6a2802002109200141186a280200212b200141146a280200212c2001410c6a290200212d200141086a280200212e200141046a280200210a200241046a280200200241086a2802002204470d0e200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d282002280200200420051021220b450d290c360b2001410c6a280200212f200141086a2802002130200141046a2802002131200241046a280200200241086a2802002204470d0e200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d292002280200200420051021220b450d2a0c330b2001410c6a2802002132200141086a2802002133200141046a2802002134200241046a280200200241086a2802002204470d0e200441016a220b2004490d5020044101742205200b200b2005491b22054100480d502004450d2a2002280200200420051021220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d50200b4101742206200520052006491b22064100480d50200b450d2b2002280200200b200610212205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b2002280200210b0c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200d102222060d370b200d41011023000b20051022220b0d330b200541011023000b20051022220b0d2f0b200541011023000b20051022220b0d2b0b200541011023000b20051022220b0d270b200541011023000b20051022220b0d230b200541011023000b20051022220b0d1f0b200541011023000b20051022220b0d1b0b200541011023000b200c1022220b0d290b200c41011023000b20051022220b0d150b200541011023000b20051022220b0d110b200541011023000b20051022220b0d0d0b200541011023000b20051022220b0d090b200541011023000b20051022220b0d050b200541011023000b2006102222050d010b200641011023000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210d410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d27024002402006450d00200d200620051021220d0d010c040b20051022220d450d030b200521060b200d200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a210a200241086a2107200241046a2136200b210503400240024002400240203628020020072802002204470d00200441016a22082004490d2a20044101742209200820082009491b22094100480d2a2004450d01200228020020042009102122080d020c060b200228020021080c020b200910222208450d040b2002200836020020362009360200200728020021040b2007200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b200a4d0d00200228020021050c040b2004200b6a22072004490d2520054101742204200720072004491b22044100480d25024002402005450d0020022802002005200410212205450d010c040b2004102222050d030b200441011023000b200541011023000b200941011023000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200d200b1084041a4101213602402006450d00200d10200b4101210d410621040c1f0b2002200b360200200241046a2005360200200241086a28020021040b410121e001410821e101200241086a200441016a360200200b20046a410a3a0000410021e2012003412c6a22e301410036020020034201370224200320023602202034203241186c6a21e401410721e50141ff0021e60141807f21e701410021e801410021e901203221ea010240024041004100460d004114214c0c010b4113214c411021040c1e0b411021040c1d0b2002200b360200200241046a2005360200200241086a28020021040b410121d301410821d401200241086a200441016a360200200b20046a41063a0000410021d501200341dc006a22d601410036020020034201370254200320023602502031202f4104746a21d701410721d80141ff0021d90141807f21da01410021db01410021dc01202f21dd010240024041004100460d004110214c0c010b410f214c411021040c1c0b411021040c1b0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a0000200341dc006a22d20141003602002003420137025420032002360250202d422088a721064100210b41002104202da72208210502400240024003400240024002400240200b2004470d00200b41016a2204200b490d22200b4101742207200420042007491b22044100480d22200b450d012003280254200b20041021220b0d020c050b2003280254210b0c020b20041022220b450d030b200341d0006a41086a20043602002003200b36025420d20128020021040b20d201200441016a360200200b20046a200541807f72200541ff0071200541077622071b3a0000200341d0006a41086a280200210b20d20128020021042007210520070d000b024002400240200b20046b20084f0d00200420086a22052004490d20200b4101742204200520052004491b22044100480d20200b450d012003280254200b200410212205450d020c040b200328025421050c040b2004102222050d020b200441011023000b200441011023000b200341d8006a200436020020032005360254200341dc006a28020021040b200341dc006a220b200420086a360200200520046a200a20081084041a0240202e450d00200a10200b200341d8006a210702400240024002400240034002400240024002402007280200200b2802002204470d00200441016a22052004490d24200441017422d2012005200520d201491b22d2014100480d242004450d012003280254200420d201102122050d020c050b200328025421050c020b20d20110222205450d030b200720d20136020020032005360254200b28020021040b200b200441016a360200200520046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b4101212e202c450d04200341dc006a2105200341d8006a21072009210b03400240024002400240200728020020052802002204470d00200441016a22062004490d24200441017422d2012006200620d201491b22d2014100480d242004450d012003280254200420d201102122060d020c060b200328025421060c020b20d20110222206450d040b200720d20136020020032006360254200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b024002400240200341d8006a280200220b200341dc006a28020022046b20094f0d00200420096a22052004490d22200b4101742204200520052004491b22044100480d22200b450d012003280254200b20041021220b450d020c050b2003280254210b0c050b20041022220b0d030b200441011023000b20d20141011023000b20d20141011023000b200341d8006a20043602002003200b360254200341dc006a28020021040b200341dc006a200420096a360200200b20046a202c20091084041a4100212e202b450d00202c10200b202a20284104746a21b602200341dc006a2105200341d8006a21072028210b0240024003400240024002400240200728020020052802002204470d00200441016a22062004490d21200441017422d2012006200620d201491b22d2014100480d212004450d012003280254200420d201102122060d020c050b200328025421060c020b20d20110222206450d030b200720d20136020020032006360254200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02402028450d00411021b702410821b802410c21b902417f21ba02410621bb02410121bc02410021bd02410721be0241ff0021bf0241807f21c002410221c102410321c202411a21c302410421c402410521c502411021c602202a21d201411b214c0c020b202a21d201410521040c1b0b20d20141011023000b411021040c190b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a0000200341d0006a410c6a220a4100360200200342013702542003200236025020272025410c6c6a21094101210741002105410021042025210b02400240024002400340024020042005470d00200541016a22062005490d1f20054101742208200620062008491b22064100480d1f024002402005450d00200720052006102122070d010c040b200610222207450d030b200341d0006a41086a200636020020032007360254200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402025450d002025410c6c41746a210b202721040340200441046a28020022054102460d02200341086a20042802002005200441086a280200200341d0006a104a20032d00082205411a470d042004410c6a2104200b41746a220b4174470d000c030b0b202721090c010b2004410c6a21090b20272025410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402026450d00202710200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d252004410174220d20072007200d491b220d4100480d252004450d0120052802002004200d102122070d020c090b200528020021070c020b200d10222207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d21200b4101742204200620062004491b22044100480d21200b450d022005280200200b20041021220b450d030c060b2005280200210b0c060b20032f000920032d000b411074722107200341086a41086a290300212d200328020c21082004410c6a210402400340200b450d01200b41746a210b200428020421062004410c6a210420064102470d000b0b02402026450d00202710200b0240200341d0006a41086a280200450d00200328025410200b200020073b0001200020053a0000200041036a20074110763a0000200041086a202d370000200041046a20083600004100219103410121c0014101210c0c1b0b20041022220b0d030b200441011023000b200641011023000b200d41011023000b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b4100213c410121364101210d4101213741012138410121394101213a4101213b410721040c170b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202420064104746a21c2014100210b410021c301410021c401410121c50120062104024002400340024020c30120c401470d00200b20c30141016a22052005200b491b22c4014100480d1b0240200b450d0020c50120c30120c401102122c5010d010c030b20c401102222c501450d020b20c50120c3016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20c30141016a21c3012005210420050d000b02402006450d00411021c601410521c701410121c801410021c901410421ca01410221cb01410721cc0141ff0021cd0141807f21ce01410321cf01202421d001410e214c0c020b202421d101410421040c170b20c40141011023000b411021040c150b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002022200641146c6a21b1014100210b410021b201410021b301410121b40120062104024002400340024020b20120b301470d00200b20b20141016a22052005200b491b22b3014100480d190240200b450d0020b40120b20120b301102122b4010d010c030b20b301102222b401450d020b20b40120b2016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20b20141016a21b2012005210420050d000b02402006450d00411421b501410421b601410121b701411021b801410721b90141ff0021ba0141807f21bb01410021bc01410221bd01202221be01410d214c0c020b202221bf01410321040c150b20b30141011023000b411021040c130b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202020064102746a21a5014100210b410021a601410021a701410121a801200621040240024002400340024020a60120a701470d00200b20a60141016a22052005200b491b22a7014100480d180240200b450d0020a80120a60120a701102122a8010d010c030b20a701102222a801450d020b20a80120a6016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20a60141016a21a6012005210420050d000b2006450d01410121a901410721aa0141ff0021ab0141807f21ac01410021ad01410221ae01410421af01202021b001410c214c0c020b20a70141011023000b410121040c120b411021040c110b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41023a0000201e200641286c6a2187014100210b410021880141002189014101218a01200621040240024003400240208801208901470d00200b20880141016a22052005200b491b2289014100480d150240200b450d00208a012088012089011021228a010d010c030b2089011022228a01450d020b208a012088016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20880141016a2188012005210420050d000b02402006450d004128218b014104218c014124218d014120218e01411c218f01411a219001411921910141142192014110219301410721940141ff0021950141807f21960141012197014100219801410221990141f000219a014103219b01417f219c01413f219d0141c000219e0141ff01219f01201e21a001410b214c0c020b201e21a001410221040c110b20890141011023000b411021040c0f0b2002200b360200200241046a2005360200200241086a28020021040b4101216741082168200241086a200441016a360200200b20046a41093a000041002169200341dc006a226a41003602002003420137025420032002360250201c201a411c6c6a216b4107216c41ff00216d41807f216e4100216f41002170201a21710240024041004100460d004107214c0c010b4106214c411021040c0e0b411021040c0d0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a000002400240024002400240024041041022225b450d00205b41eec2b5ab0636000002400240024002400240024002400240024020194101460d00024020194102460d0020194103470d024100215c4101215d2017215e2016215f20152160410121614101216241012163410110222264450d1e410021040c1b0b2003410036024820034201370340200341c8006a21094101210741002105410021042017210b0340024020042005470d00200541016a22062005490d1d20054101742208200620062008491b22064100480d1d024002402005450d00200720052006102122070d010c0b0b200610222207450d0a0b2003200636024420032007360240200621050b2009200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201620144104746a21c7022014450d03201621c8022017450d04410421c902201620144104746a22ca0241706a21cb02410021cc02410121cd02411021ce02417f21cf02410821d002410721d10241ff0021d20241807f21d302411a21d402201721d502410021d602201621d7024105214c0c0c0b4100215d2003410036024820034201370340200341146a2014360200200341086a41086a20153602002003201636020c20032017360208200341d0006a200341086a200341c0006a104b20032d005022d802411a470d01200341c0006a41086a28020021602003280244215f2003280240215e41012161410021624100215c41012118410121634101102222640d090c1c0b4101215e410021044100210b20152105034002400240024002402004200b470d00200441016a220b2004490d1e20044101742206200b200b2006491b225f4100480d1e2004450d01205e2004205f1021225e0d020c0b0b2004215f0c020b205f1022225e450d090b2004210b205f21040b205e200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b205f200b6b20154f0d0c200b20156a2204200b490d19205f4101742205200420042005491b22044100480d19205f450d03205e205f20041021225e450d040c0b0b20032d0053411074210420032f0051210b200341d0006a41086a29030021bc03200328025421bd0302402003280244450d00200328024010200b200b20047221be03410d21040c170b201621c8020b20c80220c702460d06410e21040c150b20041022225e0d070b200441011023000b200641011023000b205f41011023000b410441011023000b410021040c0f0b410f21040c0e0b411021040c0d0b2004215f0b205e200b6a201720151084041a200b20156a21604101215d02402016450d00201710200b41002162410121614101215c4100211841012163410110222264450d0e410021040c0b0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a0000200341d0006a410c6a220a4100360200200342013702542003200236025020132011410c6c6a21094101210741002105410021042011210b024002400240024002400340024020042005470d00200541016a22062005490d1220054101742208200620062008491b22064100480d12024002402005450d00200720052006102122070d010c040b200610222207450d030b200341d0006a41086a200636020020032007360254200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402011450d002011410c6c41746a21052013210b0340200b41046a28020022074102460d02200b41086a2802002108200b280200210a0240024002400240200341d0006a41086a2227280200200341d0006a410c6a22252802002204470d00200441016a22062004490d1b20044101742226200620062026491b22264100480d1b2004450d01200328025420042026102122060d020c0d0b200328025421060c020b202610222206450d0b0b20272026360200200320063602540b2025200441016a360200200620046a41f0003a0000200341086a200a20072008200341d0006a104a20032d00082206411a470d04200b410c6a210b200541746a22054174470d000c030b0b201321090c010b200b410c6a21090b20132011410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402012450d00201310200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d182004410174220d20072007200d491b220d4100480d182004450d0120052802002004200d102122070d020c090b200528020021070c020b200d10222207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d14200b4101742204200620062004491b22044100480d14200b450d022005280200200b20041021220b450d030c070b2005280200210b0c070b20032f000920032d000b411074722107200341086a41086a290300212d200328020c2108200b410c6a2104024003402005450d01200541746a21052004280204210b2004410c6a2104200b4102470d000b0b02402012450d00201310200b0240200341d0006a41086a280200450d00200328025410200b200020073b0001200020063a0000200041036a20074110763a0000200041086a202d370000200041046a20083600004100210c410121c0010c0d0b20041022220b0d040b200441011023000b200641011023000b200d41011023000b202641011023000b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b4100213d410121364101210d4101213741012138410121394101213a4101213b4101213c410821040c090b2002200b360200200241046a2005360200200241086a28020021040b4101214141082142200241086a200441016a360200200b20046a410b3a000041002143200341dc006a2244410036020020034201370254200320023602502010200e411c6c6a21454107214641ff00214741807f2148410021494100214a200e214b0240024041004100460d004101214c0c010b4100214c411021040c080b411021040c070b20022006360200200241046a200d360200200241086a28020021040b200241086a220d200441016a360200200620046a20083a000002400240024002400240200241046a2802002206200d28020022046b200b4f0d002004200b6a22082004490d0c20064101742204200820082004491b22044100480d0c2006450d0120022802002006200410212206450d020c030b200228020021060c030b2004102222060d010b200441011023000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b1084041a410021354101213602402007450d00200510200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e4101213f41012140410921040c050b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021c001200b20046a41003a00002003411c6a2005360200200341186a200636020020032007360214200320083602102003200936020c2003200a360208200341d0006a200341086a2002104c200320032900513703402003200341d0006a41086a290000370047024020032d00502204411a470d00410021c101410121364101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e4101213f41012140410121350c030b20002003290340370001200020043a0000200041086a20032900473700000b41012191030b4101219203410c21040c010b410a21040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e11000102030405060708090a0b0c1e222328280b206420183a0000410121044101210b20602105034002400240024002402004200b470d00200420636a220b2004490dfe0120042063742206200b200b2006491b22654100480dfe012004450d01206420042065102122640d020c2a0b200421650c020b206510222264450d280b2004210b206521040b2064200b6a200541807f72200541ff0071200541077622061b3a0000200b20636a210b2006210520060d000b2065200b6b20604f0d17200b20606a2204200b490df90120654101742205200420042005491b22044100480df9012065450d1520642065200410212264450d180c160b0240201f450d00202010200b200241086a2105200241046a210720a601210b03400240024002400240200728020020052802002204470d00200441016a22062004490dfe0120044101742208200620062008491b22084100480dfe012004450d01200228020020042008102122060d020c270b200228020021060c020b200810222206450d250b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20a6014f0d00200420a6016a22052004490dfa01200b4101742204200520052004491b22044100480dfa01200b450d0c2002280200200b20041021220b450d100c0d0b2002280200210b0c0d0b20a001208701460da101034020a00141186a2d00004104460da20120a00141106a280200210420a001410c6a280200210b024020a00141046a280200450d0020a00128020010200b02402004450d00200b10200b20a00141286a22a001208701470d000ca2010b0b20bf0120b101460d9f01034020bf01410c6a2802004104460da001024020bf0141046a280200450d0020bf0128020010200b20bf0141146a22bf0120b101470d000ca0010b0b20d10120c201460de401034020d101410d6a2d00004105460de501024020d10141046a280200450d0020d10128020010200b20d10141106a22d10120c201470d000ce5010b0b202a20284104746a210b02400340200b20d201460d0120d201280200210420d20141106a21d20120044108470d000b0b02402029450d00202a10200b200341d0006a41086a280200210a200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490df9012004410174220d20072007200d491b220d4100480df9012004450d0120052802002004200d102122070d020c240b200528020021070c020b200d10222207450d220b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490df501200b4101742204200620062004491b22044100480df501200b450d0d2005280200200b20041021220b450d100c0e0b2005280200210b0c0e0b410121370c98010b4101213d410821040cf1010b4101213e0c070b410121c101410a21040cef010b2000411a3a0000024020012d00002204410e4b0d000240024002400240024002400240024002400240024002400240024020040e0f0009080703050a0b0d0e0c02060401000b2035450dcb01200141086a280200450dcb01200141046a2802001020200341e0006a24000f0b2036450dca010240200141086a280200450d00200141046a28020010200b0240200141146a2802002202450d00200141186a280200450d00200210200b200141246a280200450dca01200141206a2802001020200341e0006a24000f0b2038450dc901410c21e0022001410c6a2802002204450d8301411821e102410421e202200141046a28020022e302200441186c6a21e402411421e502411021e602410921e702410821e80241ffffffff0321e902417021ea02411f214c0c2e0b203e450dc801200141086a280200450dc801200141046a2802001020200341e0006a24000f0b200d450dc701200141046a2d000022044102460d1f20044101460d1e20040d202001410c6a280200450dc701200141086a2802001020200341e0006a24000f0b203d450dc601200141086a280200450dc601200141046a2802001020200341e0006a24000f0b2037450dc501410c21eb022001410c6a2802002204450d7c411c21ec02410421ed02200141046a28020022ee022004411c6c6a21ef02410821f002411421f102411021f202410921f30241ffffffff0321f402417021f5024120214c0c290b203f450dc40102402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241286a2102200441586a22040d000b0b200141086a280200450dc401200141046a2802001020200341e0006a24000f0b2040450dc30102402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d00200228020010200b200241106a2102200441706a22040d000b0b200141086a280200450dc301200141046a2802001020200341e0006a24000f0b20c101450dc2010240200141086a280200450d00200141046a28020010200b200141146a280200450dc201200141106a2802001020200341e0006a24000f0b203c450dc101200141086a280200450dc101200141046a2802001020200341e0006a24000f0b203b450dc0012001410c6a2802002204450d74410421f602200141046a28020022f70220044104746a21f802411021f902410921fa02410821fb0241ffffffff0321fc02417021fd024121214c0c230b2039450dbf01410c21fe022001410c6a2802002204450d70411c21ff024104218003200141046a2802002281032004411c6c6a218203410821830341142184034110218503410921860341ffffffff0321870341702188034122214c0c210b203a450dbe0102402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d00200228020010200b200241146a21022004416c6a22040d000b0b200141086a280200450dbe01200141046a2802001020200341e0006a24000f0b2001104d0cbd010b02402030450d00203110200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490df4012004410174220d20072007200d491b220d4100480df4012004450d0120052802002004200d102122070d020c200b200528020021070c020b200d10222207450d1e0b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490df001200b4101742204200620062004491b22044100480df001200b450d0f2005280200200b20041021220b450d120c100b2005280200210b0c100b410121050c630b20041022220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420a6016a360200200b20046a20a80120a6011084041a4100213e41012136024020a701450d0020a80110200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d0b4101213f0c94010b200441011023000b20041022220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a0240200a450d00200910200b4101210d41002136202c450d21202e450d20202b450d1f202c10200c220b200441011023000b200410222264450d020b200421650b2064200b6a205e20601084041a0240205f450d00205e10200b200b20606a216602400240024020194102460d00024020194101460d0020190d02205c20164572450d030c710b205d450d702014450d6f2014410c6c210b201621040340024020042802002205450d00200441046a280200450d00200510200b2004410c6a2104200b41746a220b0d000c700b0b2061450d6f2014450d6e410421d902201620144104746a21da02411021db02410c21dc02410821dd02417421de02201621df02411e214c0c170b2062201645720d6e0b201710200c6d0b200441011023000b20041022220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b4100213b410121364101210d4101213741012138410121394101213a0cd8010b200441011023000b200041086a20bc03370200200041046a20bd03360200200020be0341087420d80272360200205b10200c680b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b10200b2002410c6a2102200441746a22040d000b0b200141106a280200450da8012001410c6a2802001020200341e0006a24000f0b200141146a2802002204450d46410c21e8032001410c6a28020022e90320044104746a21ea03411021eb03410821ec03410421ed03417421ee034123214c0c080b2001410c6a280200450da601200141086a2802001020200341e0006a24000f0b411021ef03410c21f003417421f103410421f203411c214c0c0c0b2015450d67201610200c670b200841011023000b200d41011023000b206541011023000b200d41011023000b024002400240024002400240024002400240024002400240204c0e260100037e556c0504077b5008090a0bb901ba015a59ac01ad018b017a4f4e4d4c7948476764615e5b494645450b200328025421040c010b204920416a22042049490ddb012049204174220b20042004200b491b220b2043480ddb01024002402049450d0020032802542049200b102122040d010c350b200b10222204450d340b200341d0006a20426a200b360200200320043602542044280200214a0b2044204a20416a3602002004204a6a204b204872204b204771204b20467622041b3a000002402004450d002004214b200341d0006a20426a28020022492044280200224a470d224100214c0c140b200e450d7c411c214d4118214e4114214f410821504107215141ff00215241807f2153200341dc006a21544101215541002156411a2157201021584102214c0c120b2058204d6a21592058280204220a450d7c2058204e6a28020021082058204f6a2802002125205820506a290200212d2058280200210b2058280210210903400240024002400240200341d0006a20506a220528020020542802002204470d00200420556a22062004490dde0120042055742207200620062007491b22072056480dde012004450d01200328025420042007102122060d020c3f0b200328025421060c020b200710222206450d3d0b2005200736020020032006360254205428020021040b2054200420556a360200200620046a200b205372200b205271200b20517622041b3a00002004210b20040d000b2003202d3702442003200a360240200341086a200341c0006a200341d0006a101e20032d0008225a2057470d522008210b03400240024002400240200528020020542802002204470d00200420556a22062004490dde0120042055742207200620062007491b22072056480dde012004450d01200328025420042007102122060d020c3d0b200328025421060c020b200710222206450d3b0b2005200736020020032006360254205428020021040b2054200420556a360200200620046a200b205372200b205271200b20517622041b3a00002004210b20040d000b02400240024002402005280200220b205428020022046b20084f0d00200420086a22062004490ddd01200b2055742204200620062004491b22042056480ddd01200b450d012003280254200b20041021220b0d020c2e0b2003280254210b0c020b20041022220b450d2c0b200520043602002003200b360254205428020021040b2054200420086a360200200b20046a200920081084041a02402025450d00200910200b2059215820592045470d1f0c7d0b200328025421040c010b206f20676a2204206f490dd801206f206774220b20042004200b491b220b2069480dd80102400240206f450d002003280254206f200b102122040d010c300b200b10222204450d2f0b200341d0006a20686a200b36020020032004360254206a28020021700b206a207020676a360200200420706a2071206e722071206d712071206c7622041b3a000002402004450d0020042171200341d0006a20686a280200226f206a2802002270470d1c4106214c0c0e0b201a450d75411c21724118217341142174410821754107217641ff00217741807f2178200341dc006a21794101217a4100217b411a217c4102217d4104217e201c217f4108214c0c0c0b207f20726a218001207f2802042208450d75207f20736a2802002107207f20746a280200218101207f20756a290200212d207f280210218201207f280200210b03400240024002400240200341d0006a20756a22830128020020792802002204470d002004207a6a22052004490ddb012004207a742206200520052006491b2206207b480ddb012004450d01200328025420042006102122050d020c3a0b200328025421050c020b200610222205450d380b208301200636020020032005360254207928020021040b20792004207a6a360200200520046a200b207872200b207771200b20767622041b3a00002004210b20040d000b2003202d37024420032008360240200341086a200341c0006a200341d0006a101e20032d0008228401207c470d492082012007207d746a2185012007210b0340024002400240024020830128020020792802002204470d002004207a6a22052004490ddb012004207a742206200520052006491b2206207b480ddb012004450d01200328025420042006102122050d020c380b200328025421050c020b200610222205450d360b208301200636020020032005360254207928020021040b20792004207a6a360200200520046a200b207872200b207771200b20767622041b3a00002004210b20040d000b2007450dcc01208201218601410021040c84010b20a0012204208b016a21a00120042d00182226208c01460d142004208d016a280000210a2004208e016a28000021122004208f016a280000210620042090016a2d000021a10120042091016a2c000021a20120042092016a280200212520042093016a28020021a301200428020c2113200428020421a40120042802002111410121092088014101742107208801210b2004280208222721050340200921040240200b208901470d00200b2097016a2208200b490dd7012007200820082007491b228901209801480dd7010240200b450d00208a01200b2089011021228a010d010c3d0b2089011022228a01450d3c0b208a01200b6a20052096017220052095017120052094017622081b3a000020042097016a210920072099016a2107200b2097016a210b2008210520080d000b0240208901200b6b20274f0d00200b20276a2205200b490dd601208901209701742207200520052007491b2205209801480dd60102400240208901450d00208a0120890120051021228a010d010c2d0b20051022228a01450d2c0b20052189010b208a01200b6a201120271084041a024020a401450d00201110200b20880120276a21072098012088016b20276b21092025210b03400240200720046a2205208901470d0020052097016a22082005490dd70120052097017422880120082008208801491b228901209801480dd701024020092004470d002089011022228a010d010c3c0b208a0120052089011021228a01450d3b0b208a0120076a20046a200b20960172200b20950171200b2094017622051b3a000020042097016a21042005210b20050d000b02400240024020092089016a20046b20254f0d00200720046a220520256a220b2005490dd801208901209701742205200b200b2005491b220b209801480dd801208901450d01208a01208901200b1021228a010d020c2c0b208901210b0c010b200b1022228a01450d2a0b208a0120076a20046a201320251084041a200720256a2205200b6b2107024020a301450d00201310200b200520046a2105200720046a210402400240024002400240024002400240024002400240024002400240024002400240024002402026209701460d0002402026209901460d002026209b01470d022004450d05200b21060c0f0b2004450d02200b21040c080b2004450d02200b21070c0a0b2004450d03200b2189010c0f0b200b2097016a2204200b490de501200b209701742205200420042005491b2204209801480de501200b450d03208a01200b20041021228a010d040c2f0b200b2097016a2204200b490de401200b209701742205200420042005491b2207209801480de401200b450d05208a01200b20071021228a010d060c2d0b200b2097016a2204200b490de301200b209701742205200420042005491b2206209801480de301200b450d07208a01200b20061021228a010d080c2b0b200b2097016a2204200b490de201200b209701742205200420042005491b228901209801480de201200b450d09208a01200b2089011021228a010d0a0c290b20041022228a01450d2b0b200b21050b208a0120056a2099013a00000240024002400240200420052097016a220b470d0020042097016a220b2004490de3012004209701742205200b200b2005491b228901209801480de3012004450d01208a0120042089011021228a010d020c320b20042189010c020b2089011022228a01450d300b2004210b0b208a01200b6a2012209701463a0000200b2097016a218801200b209701742204208c016a210720042099016a210b0340200721040240208801208901470d002088012097016a2205208801490de101200b20052005200b491b228901209801480de1010240208801450d00208a012088012089011021228a010d010c3e0b2089011022228a01450d3d0b208a012088016a20062096017220062095017120062094017622051b3a000020042099016a2107200b2099016a210b2088012097016a2188012005210620050d000b2012209701470d0903400240208801208901470d002088012097016a220b208801490de1012004200b200b2004491b228901209801480de1010240208801450d00208a012088012089011021228a010d010c3b0b2089011022228a01450d3a0b208a012088016a200a20960172200a20950171200a20940176220b1b3a000020042099016a21042088012097016a218801200b210a200b0d000c0a0b0b20071022228a01450d270b200b21050b208a0120056a2097013a00000240024002400240200720052097016a220b470d0020072097016a22042007490de001200720970174220b20042004200b491b2204209801480de0012007450d01208a01200720041021228a010d020c2e0b200721040c020b20041022228a01450d2c0b2007210b0b208a01200b6a209a013a000002400240024002402004200b2097016a220b470d0020042097016a220b2004490de0012004209701742205200b200b2005491b228901209801480de0012004450d01208a0120042089011021228a010d020c2d0b20042189010c020b2089011022228a01450d2b0b2004210b0b208a01200b6a2012209701463a0000200b2097016a218801200b209701742204208c016a210720042099016a210b0340200721040240208801208901470d002088012097016a2205208801490dde01200b20052005200b491b228901209801480dde010240208801450d00208a012088012089011021228a010d010c3a0b2089011022228a01450d390b208a012088016a20062096017220062095017120062094017622051b3a000020042099016a2107200b2099016a210b2088012097016a2188012005210620050d000b2012209701470d0603400240208801208901470d002088012097016a220b208801490dde012004200b200b2004491b228901209801480dde010240208801450d00208a012088012089011021228a010d010c370b2089011022228a01450d360b208a012088016a200a20960172200a20950171200a20940176220b1b3a000020042099016a21042088012097016a218801200b210a200b0d000c070b0b20061022228a01450d230b200b21050b208a0120056a209b013a00000240024002400240200620052097016a220b470d0020062097016a22042006490ddd01200620970174220b20042004200b491b2204209801480ddd012006450d01208a01200620041021228a010d020c290b200621040c020b20041022228a01450d270b2006210b0b208a01200b6a20a201209c01732205209d0171209e0172200520a201209c014a1b3a000002400240024002402004200b2097016a220b470d0020042097016a220b2004490ddd012004209701742205200b200b2005491b228901209801480ddd012004450d01208a0120042089011021228a010d020c280b20042189010c020b2089011022228a01450d260b2004210b0b208a01200b6a20a101209f0171209801473a0000200b2097016a21880120a001208701470d1b0c82010b2089011022228a01450d1f0b200b21050b208a0120056a2098013a000020052097016a2188012005209701742099016a210403400240208801208901470d002088012097016a220b208801490dd8012004200b200b2004491b228901209801480dd8010240208801450d00208a012088012089011021228a010d010c330b2089011022228a01450d320b208a012088016a200620960172200620950171200620940176220b1b3a000020042099016a21042088012097016a218801200b2106200b0d000b0b20a001208701470d180c7e0b20a60120a90174210b20b00128020021040340024020a60120a701470d0020a60120a9016a220520a601490dd601200b20052005200b491b22a70120ad01480dd601024020a601450d0020a80120a60120a701102122a8010d010c3d0b20a701102222a801450d3c0b20a80120a6016a200420ac0172200420ab0171200420aa017622051b3a0000200b20ae016a210b20a60120a9016a21a6012005210420050d000b20b00120af016a22b00120a501470d15410121040cd2010b20be0120b5016a21bf0120be0128020c220920b601460d1120be01280204210a20be01280200210820b20120b70174210520be0120b8016a280200210420be012802082207210b0340024020b20120b301470d0020b20120b7016a220620b201490dd5012005200620062005491b22b30120bc01480dd501024020b201450d0020b40120b20120b301102122b4010d010c390b20b301102222b401450d380b20b40120b2016a200b20bb0172200b20ba0171200b20b9017622061b3a0000200520bd016a210520b20120b7016a21b2012006210b20060d000b02400240024020b30120b2016b20074f0d0020b20120076a220b20b201490dd60120b30120b701742205200b200b2005491b220b20bc01480dd60120b301450d0120b40120b301200b102122b4010d020c290b20b301210b0c010b200b102222b401450d270b20b40120b2016a200820071084041a2007200b6b20b2016a21050240200a450d00200810200b024002402005450d00200720b2016a2105200b21b3010c010b200b20b7016a2205200b490dd401200b20b701742206200520052006491b22b30120bc01480dd40102400240200b450d0020b401200b20b301102122b4010d010c270b20b301102222b401450d260b200b21050b20b40120056a20093a0000200520b7016a21b201200520b7017420bd016a210b0340024020b20120b301470d0020b20120b7016a220520b201490dd501200b20052005200b491b22b30120bc01480dd501024020b201450d0020b40120b20120b301102122b4010d010c380b20b301102222b401450d370b20b40120b2016a200420bb0172200420ba0171200420b9017622051b3a0000200b20bd016a210b20b20120b7016a21b2012005210420050d000b20bf0121be0120bf0120b101470d130c7b0b20d00120c6016a21d10120d0012d000d222520c701460d0f20d0012d000c210420d001280208210920d001280204212720d001280200210a024020c40120c301470d0020c30120c8016a220b20c301490dd30120c30120c801742205200b200b2005491b22c40120c901480dd301024020c301450d0020c50120c30120c401102122c5010d010c260b20c401102222c501450d250b20c50120c3016a20043a000020c30120c8016a210420c30120c80174220b20ca016a2108200b20cb016a21052009210b0340200821070240200420c401470d00200420c8016a22062004490dd4012005200620062005491b22c40120c901480dd40102402004450d0020c501200420c401102122c5010d010c360b20c401102222c501450d350b20c50120046a200b20ce0172200b20cd0171200b20cc017622061b3a0000200720cb016a2108200520cb016a2105200420c8016a21042006210b20060d000b2009450dbc014100210502400340200420056a210b200a20056a2d0000220820cf014b0dbf0141ff00210602400240024002400240024020080e0401000203010b41fe0021060b200b20c401470d030c020b41fd002106200b20c401460d010c020b41fc002106200b20c401470d010b200b20c8016a2208200b490dd5012007200820082007491b22c40120c901480dd5010240200b450d0020c501200b20c401102122c5010d010c030b20c401102222c501450d020b20c50120046a20056a20063a0000200720cb016a21072009200520c8016a2205470d000b200420056a210b20270dbf010cc0010b20c40141011023000b411021040ccf010b411021040cce010b411021040ccd010b411021040ccc010b411021040ccb010b411021040cca010b411021040cc9010b411021040cc8010b411021040cc7010b411021040cc6010b411021040cc5010b410621040cc4010b410621040cc3010b410621040cc2010b410621040cc1010b410421040cc0010b410321040cbf010b410221040cbe010b410d214c411021040cbd010b410c214c411021040cbc010b410b214c411021040cbb010b410b214c411021040cba010b4107214c411021040cb9010b4102214c411021040cb8010b4101214c411021040cb7010b20890141011023000b200641011023000b200741011023000b200441011023000b20890141011023000b200441011023000b20890141011023000b200441011023000b20890141011023000b200441011023000b20b30141011023000b20c40141011023000b200b41011023000b200b41011023000b200541011023000b200b41011023000b200b41011023000b20890141011023000b20890141011023000b20890141011023000b20890141011023000b20890141011023000b200641011023000b200741011023000b200641011023000b200741011023000b20c40141011023000b20b30141011023000b20b30141011023000b20890141011023000b20890141011023000b20a70141011023000b20860422042085046a218604024020042802042206450d0020042802082107024020042087046a2802002204450d0020042087046c210b200621040340024020042802002205450d0020042084046a280200450d00200510200b20042087046a2104200b2088046a220b0d000b0b2007450d00200610200b20860420c702460d274125214c411021040c96010b20fc03220620fe036a21fc03024020062802042204450d000240200620fb036a280200220b450d00200b20fb036c210b0340024020042802002205450d0020042080046a280200450d00200510200b200420fb036a2104200b2081046a220b0d000b0b200620ff036a280200450d0020062080046a28020010200b20fc0320fd03460d5d4124214c411021040c95010b208a02280200220b450d45208a0220f4036a2802002104208a0220f5036a2802002106208a0228020c21050240208a02280204450d00200b10200b02402004450d00200420f60374210b200521040340024020042d000020f703470d00200420f8036a28020020f90371450d00200420f6036a28020010200b200420f5036a2104200b20fa036a220b0d000b0b208a0220f3036a218a0202402006450d00200510200b208a0220e401460d45411d214c411021040c94010b20c802220420ef036a21c802024020042802042206450d00200428020821070240200420f0036a2802002204450d00200420f0036c210b200621040340024020042802002205450d00200420f2036a280200450d00200510200b200420f0036a2104200b20f1036a220b0d000b0b2007450d00200610200b024020c80220c702470d00410f21040c94010b411c214c411021040c93010b20e903220620eb036a21e903024020062802042204450d000240200620e8036a280200220b450d00200b20e8036c210b0340024020042802002205450d00200420ed036a280200450d00200510200b200420e8036a2104200b20ee036a220b0d000b0b200620ec036a280200450d00200620ed036a28020010200b20e90320ea03470d010b200141106a280200450d602001410c6a2802001020200341e0006a24000f0b4123214c411021040c90010b024020e00320dd036a280200220b450d0020e0032802042104200b20df0374210b0340024020042d000020e503470d00200420e2036a28020020e60371450d00200420df036a28020010200b200420e4036a2104200b20e7036a220b0d000b0b024020e00320e2036a280200450d0020e00320df036a28020010200b20e00320de036a2104024020e00320e3036a280200450d0020e00328021010200b200421e003200420e103460d52411a214c411021040c8f010b024020d603280208220b450d0020d6032802002104200b20d50374210b0340024020042d000020d903470d00200420da036a28020020db0371450d00200420d5036a28020010200b200420d8036a2104200b20dc036a220b0d000b0b20d60320d8036a2104024020d60320d5036a280200450d0020d60328020010200b200421d603200420d703460d4f4119214c411021040c8e010b024020cd0320ca036a280200220b450d0020cd032802042104200b20cc0374210b0340024020042d000020d203470d00200420cf036a28020020d30371450d00200420cc036a28020010200b200420d1036a2104200b20d4036a220b0d000b0b024020cd0320cf036a280200450d0020cd0320cc036a28020010200b20cd0320cb036a2104024020cd0320d0036a280200450d0020cd0328021010200b200421cd03200420ce03460d484118214c411021040c8d010b024020c20320c1036a280200450d0020c20328020010200b024020c20320c4036a280200220b450d0020c20328020c2104200b20c10374210b0340024020042d000020c603470d00200420c7036a28020020c80371450d00200420c1036a28020010200b200420c5036a2104200b20c9036a220b0d000b0b20c20320c0036a2104024020c20320c5036a280200450d0020c20320bf036a28020010200b200421c203200420c303460d424117214c411021040c8c010b2080012802042205450d0120800120b4036a280200210620800120b6036a28020021072080012802102108024020800120b5036a2802002204450d00200420b70374210b200521040340024020042d000020b903470d00200420b6036a28020020ba0371450d00200420b7036a28020010200b200420b8036a2104200b20bb036a220b0d000b0b02402007450d00200510200b20800120b3036a21800102402006450d00200810200b208001206b460d01410a214c411021040c8b010b20032d000b21ae0320032f000921af03200341106a29030021b003200328020c21b1030240208101450d0020820110200b411021b203208001206b460d00411c21b303411421b403410c21b503410821b603410421b703411021b803410921b90341ffffffff0321ba03417021bb03410a214c0c020b20ae0320b2037421040240201b450d00201c10200b20af0320047221040240200341d0006a41086a280200450d00200328025410200b200020043b000120002084013a0000200041036a20044110763a0000200041086a20b003370000200041046a20b10336000041002105410121c0014101210c410121910341012192030b410121060c3a0b411021040c87010b20592802042205450d01205920a6036a2802002106205920a8036a2802002107205928021021080240205920a7036a2802002204450d00200420a90374210b200521040340024020042d000020ab03470d00200420a8036a28020020ac0371450d00200420a9036a28020010200b200420aa036a2104200b20ad036a220b0d000b0b02402007450d00200510200b205920a5036a215902402006450d00200810200b20592045460d014104214c411021040c86010b20032d000b21a00320032f000921a103200341106a29030021a203200328020c21a30302402025450d00200910200b411021a40320592045460d00411c21a503411421a603410c21a703410821a803410421a903411021aa03410921ab0341ffffffff0321ac03417021ad034104214c0c010b20a00320a4037421040240200f450d00201010200b20a10320047221040240200341d0006a41086a280200450d00200328025410200b200020043b00012000205a3a0000200041036a20044110763a0000200041086a20a203370000200041046a20a30336000041002107410121c0014101210c4101219103410121920341012105410121060c370b411021040c83010b2098032099036a2d0000209a03460d622098032802042106209803280200210502402098032802082204450d002004209b0374210b200521040340024020042d0000209c03470d002004209d036a280200209e0371450d002004209b036a28020010200b20042097036a2104200b209f036a220b0d000b0b2098032097036a21980302402006450d00200510200b20980320d701460d624112214c411021040c82010b0240024020ad02208a036a2d0000208b03460d0020ad02280204210620ad022802002105024020ad022802082204450d002004208c0374210b200521040340024020042d0000208d03470d002004208e036a280200208f0371450d002004208c036a28020010200b20042089036a2104200b2090036a220b0d000b0b20ad022089036a21ad0202402006450d00200510200b024020ad0220d701470d00410b21040c84010b4111214c0c010b410b21040c82010b411021040c81010b024020810320fe026a280200220b450d002081032802042104200b20800374210b0340024020042d0000208603470d0020042083036a28020020870371450d0020042080036a28020010200b20042085036a2104200b2088036a220b0d000b0b02402081032083036a280200450d002081032080036a28020010200b20810320ff026a210402402081032084036a280200450d0020810328021010200b20042181032004208203470d010b200141086a280200450d4e200141046a2802001020200341e0006a24000f0b4122214c411021040c7e0b024020f702280208220b450d0020f7022802002104200b20f60274210b0340024020042d000020fa02470d00200420fb026a28020020fc0271450d00200420f6026a28020010200b200420f9026a2104200b20fd026a220b0d000b0b20f70220f9026a2104024020f70220f6026a280200450d0020f70228020010200b200421f702200420f802470d010b200141086a280200450d4b200141046a2802001020200341e0006a24000f0b4121214c411021040c7b0b024020ee0220eb026a280200220b450d0020ee022802042104200b20ed0274210b0340024020042d000020f302470d00200420f0026a28020020f40271450d00200420ed026a28020010200b200420f2026a2104200b20f5026a220b0d000b0b024020ee0220f0026a280200450d0020ee0220ed026a28020010200b20ee0220ec026a2104024020ee0220f1026a280200450d0020ee0228021010200b200421ee02200420ef02470d010b200141086a280200450d48200141046a2802001020200341e0006a24000f0b4120214c411021040c780b024020e30220e2026a280200450d0020e30228020010200b024020e30220e5026a280200220b450d0020e30228020c2104200b20e20274210b0340024020042d000020e702470d00200420e8026a28020020e90271450d00200420e2026a28020010200b200420e6026a2104200b20ea026a220b0d000b0b20e30220e1026a2104024020e30220e6026a280200450d0020e30220e0026a28020010200b200421e302200420e402470d010b200141086a280200450d45200141046a2802001020200341e0006a24000f0b411f214c411021040c750b20df02220620db026a21df02024020062802042204450d000240200620dc026a280200220b450d00200b20dc026c210b0340024020042802002205450d00200420d9026a280200450d00200510200b200420dc026a2104200b20de026a220b0d000b0b200620dd026a280200450d00200620d9026a28020010200b20df0220da02470d030b2015450d00201610200b2003411c6a2066360200200341186a20653602002003206436021420034284808080c00037020c2003205b360208200341d0006a200341086a2002104c200320032900513703402003200341d0006a41086a290000370047024020032d00502204411a470d004100210d41012136410621040c730b20002003290340370001200020043a0000200041086a20032900473700000b41002108410121c0014101210c410121910341012192034101210541012106410121070c250b411e214c411021040c700b20d702210502400340200520c9026a28020022080d0120d60220cd026a21d60220ca02200520ce026a2205470d000c0b0b0b200520ce026a21d70220d60220cd026a212520d50220cf026a21d502200520d0026a290200212d2005280200210a200341c0006a20d0026a220928020021042003280244210b034002400240024002402004200b470d00200b20cd026a2206200b490d75200b20cd02742207200620062007491b220720cc02480d75200b450d012003280240200b2007102122060d020c080b200328024021060c020b200710222206450d060b20032007360244200320063602402007210b0b2009200420cd026a2207360200200620046a20d60220d3027220d60220d2027120d60220d1027622061b3a000020072104200621d60220060d000b200341086a20d0026a202d3703002003200836020c2003200a360208200341d0006a200341086a200341c0006a104b024020032d005022d80220d402470d00024020cb022005460d00202521d60220d5020d060b200541106a22c80220c702470d090c080b20032d005321820420032f0051218304200341d0006a20d0026a29030021bc03200328025421bd034104218404201620144104746a41706a2005460d004110218504200541106a218604410c21870441742188044125214c0c0b0b02402015450d00201610200b20d802411a470d010b200341c8006a28020021602003280244215f2003280240215e41022118410021614101215d410021624100215c410121634101102222640d030c700b20820420ce0274210402402003280244450d00200328024010200b20830420047221be030c030b200741011023000b4105214c0c050b410021040c690b410d21040c680b410f21040c670b410e21040c660b410f21040c650b411021040c640b411021040c630b20d201220520b7026a21d2010240024002402005280200220620b802460d00200520b8026a28020021042005280204210b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200620ba026a220620bb024b0d00200520b9026a280200210a024002400240024020060e0700050203010607000b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d0b200520bc026a22082005490dac01200520bc02742209200820082009491b220920bd02480dac012005450d1b200328025420052009102122080d1c0c420b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490dab01200520bc02742209200820082009491b220920bd02480dab012005450d0e200328025420052009102122080d0f0c3d0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490daa01200520bc02742209200820082009491b220920bd02480daa012005450d10200328025420052009102122080d110c3f0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490da901200520bc02742209200820082009491b220920bd02480da9012005450d12200328025420052009102122080d130c3c0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d06200520bc026a22082005490da801200520bc02742209200820082009491b220920bd02480da8012005450d14200328025420052009102122080d150c3c0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d07200520bc026a22082005490da701200520bc02742209200820082009491b220920bd02480da7012005450d19200328025420052009102122080d1a0c3e0b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d07200520bc026a22082005490da601200520bc02742209200820082009491b220920bd02480da6012005450d1b200328025420052009102122080d1c0c360b200341d0006a20b8026a2207280200200341d0006a20b9026a22062802002205470d07200520bc026a22082005490da501200520bc02742209200820082009491b220920bd02480da5012005450d1d200328025420052009102122080d1e0c360b200328025421080c090b200328025421080c0b0b200328025421080c0d0b200328025421080c0f0b200328025421080c110b200328025421080c130b200328025421080c150b200328025421080c170b200910222208450d2e0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c5023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9f01200520bc02742209200820082009491b220920bd02480d9f012005450d01200328025420052009102122080d020c200b200328025421080c020b200910222208450d1e0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9f01200b20bc02742208200520052008491b220820bd02480d9f01200b450d012003280254200b2008102122050d020c2e0b200328025421050c020b200810222205450d2c0b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b200341086a200a200341d0006a102620032d0008220420c302460d150c170b200910222208450d2e0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c2023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9c01200520bc02742209200820082009491b220920bd02480d9c012005450d01200328025420052009102122080d020c1c0b200328025421080c020b200910222208450d1a0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9c01200b20bc02742208200520052008491b220820bd02480d9c01200b450d012003280254200b2008102122050d020c1e0b200328025421050c020b200810222205450d1c0b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b200341086a200a200341d0006a102620032d0008220420c302460d120c150b200910222208450d290b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c4023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9901200520bc02742209200820082009491b220920bd02480d99012005450d01200328025420052009102122080d020c240b200328025421080c020b200910222208450d220b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9901200b20bc02742208200520052008491b220820bd02480d9901200b450d012003280254200b2008102122050d020c250b200328025421050c020b200810222205450d230b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b200341086a200a200341d0006a102620032d0008220420c302460d0f0c100b200910222208450d270b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20bd023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9601200520bc02742209200820082009491b220920bd02480d96012005450d01200328025420052009102122080d020c230b200328025421080c020b200910222208450d210b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9601200b20bc02742208200520052008491b220820bd02480d9601200b450d012003280254200b2008102122050d020c240b200328025421050c020b200810222205450d220b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c0d0b0b200910222208450d260b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20bc023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9301200520bc02742209200820082009491b220920bd02480d93012005450d01200328025420052009102122080d020c160b200328025421080c020b200910222208450d140b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9301200b20bc02742208200520052008491b220820bd02480d9301200b450d012003280254200b2008102122050d020c170b200328025421050c020b200810222205450d150b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c0a0b0b200910222208450d240b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20c1023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d9001200520bc02742209200820082009491b220920bd02480d90012005450d01200328025420052009102122080d020c150b200328025421080c020b200910222208450d130b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d9001200b20bc02742208200520052008491b220820bd02480d9001200b450d012003280254200b2008102122050d020c160b200328025421050c020b200810222205450d140b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c070b0b200910222208450d1a0b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20bb023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d8d01200520bc02742209200820082009491b220920bd02480d8d012005450d01200328025420052009102122080d020c140b200328025421080c020b200910222208450d120b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d8d01200b20bc02742208200520052008491b220820bd02480d8d01200b450d012003280254200b2008102122050d020c150b200328025421050c020b200810222205450d130b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000c040b0b200910222208450d180b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a20be023a000003400240024002400240200728020020062802002205470d00200520bc026a22082005490d8a01200520bc02742209200820082009491b220920bd02480d8a012005450d01200328025420052009102122080d020c130b200328025421080c020b200910222208450d110b2007200936020020032008360254200628020021050b2006200520bc026a360200200820056a200b20c00272200b20bf0271200b20be027622051b3a00002005210b20050d000b0340024002400240024020072802002006280200220b470d00200b20bc026a2205200b490d8a01200b20bc02742208200520052008491b220820bd02480d8a01200b450d012003280254200b2008102122050d020c140b200328025421050c020b200810222205450d120b20072008360200200320053602542006280200210b0b2006200b20bc026a3602002005200b6a200420c00272200420bf0271200420be0276220b1b3a0000200b2104200b0d000b0b20c60220b7026a21c60220d20120b602470d1c20b60221d2010c1d0b20032f000920032d000b411074722106200341106a290300212d0c020b20032f000920032d000b411074722106200341106a290300212d0c010b20032f000920032d000b411074722106200341106a290300212d0b200328020c21072028410474210502400340200520c602460d01202a20c6026a210b20c60241106a21c602200b2802004108470d000b0b02402029450d00202a10200b0240200341d8006a280200450d00200328025410200b0240202c450d00202e450d00202b450d00202c10200b02402004411a470d004101210d410021360c1c0b200020063b0001200020043a0000200041036a20064110763a0000200041086a202d370000200041046a20073600004100210b410121c0014101210c410121910341012192034101210541012106410121074101210820012d00002204410e4d0d340c440b200941011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200941011023000b200841011023000b200841011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b200941011023000b411b214c0c030b410521040c650b410521040c640b410621040c630b411021040c620b208a02280200220b450d35208a0220af026a2802002104208a0220b0026a2802002106208a0228020c21050240208a02280204450d00200b10200b02402004450d00200420b10274210b200521040340024020042d000020b202470d00200420b3026a28020020b40271450d00200420b1026a28020010200b200420b0026a2104200b20b5026a220b0d000b0b208a0220ae026a218a0202402006450d00200510200b208a0220e401460d354116214c411021040c610b2080012802042205450d5920800120a5026a280200210620800120a7026a28020021072080012802102108024020800120a6026a2802002204450d00200420a80274210b200521040340024020042d000020aa02470d00200420a7026a28020020ab0271450d00200420a8026a28020010200b200420a9026a2104200b20ac026a220b0d000b0b02402007450d00200510200b20800120a4026a21800102402006450d00200810200b208001206b460d594109214c411021040c600b201c2180010b208001206b460d57411c21a402411421a502410c21a602410821a702410421a802411021a902410921aa0241ffffffff0321ab02417021ac024109214c411021040c5e0b20592802042205450d022059209c026a28020021062059209e026a28020021072059280210210802402059209d026a2802002204450d002004209f0274210b200521040340024020042d000020a102470d002004209e026a28020020a20271450d002004209f026a28020010200b200420a0026a2104200b20a3026a220b0d000b0b02402007450d00200510200b2059209b026a215902402006450d00200810200b20592045460d024103214c411021040c5d0b201021590b20592045460d00411c219b024114219c02410c219d024108219e024104219f02411021a002410921a10241ffffffff0321a202417021a3024103214c0c040b0240200f450d00201010200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d602004410174220d20072007200d491b220d4100480d602004450d0120052802002004200d102122070d020c070b200528020021070c020b200d10222207450d050b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d5f200b4101742204200620062004491b22044100480d5f200b450d012005280200200b20041021220b450d050c020b2005280200210b0c020b20041022220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b41002137410121364101210d0b410121380c2e0b200441011023000b200d41011023000b411021040c560b02402021450d00202210200b200241086a2105200241046a210720b201210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d5d20044101742208200620062008491b22084100480d5d2004450d01200228020020042008102122060d020c050b200228020021060c020b200810222206450d030b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20b2014f0d00200420b2016a22052004490d5d200b4101742204200520052004491b22044100480d5d200b450d012002280200200b20041021220b450d040c020b2002280200210b0c020b20041022220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420b2016a360200200b20046a20b40120b2011084041a4100213a41012136024020b301450d0020b40110200b4101210d4101213741012138410121390c520b200441011023000b200841011023000b0240201d450d00201e10200b200241086a2105200241046a2107208801210b03400240024002400240200728020020052802002204470d00200441016a22062004490d5b20044101742208200620062008491b22084100480d5b2004450d01200228020020042008102122060d020c070b200228020021060c020b200810222206450d050b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b2088014f0d0020042088016a22052004490d5a200b4101742204200520052004491b22044100480d5a200b450d012002280200200b20041021220b450d050c020b2002280200210b0c020b20041022220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a20042088016a360200200b20046a208a012088011084041a4100213f410121360240208901450d00208a0110200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e0b410121400c440b200441011023000b200841011023000b20890220ed016a218a02208902280200228b02450d2320890220ee016a280200218c0220890220ef016a280200218d0220890228020c218e02208902290204212d4100218f0220f1014100360200200320f201370244208b02202d20f30188a722900220f401746a2191022003200341206a360240202da72192024100219302024041004100460d00410121040c010b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b208601280200210b0340024002400240024020830128020020792802002204470d002004207a6a22052004490d702004207a742206200520052006491b2206207b480d702004450d01200328025420042006102122050d020c0d0b200328025421050c020b200610222205450d0b0b208301200636020020032005360254207928020021040b20792004207a6a360200200520046a200b207872200b207771200b20767622041b3a00002004210b20040d000b208601207e6a228601208501470d130c610b200328024421040c010b208f0220eb016a2204208f02490d68208f0220eb0174220b20042004200b491b220b20f801480d6802400240208f02450d002003280244208f02200b102122040d010c0a0b200b10222204450d090b20fa01200b3602002003200436024420f1012802002193020b20f10120930220eb016a36020020042093026a20900220f7017220900220f6017120900220f5017622041b3a000002402004450d00200421900220fa01280200228f0220f101280200229302470d12410221040c170b209102208b02460d01208b02219402410321040c160b20940220f9016a219502209402290200222d20f30188a722042085027120fb01460d13200420ed017420ed01752107202da7210b0340024002400240024020fa0128020020f1012802002204470d00200420eb016a22052004490d6b200420eb01742206200520052006491b220620f801480d6b2004450d01200328024420042006102122050d020c0a0b200328024421050c020b200610222205450d080b20fa0120063602002003200536024420f10128020021040b20f101200420eb016a360200200520046a200b20f70172200b20f60171200b20f5017622041b3a00002004210b20040d000b024002400240024020fa0128020020f1012802002204470d00200420eb016a220b2004490d6a200420eb01742205200b200b2005491b220520f801480d6a2004450d012003280244200420051021220b0d020c0c0b2003280244210b0c020b20051022220b450d0a0b20fa0120053602002003200b36024420f10128020021040b20f101200420eb016a360200200b20046a20072086027322042087027120880272200420072086024a1b3a0000209502219402209502209102470d11209102209102229502470d140c030b208b02219502410421040c140b209102209502460d01410521040c130b2095022d0004210420950220f9016a219502200420fb01470d0f0b0240209202450d00208b0210200b208e02208c0220fb017422046a2106024002400240024002400240024002400240208c02450d00208e0220ed016a210b200420ff016a2107208e022104034020042d00002105208102200420f4016a2d00003a00002003200420eb016a2f00003b0108200520fe01460d02200341306a2080026a22082081022d00003a0000200320032f01083b0130200420fb016a290200212d200341086a20f0016a200420f0016a28020036020020ec0120032f01303b000020ec012080026a20082d00003a0000200320053a00082003202d37020c200341d0006a200341086a200341c0006a103020032d0050229602208202462205450d05200b20ef016a210b200720ff016a2107200420ef016a22042006470d000c040b0b208e0222042006460d020c010b200420ef016a22042006460d010b03400240024020042d0000220b20fc01460d00200b20fe01470d010c030b200420f9016a28020020fd0171450d00200420fb016a28020010200b200420ef016a22042006470d000b0b0240208d02450d00208e0210200b20fa01280200212520032802442189022003280240210520f101280200220a210b03400240024002400240200520f9016a2208280200200520f0016a22062802002204470d00200420eb016a22072004490d6c200420eb01742209200720072009491b220920f801480d6c2004450d01200520fb016a28020020042009102122070d020c0d0b200520fb016a28020021070c020b200910222207450d0b0b20082009360200200520fb016a2007360200200628020021040b2006200420eb016a360200200720046a200b20f70172200b20f60171200b20f5017622041b3a00002004210b20040d000b02402008280200220b200628020022046b200a4f0d002004200a6a22072004490d68200b20eb01742204200720072004491b220420f801480d68200b450d02200520fb016a280200200b20041021220b0d030c0b0b200520fb016a280200210b0c030b20032d005321970220032f0051219802200341d0006a20f9016a2903002199022003280254219a0202402007450d00034002400240200b2083026a22042d0000220720fc01460d00200720fe01470d010c030b200b28020020fd0171450d00200b2084026a28020010200b200b20ef016a210b200420ef016a2006470d000b0b0240208d02450d00208e0210200b024020fa01280200450d00200328024410200b2005450d03208a02218902208a0220e401470d0b0c390b20041022220b450d080b20082004360200200520fb016a200b360200200628020021040b20062004200a6a360200200b20046a208902200a1084041a02402025450d0020890210200b208a02218902208a0220e401470d070c360b208a0220e401460d12411821f303411421f403411021f503410421f603410921f703410821f80341ffffffff0321f903417021fa03411d214c0c0a0b200641011023000b200641011023000b200b41011023000b200941011023000b200541011023000b200441011023000b4115214c0c010b4115214c0c010b411021040c580b411021040c570b411021040c560b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b20970220ef0174210402402033450d00203410200b20980220047221040240200341206a41086a280200450d00200328022410200b200020043b000120002096023a0000200041036a20044110763a0000200041086a209902370000200041046a209a0236000041002106410121c0014101210c41012191034101219203410121050b410121070b410121080b4101210b20012d00002204410e4b0d100b02400240024020040e0f000b0a0904060c0d11120f02070501000b200141086a280200450d1b200141046a2802001020200341e0006a24000f0b200b450d1a0240200141086a280200450d00200141046a28020010200b0240200141146a2802002202450d00200141186a280200450d00200210200b200141246a280200450d1a200141206a2802001020200341e0006a24000f0b2006450d19410c21bf032001410c6a2802002204450d00411821c003410421c103200141046a28020022c203200441186c6a21c303411421c403411021c503410921c603410821c70341ffffffff0321c803417021c9034117214c0c140b200141086a280200450d18200141046a2802001020200341e0006a24000f0b200141086a280200450d17200141046a2802001020200341e0006a24000f0b2008450d16200141046a2d000022044102460d0e20044101460d0d20040d102001410c6a280200450d16200141086a2802001020200341e0006a24000f0b200c450d15200141086a280200450d15200141046a2802001020200341e0006a24000f0b2007450d14410c21ca032001410c6a2802002204450d00411c21cb03410421cc03200141046a28020022cd032004411c6c6a21ce03410821cf03411421d003411021d103410921d20341ffffffff0321d303417021d4034118214c0c100b200141086a280200450d13200141046a2802001020200341e0006a24000f0b02402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241286a2102200441586a22040d000b0b200141086a280200450d12200141046a2802001020200341e0006a24000f0b02402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d00200228020010200b200241106a2102200441706a22040d000b0b200141086a280200450d11200141046a2802001020200341e0006a24000f0b20c001450d100240200141086a280200450d00200141046a28020010200b200141146a280200450d10200141106a2802001020200341e0006a24000f0b209103450d0f200141086a280200450d0f200141046a2802001020200341e0006a24000f0b209203450d0e2001410c6a2802002204450d00410421d503200141046a28020022d60320044104746a21d703411021d803410921d903410821da0341ffffffff0321db03417021dc034119214c0c0b0b200141086a280200450d0d200141046a2802001020200341e0006a24000f0b2005450d0c410c21dd032001410c6a2802002204450d00411c21de03410421df03200141046a28020022e0032004411c6c6a21e103410821e203411421e303411021e403410921e50341ffffffff0321e603417021e703411a214c0c0a0b200141086a280200450d0b200141046a2802001020200341e0006a24000f0b02402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d00200228020010200b200241146a21022004416c6a22040d000b0b200141086a280200450d0a200141046a2802001020200341e0006a24000f0b2001104d200341e0006a24000f0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b10200b2002410c6a2102200441746a22040d000b0b200141106a280200450d082001410c6a2802001020200341e0006a24000f0b200141146a2802002204450d00410c21fb032001410c6a28020022fc0320044104746a21fd03411021fe03410821ff03410421800441742181044124214c0c060b200141106a280200450d062001410c6a2802001020200341e0006a24000f0b2001410c6a280200450d05200141086a2802001020200341e0006a24000f0b411021040c350b411021040c340b411021040c330b411021040c320b411021040c310b200341e0006a24000f0b20e80120e0016a220420e801490d3020e80120e00174220b20042004200b491b220b20e201480d3002400240024020e801450d00200328022420e801200b102122040d010c020b200b10222204450d010b200341206a20e1016a200b3602002003200436022420e30128020021e9010c020b200b41011023000b200328022421040b20e30120e90120e0016a360200200420e9016a20ea0120e7017220ea0120e6017120ea0120e5017622041b3a000002402004450d00200421ea01200341206a20e1016a28020022e80120e30128020022e901470d064113214c0c070b02402032450d00410121eb01200341086a41017221ec01411821ed01411421ee01411021ef01410c21f001200341c0006a410c6a21f101420121f201422021f301410321f401410721f50141ff0021f60141807f21f701410021f801410821f901200341c0006a41086a21fa01410421fb01410921fc0141ffffffff0321fd0141ac0121fe01417021ff014102218002200341086a41026a218102411a2182024178218302417c21840241ff01218502417f218602413f21870241c00021880220342189024115214c0c090b2034218a020b208a0220e401460d00411821ae02411421af02411021b002410421b102410921b202410821b30241ffffffff0321b402417021b5024116214c0c080b02402033450d00203410200b200341206a41086a2802002137200328022421092003280220220541046a21082003412c6a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d312004410174220d20072007200d491b220d4100480d312004450d0120052802002004200d102122070d020c070b200528020021070c020b200d10222207450d050b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d30200b4101742204200620062004491b22044100480d30200b450d012005280200200b20041021220b450d050c020b2005280200210b0c020b20041022220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b41002138410121364101210d410121370b410121390c240b200441011023000b200d41011023000b4114214c0c010b411021040c260b411021040c250b411021040c240b411021040c230b20db0120d3016a220420db01490d2420db0120d30174220b20042004200b491b220b20d501480d2402400240024020db01450d00200328025420db01200b102122040d010c020b200b10222204450d010b200341d0006a20d4016a200b3602002003200436025420d60128020021dc010c020b200b41011023000b200328025421040b20d60120dc0120d3016a360200200420dc016a20dd0120da017220dd0120d9017120dd0120d8017622041b3a000002402004450d00200421dd01200341d0006a20d4016a28020022db0120d60128020022dc01470d04410f214c0c090b0240024002400240202f450d00202f41047441706a2109411021de01203121040340200341086a41086a2208200441086a280200360200200320042902003703082004410d6a2d0000220a4102460d022004410c6a2d000021df01200341306a41086a220b200828020036020020032003290308370330200341206a41086a2225200b280200360200200320032903303703200240024002400240200341d0006a41086a2206280200200341d0006a410c6a2205280200220b470d00200b41016a2207200b490d2b200b4101742227200720072027491b22274100480d2b200b450d012003280254200b2027102122070d020c0a0b200328025421070c020b202710222207450d080b20062027360200200320073602542005280200210b0b2005200b41016a3602002007200b6a41fdf9ff7720df0141037441187141107376413f7141c000723a0000024002400240024020062802002005280200220b470d00200b41016a2207200b490d2b200b41017422df012007200720df01491b22df014100480d2b200b450d012003280254200b20df01102122070d020c0b0b200328025421070c020b20df0110222207450d090b200620df01360200200320073602542005280200210b0b2005200b41016a3602002007200b6a200a4100473a0000200341c0006a41086a202528020036020020032003290320370340200341086a200341c0006a200341d0006a101e20032d000822df01411a470d04200941706a2109200441106a220420d701470d000c090b0b203122ad0220d701470d010c080b200441106a22ad0220d701460d080b4110218903410d218a034102218b034104218c034109218d034108218e0341ffffffff03218f0341702190034111214c0c0b0b20032d000b21930320032f00092194032008290300219503200328020c2196032009450d004110219703200441106a219803410d2199034102219a034104219b034109219c034108219d0341ffffffff03219e034170219f034112214c0c0b0b20930320de0174210402402030450d00203110200b20940320047221040240200341d0006a41086a280200450d00200328025410200b200020043b0001200020df013a0000200041036a20044110763a0000200041086a209503370000200041046a2096033600004100219203410121c0014101210c41012191030c060b202741011023000b20df0141011023000b4110214c0c050b410b21040c1b0b410b21040c1a0b410b21040c190b410c21040c180b411021040c170b411021040c160b411021040c150b411021040c140b2004210b0b2027450d010b200a10200b024002400240024002400240202520ca01470d0020c401200b470d02200b20c8016a2204200b490d18200b20c801742205200420042005491b22c40120c901480d18200b450d0120c501200b20c401102122c5010d020c0a0b024020c401200b470d00200b20c8016a2204200b490d18200b20c801742205200420042005491b220420c901480d18200b450d0320c501200b2004102122c5010d040c0b0b20c40121040c030b20c401102222c501450d080b20c501200b6a20c9013a00000c020b2004102222c501450d070b20c501200b6a20c8013a000002400240024002402004200b20c8016a220b470d00200420c8016a220b2004490d17200420c801742205200b200b2005491b22c40120c901480d172004450d0120c501200420c401102122c5010d020c0b0b200421c4010c020b20c401102222c501450d090b2004210b0b20c501200b6a202520cc017120cd01733a00000b200b20c8016a21c30120d10121d00120d10120c201470d070b02402023450d00202410200b200241086a2105200241046a210720c301210b03400240024002400240200728020020052802002204470d00200441016a22062004490d1620044101742208200620062008491b22084100480d162004450d01200228020020042008102122060d020c070b200228020021060c020b200810222206450d050b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b20c3014f0d00200420c3016a22052004490d15200b4101742204200520052004491b22044100480d15200b450d012002280200200b20041021220b450d050c020b2002280200210b0c020b20041022220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420c3016a360200200b20046a20c50120c3011084041a4100214041012136024020c401450d0020c50110200b4101210d4101213741012138410121394101213a4101213b4101213c4101213d4101213e4101213f0b41012135410921040c0e0b200441011023000b200841011023000b20c40141011023000b200441011023000b20c40141011023000b410e214c411021040c080b0240208101450d0020820110200b208001217f208001206b470d060b0240201b450d00201c10200b200341d0006a41086a2802002137200328025421092003280250220541046a2108200341dc006a2802002236210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d0d2004410174220d20072007200d491b220d4100480d0d2004450d0120052802002004200d102122070d020c090b200528020021070c020b200d10222207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20364f0d00200420366a22062004490d0c200b4101742204200620062004491b22044100480d0c200b450d012005280200200b20041021220b450d070c020b2005280200210b0c020b20041022220b450d050b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420366a360200200b20046a200920361084041a02402037450d00200910200b41002139410121364101210d41012137410121380b4101213a0b4101213b0b4101213c410721040c030b200441011023000b200d41011023000b4108214c411021040c000b0b1024000b1024000b410141011023000bdf0401077f200441046a210502400240024002400240024002400240200441086a2802002004410c6a2802002206470d00200641016a22072006490d0520064101742208200720072008491b22074100480d052006450d0120052802002006200710212208450d020c030b200528020021080c030b2007102222080d010b200741011023000b200441086a2007360200200441046a20083602002004410c6a28020021060b2004410c6a2207200641016a360200200820066a20024101463a0000200441086a2109200441046a210a03400240024002400240200928020020072802002206470d00200641016a22082006490d052006410174220b20082008200b491b220b4100480d052006450d0120052802002006200b102122080d020c060b200528020021080c020b200b10222208450d040b2009200b360200200a2008360200200728020021060b2007200641016a360200200820066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2101200441086a2108200441046a210b03400240024002400240200828020020012802002206470d00200641016a22072006490d0620064101742209200720072009491b22094100480d062006450d01200528020020062009102122070d020c080b200528020021070c020b200910222207450d060b20082009360200200b2007360200200128020021060b2001200641016a360200200720066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411a3a00000f0b1024000b200b41011023000b200941011023000bfe07030f7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009102122080d020c060b200228020021080c020b200910222208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b200141086a280200210a2001280204220b2107024002402001410c6a280200220c450d00200b21072005450d00200b200c410c6c6a220d41746a210e200241086a210341002107200b210f0340200f210802400340200828020022100d01200741016a2107200d2008410c6a2208470d000c040b0b2008410c6a210f200741016a21112005417f6a2105200841046a290200211203400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001102122090d020c0a0b200228020021090c020b200110222209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2012422088a72213210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001102122090d020c0b0b200228020021090c020b200110222209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20134f0d00200720136a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007102122060d020c0b0b200228020021060c020b200710222206450d090b2002200636020020042007360200200328020021070b2003200720136a360200200620076a201020131084041a02402012a7450d00201010200b0240200e2008460d002011210720050d010b0b2008410c6a21070b2007200b200c410c6c6a2202460d000340024020072802002206450d00200741046a280200450d00200610200b2007410c6a22072002470d000b0b0240200a450d00200b10200b2000411a3a00000f0b1024000b200941011023000b200141011023000b200141011023000b200741011023000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a102122060d010c040b200a10222206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d0020062005200910212206450d010c030b2009102222060d020b200941011023000b200a41011023000b200921050b200620076a200420081084041a02402003450d00200410200b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a10212206450d020c030b200820096a20076a21030c030b200a102222060d010b200a41011023000b200a21050b200620086a20076a200c20091084041a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d012002280200200720041021220b0d020c060b2002280200210b0c020b20041022220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d0120022802002009200710212209450d020c050b200228020021090c050b2007102222090d030b200741011023000b1024000b200441011023000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a200620031084041a02402005450d00200610200b2000411a3a00000240200141106a280200450d00200c10200b0bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a28020010200f0b0240200041086a280200450d00200041046a28020010200b0240200041146a2802002201450d00200041186a280200450d00200110200b200041246a280200450d12200041206a28020010200f0b0240200041086a280200450d00200041046a28020010200b200041146a280200450d11200041106a28020010200f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010200b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a28020010200f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a28020010200f0b200041086a280200450d0e200041046a28020010200f0b200041086a280200450d0d200041046a28020010200f0b200041086a280200450d0c200041046a28020010200f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010200b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a28020010200f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a28020010200f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d00200610200b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a28020010200f0b2000410c6a280200450d06200041086a28020010200f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a28020010200b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d00200428020010200b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a28020010200b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a28020010200b200e200c6a21010240200e20116a280200450d00200e28021010200b2001210e2001200f470d040c0c0b0240201920186a280200450d00201928020010200b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a28020010200b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a28020010200b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a28020010200b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a28020010200b202420226a21010240202420276a280200450d00202428021010200b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d00203410200b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a28020010200b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a28020010200c040b200041086a280200450d03200041046a28020010200f0b200041086a280200450d02200041046a28020010200f0b200041086a280200450d01200041046a28020010200f0b200041086a280200450d00200041046a28020010200f0b0bacdc012b067f017e017f017e027f017e027f017e227f027e037f017e0f7f027e0a7f017e257f027e187f027e057f017e127f027e227f027e167f017e077f027e027f017e017f017e197f017e147f017e0b7f017e0b7f017e1c7f230041e080046b22022400024002402001280204220320012802082204470d00200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022802cc8004210120022802c88004210420004101360200200041003a00042001450d01200410200c010b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d01200128020020046a2d00002104200141086a2005360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b200241386a2001104f41012106200228023c210720022802384101470d1220074108762101200241c8006a2802002104200241386a41086a29030021080caf010b200241386a2001105020022802384101470d0b200228023c22014108762109200241386a41086a290300220a4220882108200241c8006a280200210b0cc2010b200241386a2001105020022802384101470d0b200228023c22044108762103200241386a41086a2903002208422088210a200241c8006a28020021010cbf010b200241386a2001105020022802384101470d0b200228023c2201410876210c200241386a41086a290300220d4220882108200241c8006a280200210e0cbc010b200241386a2001105020022802384101470d0b200228023c22014108762104200241386a41086a2903002208422088210a200241c8006a28020021030cb9010b200241386a2001105020022802384101470d0b200228023c22014108762103200241386a41086a2903002208422088210a200241c8006a28020021040cb6010b200241386a2001105020022802384101470d0b200228023c22014108762104200241386a41086a2903002208422088210a200241c8006a28020021030cb3010b200241386a2001105020022802384101470d0c200228023c22014108762104200241386a41086a2903002208422088210a200241c8006a28020021030cb0010b200241386a2001105020022802384101470d0c200228023c22044108762103200241386a41086a2903002208422088210a200241c8006a28020021010cad010b200241386a2001105020022802384101470d0c200228023c220f4108762101200241386a41086a29030022104220882108200241c8006a28020021110caa010b200241386a2001105020022802384101470d0c200228023c22124108762101200241386a41086a2903002208422088210a200241c8006a28020021130ca7010b200241386a2001105020022802384101470d0c200041013602002000200241386a41047222012902003702042000410c6a200141086a290200370200200241e080046a24000f0b200041123a000420004101360200200041056a20043a0000200241e080046a24000f0b200241306a200241cc006a280200360200200241286a2214200241386a410c6a2902003703002002200229023c37032041002109410021014100211503402001411f4b0d0c20142802002205200241206a410c6a22162802002204460d1b200441016a21032004417f460d5720052003490d58200228022020046a2d0000210420162003360200200441ff00712001411f71742015722115200141076a21012004418001710d000b20014120490d2e20046741686a41ff017141044f0d2e41002109410d21170c0c0b200241d880046a200241cc006a280200360200200241d080046a2201200241c4006a2902003703002002200229023c3703c88004200128020021034100210420022802d48004210120022802c8800421184100211903402004411f4b0d0d20032001460d1b2001417f460d582003200141016a2207490d59201820016a2d0000220541ff00712004411f71742019722119200441076a2104200721012005418001710d000b200241d480046a2007360200024020044120490d00410d211a20056741686a41ff01714104490d1c0b2019450d3641042105200241c880046a410c6a211b4108211c410021064100211d024020032007460d000340200741016a21012007417f460d7420032001490d75201820076a2c00002104201b200136020020044100480d474107211a200441c00071450d48200441807f7222044170470d4a200241386a200241c880046a105120022f003d20022d003f41107472210420022d003c211a20022802384101460d49200241386a410c6a2802002103200241386a41086a2802002118024002400240201d2006470d0020064101742201200641016a220720072001491b2207ad420c7e2208422088a70d8b012008a722014100480d8b012006450d0120052006410c6c2001102122050d020c7d0b200621070c010b200110222205450d7b0b2005201c6a220120033602002001417b6a200441ffffff077122044110763a0000200141796a20043b00002001417c6a2018360200200141786a201a3a0000201d41016a220120194f0d4b201c410c6a211c20022802c880042118200721062001211d200241c880046a41086a2802002203201b2802002207470d000b0b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b200241286a280200210120022802242118200228022021074105211a0c480b200241d880046a200241cc006a280200360200200241d080046a221e200241386a410c6a2902003703002002200229023c3703c88004410021014100211c03402001411f4b0d0d201e2802002205200241c880046a410c6a221f2802002204460d1c200441016a21032004417f460d5920052003490d5a20022802c8800420046a2d00002104201f2003360200200441ff00712001411f7174201c72211c200141076a21012004418001710d000b20014120490d2d20046741686a41ff017141034b0d2d410d21200c0d0b200241d880046a200241cc006a280200360200200241d080046a2221200241386a410c6a2902003703002002200229023c3703c8800441002122410021014100210603402001411f4b0d0e20212802002205200241c880046a410c6a22232802002204460d1d200441016a21032004417f460d5a20052003490d5b20022802c8800420046a2d0000210420232003360200200441ff00712001411f71742006722106200141076a21012004418001710d000b20014120490d2d20046741686a41ff017141044f0d2d410d2101410021230cac010b200241cc006a2802002124200241c8006a2802002101200241c4006a280200211a200241c0006a2802002125200228023c2126410021044100211d03402004411f4b0d0e201a2001460d1d2001417f460d5b201a200141016a2227490d5c202620016a2d0000220341ff00712004411f7174201d72211d200441076a2104202721012003418001710d000b024020044120490d00410d210120036741686a41ff017141034d0d1e0b41042105201d450d364100212841012129411f212a417f212b41ff00212c4107212d418001212e4168212f4120213041ff012131410321324202213342202134410221354100213641002137410021230c790b200241d880046a200241cc006a280200360200200241d080046a2239200241386a410c6a2902003703002002200229023c3703c88004410021014100211b03402001411f4b0d0e20392802002205200241c880046a410c6a22232802002204460d1e200441016a21032004417f460d5c20052003490d5d20022802c8800420046a2d0000210420232003360200200441ff00712001411f7174201b72211b200141076a21012004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d1f0b201b450d364104213a4100213b4101213c410c213d4108213e417f213f41032140411f214141ff002142410721434180012144416821454120214641ff01214742142148422021494114214a41002139410421054100214b4100214c410121230c790b200241386a4100418080011083041a410021184100210502402007450d00200141086a211d200141046a211b410121064100211841002103410021190340201b280200221c201d28020022056b200720196b220441808001200441808001491b2204490d29200520046a221a2005490d68201c201a490d69200241386a200128020020056a20041084041a201d201a3602000240024002400240201820036b20044f0d00200320046a22052003490d87012018410174221a20052005201a491b221a4100480d87012018450d0120062018201a102122060d020c6e0b200420036a21050c020b201a10222206450d6c0b201a21180b200620036a200241386a20041084041a200521032007200420196a22194b0d000b0b200241003602c08004200220053602bc8004200220063602b88004200241386a200241b880046a104f4101211b200228023c210720022802384101470d1320074108762101200241386a41086a2903002208422088a7211a200241c8006a28020021042008a7211d0c9b010b200241cc006a2802002155200241c8006a2802002101200241c4006a2802002107200241c0006a2802002156200228023c215741002123410021044100215803402004411f4b0d0d20072001460d1e2001417f460d5c2007200141016a2259490d5d205720016a2d0000220341ff00712004411f71742058722158200441076a2104205921012003418001710d000b20044120490d2a20036741686a41ff017141044f0d2a410d2101410021070ca2010b200241d880046a200241cc006a280200360200200241d080046a2201200241c4006a2902003703002002200229023c3703c88004200128020021054100210420022802d48004210120022802c8800421184100210303402004411f4b0d0d20052001460d1e2001417f460d5d2005200141016a2207490d5e201820016a2d0000221941ff00712004411f71742003722103200441076a2104200721012019418001710d000b200241d480046a2007360200024020044120490d00410d211820196741686a41ff01714104490d1f0b2003450d35200241386a410c6a211b200241386a41086a21154100211d41002119410021014100211c410421050340200241386a200241c880046a105120022f003d20022d003f411074722104201b280200211a2015280200210620022d003c211820022802384101460d3d200141016a210702402001201c470d00201d20072007201d491b221cad420c7e2208422088a70d81012008a722584100480d810102402001450d00200520192058102122050d010c6d0b205810222205450d6c0b200520196a220120183a0000200141036a20044110763a0000200141016a20043b0000200141086a201a360200200141046a2006360200201d41026a211d2019410c6a21192007210120072003490d000c370b0b200241d880046a200241cc006a280200360200200241d080046a225a200241386a410c6a2902003703002002200229023c3703c88004410021014100212303402001411f4b0d0d205a2802002211200241c880046a410c6a22052802002204460d1f200441016a21032004417f460d5e20112003490d5f20022802c88004222220046a2d0000210420052003360200200441ff00712001411f71742023722123200141076a21012004418001710d000b024020014120490d00410d210f20046741686a41ff017141034d0d200b2023450d36200241c880046a410c6a2150200241386a41086a215b4100215241002153410021514100215a4104214f4104215c41042105024020112003460d000340200341016a21042003417f460d6e20112004490d6f202220036a2c000021012050200436020020014100480d454106210f200141c00071450d46200141807f72224e41ff017141fc01490d4720112004460d48200341026a21032004417f460d7020112003490d71202220046a2d00002101410c210f200241c880046a410c6a20033602004100210302402001450d0020014101470d4b41800221030b200241386a200241c880046a1028200241386a410c6a280200215d205b280200215e200228023c210f20022802384101460d4b205141016a210402402051205a470d002052200420042052491b225aad4204862238422088a70d81012038a722014100480d8101024002402051450d00204f205320011021224f0d010c760b20011022224f450d750b204f215c204f21050b200520536a2201200f3602002001410c6a204d4180807c71204e417f7341ff017172200372224d360200200141086a205d360200200141046a205e360200200420234f0d4c205241026a2152205341106a215320022802c88004212220042151200241c880046a41086a280200221120502802002203470d000b0b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b0c470b200241cc006a280200215f200241c8006a2802002101200241c4006a2802002118200241c0006a2802002160200228023c2161410021044100216203402004411f4b0d0d20182001460d202001417f460d5f2018200141016a2219490d60206120016a2d0000220341ff00712004411f71742062722162200441076a2104201921012003418001710d000b20044120490d2820036741686a41ff017141034b0d28410d21120c0d0b200241cc006a2802002106200241c8006a2802002101200241c4006a2802002103200241c0006a280200211a200228023c2118410021044100210503402004411f4b0d0e20032001460d212001417f460d602003200141016a2219490d61201820016a2d0000220741ff00712004411f71742005722105200441076a2104201921012007418001710d000b024020044120490d00410d210120076741686a41ff01714104490d220b200620194621010240201a450d00201810200b2001450d2a410921040c94010b410f21170b41002163410021640ca8010b200241d480046a2001360200410f211a0c0e0b410f21200b0c0e0b410f2101410021230c9e010b410f21010c0f0b410f21010c100b410f2101410021070c95010b200241d480046a2001360200410f21180c110b410f210f0c120b410f21120b0c120b410f21010c130b2007450d19200241386a41004180081083041a200241c080046a2258280200210420022802bc8004211520022802b8800421624101211b4100211d410021034100211c0340201520046b2007201c6b22014180082001418008491b2201490d1b200420016a22192004490d5620152019490d57200241386a206220046a20011084041a205820193602000240024002400240201d20036b20014f0d00200320016a221a2003490d72201d4101742204201a201a2004491b22044100480d72201d450d01201b201d20041021221b0d020c5c0b200120036a211a0c020b20041022221b450d5a0b2004211d0b201b20036a200241386a20011084041a20192104201a210320072001201c6a221c4b0d000b200241386a201b201a105220022802384101470d2841082107201d450d2b201b10200c87010b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241c880046a200241386a102b20022903c880042208422088a7216320022802d08004210b2008a7216441052117410021090c9a010b200241d480046a2003360200200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b880044105211a0b200241106a41086a2201200241b880046a41086a280200360200200220022903b88004370310200128020021012002280214211820022802102107410021040c96010b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b200241106a41086a200241206a41086a2802003602002002200229032037031041052120200229031021080b2008422088a721652002280218210e2008a721664100210c0c92010b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b20022903202208422088a72122200228022821032008a72123410521010c8f010b200241013a00c88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241c880046a3602082002200241086a360248200241b880046a200241386a102b410521010b200241106a41086a2204200241b880046a41086a280200360200200220022903b880043703102004280200210420022802142103200228021021070c8b010b200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b88004410521010b200241106a41086a2204200241b880046a41086a280200360200200220022903b8800437031020022903102208422088a72107200428020021032008a721190c87010b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022903c880042208422088a7212320022802d0800421032008a72107410521010c84010b200241d480046a2005360200200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b88004410521180b200241106a41086a2201200241b880046a41086a280200360200200220022903b8800437031020022903102208422088a7211a200128020021012008a72106410021040c80010b200241013a0037200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241376a3602082002200241086a360248200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b880044105210f0b200241106a41086a2201200241b880046a41086a280200360200200220022903b8800437031020022903102208422088a7215d200128020021112008a7215e0c7c0b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022802d08004211320022903c880042108410521120b2008422088a721672008a721680c780b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b410521010b2000200136020420004101360200200041086a20022902c88004370200200041106a200241c880046a41086a280200360200201a450d8a0120181020200241e080046a24000f0b200241013a00b88004200241dc80046a41013602002002410136020c200242013702cc8004200241f8cac4003602c880042002200241b880046a3602082002200241086a3602d88004200241206a200241c880046a102b20022802282104200229032021084105210702402018450d00200610200b0c740b2015450d07410021694104216a4101216b411f216c410c216d200241206a410c6a216e4108216f200241206a41086a2170417f217141ff002172410721734180012174416821754120217641ff01217741032178418080042179421c217a4220217b411c217c4110217d4118217e4114217f410421054100211441002116410221230c500b201c450d08410021830141042184014101218501411f218601410c218701200241c880046a410c6a2188014108218901200241c880046a41086a218a01417f218b0141ff00218c014107218d01418001218e014168218f01412021900141ff0121910141032192014105219301421c2194014220219501411c2196014110219701411821980141142199014102219a014202219b01417c219c01410421054100211e4100211f410321230c500b2006450d084104219e014100219f01410121a001410c21a101200241386a410c6a21a201410821a301200241386a41086a21a401417f21a501410321a601411f21a70141ff0021a801410721a90141800121aa01416821ab01412021ac0141ff0121ad01422821ae01422021af01412821b001411c21b101411a21b201411921b301411821b401411421b501411021b601410221b70141c00021b80141807f21b901417021ba0141fc0121bb014100212141042105410021bc01410021bd01410421230c500b2058450d0a410021be01410020076b21bf01410421c001410121c101417f21c20141e00021c301410321c401411f21c50141ff0021c601410721c70141800121c801416821c901412021ca0141ff0121cb01411021cc01410821cd0141c00021ce0141807f21cf0141fb0121d0014180807c21d101420421d201422021d301410221d401410021d50141042105410021d601410021d701410521230c500b2062450d0d200241c1006a21d901410021da01410421db01410121dc01411f21dd01417f21de0141ff0021df01410721e00141800121e101416821e201412021e30141ff0121e4014180800121e501411021e601200241206a41106a21e701410c21e801200241206a410c6a21e901422021ea01410321eb01410221ec01410821ed01200241386a41086a21ee01410621ef01411421f001200241386a41146a21f101420421f201421821f301411821f401417e21f501420321f601410121f701420121f80141f8cac40021f90141c00021fa0141807f21fb0141fb0121fc014180807c21fd0141042105410021fe01410021ff01410621230c500b410021074100211a4100211d0c0f0b200241013a0010200241dc80046a41013602002002410136020c200242013702cc8004200241f8cac4003602c880042002200241106a3602082002200241086a3602d88004200241206a200241c880046a102b20022903202208422088a7211a200228022821042008a7210341052107410021010240201d450d00201b10200b2003211d0c6c0b20024103410220011b3a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b200241c3006a200241d080046a280200360000200220022903c8800437003b200041053a000420004101360200200020022900383700052000410c6a2002413f6a290000370000200241e080046a24000f0b410021144104210541002116410021010c4f0b4100210741042105410021040c130b4100211e410421054100211f410121010c4d0b410021bc0141042105410021010c640b41002136410021370c620b4100214b41042105410021010c600b410021d60141042105410021530c5e0b41042105410021074100211c0b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b2001450d022007ad422086201cad84210a410621040c600b41042105410021044100215a0c450b410021fe0141042105410021ff01410221010c450b20024103410220011b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b20022903202208422088210a200228022821014105210441002103201c450d66200510200c660b201b41087621070b2005200241c080046a2802002203490d37200520036b2204417f4c0d38024002402004450d002004102222010d01200441011023000b410121010b201aad4220862108201dad210a2001200620036a20041084041a2004ad220d422086211002402018450d00200610200b2008200a84210a2010200d8421082007410874201b41ff0171722105410121040c5b0b200241c8006a2802002101201c450d62200510200c620b0c5b0b4118211a0b0c010b20044180feff07714108762103200241c8006a2802002101200241c4006a2802002118200241386a41086a28020021070b2003410874200441ff01717221042006450d69200510200c690b201d41016a21040b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b02402001450d002004ad4220862007ad84210a410521040c540b20024103410220011b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b20022903202208422088210a2002280228210141052104410021032007450d68200510200c680b4118210f0b0c030b204e21010c020b200241013a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b0b200228022821112002280224215d2002280220215e4105210f0b200141ff0171410874200f72210f2051450d3c0c320b200241c8006a280200211120510d310c3b0b205141016a21040c310b417f2005102d000b20052003102e000b417f2003102d000b20032005102e000b417f200141016a102d000b200141016a2003102e000b417f2003102d000b20032005102e000b417f2003102d000b20032005102e000b417f200141016a102d000b200141016a201a102e000b417f2003102d000b20032005102e000b417f200141016a102d000b200141016a2007102e000b417f200141016a102d000b200141016a2005102e000b417f2003102d000b20032011102e000b417f200141016a102d000b200141016a2018102e000b417f200141016a102d000b200141016a2003102e000b2005201a102d000b201a201c102e000b201a41011023000b20042019102d000b20192015102e000b200441011023000b205841041023000b417f2001102d000b20012003102e000b417f2004102d000b20042011102e000b417f2003102d000b20032011102e000b200141041023000b200141041023000b20032005102d000b1031000b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b200520536a21ca02411021cb02410421cc02410921cd02410821ce0241ffffffff0321cf02417021d002410d2123410321010c010b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b02402001450d002004ad422086205aad84210a410721040c1a0b20024103410220011b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b422021920220022903202110200228022821112004450d134104219302200520044104746a21940241102195024109219602410821970241ffffffff0321980241702199022005219a0241082123410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b2002412c6a280200200228023046210102402002280224450d00200228022010200b2001450d032016ad4220862014ad84210a410c21040ce8010b200241d480046a28020020022802d88004462101024020022802cc8004450d0020022802c8800410200b2001450d01201fad422086201ead84210a410a21040ce7010b2019205f46210102402060450d00206110200b2001450d0220ff01ad42208620fe01ad84210a410b21040ce6010b20024103410220011b3a00b88004411421a602200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b422021a7022002290320210d2002280228210e201f450d03411c21a8022005201f411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200521b102410a21230cc3010b20024103410220011b3a00b88004411421b202200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241c880046a200241386a102b422021b30220022903c88004210a20022802d08004210b2016450d04411c21b40220052016411c6c6a21b502410c21b602410821b702410421b802411021b902410921ba0241ffffffff0321bb02417021bc02200521bd02410b21230cc4010b20024103410220011b3a0020411421be02200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b422021bf0220022903c88004210820022802d08004211320ff01450d05411821c002200520ff0141186c6a21c102410421c202411021c302410c21c402410921c502410821c60241ffffffff0321c702417021c802200521c902410c21230cc5010b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020230e0f000102030405060b0d0f1517191d2c2c0b2036222220296a213620272101410021044100210303402004202a4b0d07201a2001460d092001202b460d79201a200120296a2227490d7a202620016a2d00002223202c712004202a717420037221032004202d6a2104202721012023202e710d000b024020042030490d00202367202f6a20317120324d0d4b0b024020372022470d0020222029742201203620362001491b2237ad2033862238203488a70de0012038a722012028480de00102402022450d00200520222035742001102122050d010ca3010b200110222205450da2010b200520222035746a20033602002036201d490db7010cf5010b200241386a200241c880046a10532002280238203c460d2e200241386a203e6a280200214d200228023c214e200241c880046a203e6a2802002204200241c880046a203d6a22232802002203460d2f2003203c6a21012003203f460d9b0120042001490d9c01200241386a203d6a280200214f20022802c88004222220036a2d0000215020232001360200205020404b0d320240024002400240024020500e0400030102000b4100215041002151410021030340205120414b0d2220042001460d272001203f460d920120042001203c6a2252490d9301202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4100215020512046490d0320536720456a204771203a4f0d030c6c0b41002151410021030340205120414b0d1620042001460d242001203f460d930120042001203c6a2252490d9401202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4102215020512046490d0220536720456a204771203a4f0d020c5c0b41002151410021030340205120414b0d1520042001460d242001203f460d8a0120042001203c6a2252490d8b01202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4103215020512046490d0120536720456a204771203a4f0d010c5b0b41002151410021030340205120414b0d1420042001460d212001203f460d870120042001203c6a2252490d8801202220016a2d000021532023205236020020532042712051204171742003722103205120436a21512052210120532044710d000b4101215020512046490d0020536720456a204771203a490d5a0b200241b880046a203e6a2003360200200220503602bc80042002204f3602b8800420022902bc800421380240204b204c470d00204b203c742201204b203c6a220420042001491b2204ad20487e2254204988a70ddf012054a72201203b480ddf0102400240204b450d002005204b204a6c2001102122050d010ca0010b200110222205450d9f010b2004214b0b2005204c204a6c6a2201203837020c2001204f3602082001204d3602042001204e3602002039204a6a2139204c203c6a2201214c2001201b490db7010cf3010b2016224f206b6a2116410021014100212203402001206c4b0d0a20702802002251206e2802002204460d0c2004206b6a210320042071460d7b20512003490d7c200228022020046a2d00002104206e200336020020042072712001206c71742022722122200120736a210120042074710d000b024020012076490d0020046720756a20777120784d0d530b200241386a200241206a10282002280238206b460d55200241386a206d6a280200218001200241386a206f6a280200218101200228023c218201410021044100215303402004206c4b0d1c20702802002251206e2802002203460d1e2003206b6a210120032071460d8b0120512001490d8c012002280220225220036a2d00002103206e200136020020032072712004206c71742053722153200420736a210420032074710d000b024020042076490d0020036720756a207771206a490d5f0b4100214d200241386a410020791083041a024002402053450d004100214d4101215b41002103410021500340205120016b205320506b2204207920042079491b2204490d3b200120046a224e2001490da3012051204e490da401200241386a205220016a20041084041a206e204e3602000240024002400240204d20036b20044f0d00200320046a224e2003490de401204d206b742201204e204e2001491b22012069480de401204d450d01205b204d20011021225b0d020ca9010b200420036a214e0c020b20011022225b450da7010b2001214d0b205b20036a200241386a20041084041a2053200420506a22504d0d02206e28020021012070280200215120022802202152204e21030c000b0b4101215b4100214e0b02402014204f470d002014206b7422012014206b6a220420042001491b2204ad207a7e2238207b88a70dde012038a722012069480dde01024002402014450d0020052014207c6c2001102122050d010ca6010b200110222205450da5010b200421140b2005204f207c6c6a22012022206f7622043b00012001205b3602102001208201360204200120223a0000200120786a2004207d763a00002001207e6a204e3602002001207f6a204d3602002001206d6a2080013602002001206f6a20810136020020162015490db7010cc4010b201f22532085016a211f4100210141002122034020012086014b0d05208a0128020022512088012802002204460d0720042085016a21032004208b01460d7820512003490d7920022802c8800420046a2d0000210420880120033602002004208c01712001208601717420227221222001208d016a21012004208e01710d000b02402001209001490d00200467208f016a209101712092014d0d490b200241386a200241c880046a10282002280238208501460d4b200241386a2087016a2251280200214e200241386a2089016a2250280200215b200228023c214f200241386a200241c880046a102c2002280238228101208501460d4c2050280200218001200228023c214d02400240024020512802002201450d002001209a01742203209a0175228201ad209b0186223820950188a70ddf012038a72201208301480ddf01200110222252450da6012003209c016a219d0120522101204d210403402001200428020036020020012084016a210120042084016a21042003209c016a22030d000b209d01209a01762085016a2104208001450d020c010b41002182014104215241002104208001450d010b204d10200b024020022d003c209301470d00208101450d002051280200450d00205028020010200b0240201e2053470d00201e208501742201201e2085016a220320032001491b2203ad2094017e223820950188a70ddd012038a72201208301480ddd0102400240201e450d002005201e2096016c2001102122050d010ca7010b200110222205450da6010b2003211e0b200520532096016c6a220120222089017622033b0001200120523602102001204f360204200120223a000020012092016a2003209701763a000020012098016a200436020020012099016a20820136020020012087016a204e36020020012089016a205b360200201f201c490db7010cc4010b200241386a200241c880046a105320a201280200212220a401280200215b200228023c218001200228023820a001460d21200241386a200241c880046a105320a20128020021820120a4012802002123200228023c2101200228023820a001460d22200241c880046a20a3016a2802002251200241c880046a20a1016a224d2802002253460d23205320a0016a2104205320a501460d8e0120512004490d8f0120022802c88004224e20536a2d00002103204d20043602004100214f200320a6014b0d2402400240024002400240024020030e0400030102000b4100214f41002103410021530340200320a7014b0d1c20512004460d1d200420a501460d86012051200420a0016a2250490d8701204e20046a2d00002152204d2050360200205220a80171200320a70171742053722153200320a9016a210320502104205220aa01710d000b4100214f0240200320ac01490d0020526720ab016a20ad0171209e01490d5d0b20bc0120bd01460d030c040b200241386a200241c880046a105120a4012903002138200228023c2153200228023820a001460d3e4102214f20bc0120bd01460d020c030b20512004460d3f205320b7016a2150200420a501460da70120512050490da801204e20046a2c00002103204d20503602002003209f01480d40200320b80171450d36200320b90172220320ad017120bb01490d3620512050460d46205320a6016a2104205020a501460da90120512004490daa01200320a501732152204e20506a2d00002103410c2153200241c880046a410c6a20043602004103214f4100215102402003450d00200320a001470d49410121510b20bc0120bd01460d010c020b20512004460d3d205320b7016a2103200420a501460d970120512003490d9801204e20046a2c00002104204d2003360200200420a5014c0d42200420b80171450d36200420b90172220420ba01470d36200241386a200241c880046a105120a4012903002138200228023c2153200228023820a001460d464101214f20bc0120bd01470d010b20bc0120a00174220420bc0120a0016a220320032004491b2203ad20ae017e225420af0188a70ddc012054a72204209f01480ddc010240024020bc01450d00200520bc0120b0016c2004102122050d010c9a010b200410222205450d99010b200321bc010b200520bd0120b0016c6a2204200136020c200420223602082004205b3602042004208001360200200420ac016a2038370200200420b1016a2053360200200420b2016a20513a0000200420b3016a20523a0000200420b4016a204f3a0000200420b5016a208201360200200420b6016a2023360200202120b0016a212120bd0120a0016a220121bd0120012006490db7010cf2010b20072059460d34205920c1016a2101205920c201460d9a0120072001490d9b01205720596a2d0000220420c301470d3620d70120c1016a2153205920c4016a21224100210441002123034020222159200420c5014b0d0d20072001460d0e200120c201460d7c2007200120c1016a2203490d7d205720016a2d0000225120c60171200420c50171742023722123205920c1016a2122200420c7016a210420032101205120c801710d000b0240200420ca01490d0020516720c9016a20cb017120c4014d0d550b41002122024002402023450d0020bf0120036a214f205720036a215b4101214d41002152410021014100214e0340204f20016a450d302059450dab0120072059490dac01205b20016a2c0000220420be01480d3241062150200420ce0171450d33200420cf0172220420cb017120d0014d0d33200120c1016a215102402001204e470d002052205120512052491b224e20be01480dde0102402001450d00204d2001204e1021224d0d010cac010b204e1022224d450dab010b204d20016a200420c201733a0000205220d4016a2152205920c1016a21592051210120512023490d000b200320516a21030c010b4101214d410021514100214e0b204d20cc017620cc0174224f204d20cd017620cb017120cd0174225b72204d20cb0171224d72215241002101034041002104202220c5014b0d2820072003460d2a200320c201460d90012007200320c1016a2259490d9101205720036a2d0000222320c60171202220c50171742001722101202220c7016a212220592103202320c801710d000b0240202220ca01490d0020236720c9016a20cb017120c001490d6b0b024002400240200120c101460d0020010d6e4104210420d60120d701460d010c020b20072059460d6e205920c201460db2012007205920c1016a2201490db301205720596a2c0000220420be01480d6f41062150200420ce0171450d2a200420cf0172220420cb017120d0014d0d2a200420c2017321042001215920d60120d701470d010b20d60120c10174220120d60120c1016a220320032001491b2203ad20d20186223820d30188a70ddb012038a7220120be01480ddb010240024020d601450d00200520d60120c001742001102122050d010cad010b200110222205450dac010b200321d6010b200520d70120c001746a220120d80120d10171200420cb017120cd01747220c3017222d80136020c200120513602082001204e3602042001205b204d72204f7236020020d50120cc016a21d501205321d70120532058490db7010cee010b20ff01224e20dc016a21ff0141002101410021030340200120dd014b0d0a20182019460d0b201920de01460d792018201920dc016a2204490d7a206120196a2d0000222220df0171200120dd0171742003722103200120e0016a210120042119202220e101710d000b0240200120e301490d0020226720e2016a20e4017120db01490d530b41002153200241386a410020e5011083041a024002402003450d00410021504101214d41002151410021520340201820046b200320526b220120e501200120e501491b2201490d21200420016a22192004490d870120182019490d8801200241386a206120046a20011084041a0240024002400240205020516b20014f0d00205120016a22222051490de001205020dc01742204202220222004491b220420da01480de0012050450d01204d205020041021224d0d020c97010b200120516a21220c020b20041022224d450d95010b200421500b204d20516a200241386a20011084041a20192104202221512003200120526a22524b0d000c020b0b4101214d2004211941002150410021220b20e701202236020020e90141003602002002204d36022020022022ad20ea01862050ad8437022441002101410021520340200120dd014b0d2420222053460d25205320de01460d92012022205320dc016a2203490d9301204d20536a2d0000210420e9012003360200200420df0171200120dd0171742052722152200120e0016a210120032153200420e101710d000b0240200120e301490d0020046720e2016a20e4017120eb014d0d650b4100215b024002402052450d004100215041042180014100214d0340204d224f20dc016a214d410021014100212202400240024002400340200120dd014b0d01200241206a20ed016a280200225120e9012802002204460d02200420dc016a2103200420de01460d840120512003490d85012002280220225320046a2d0000211220e9012003360200201220df0171200120dd0171742022722122200120e0016a2101201220e101710d000b02400240200120e301490d0020126720e2016a20e4017120eb014d0d010b0240024020512003470d00200220dc013a00b8800420f10120dc01360200200220f70136020c200241386a20e6016a200241086a360200200220f80137023c200220f9013602382002200241b880046a360208200241c880046a200241386a102b200241c880046a20ed016a28020021800220022802cc800421810220022802c88004218202410521220c010b200420ec016a2101200320de01460db30120512001490db401205320036a2c0000210420e901200136020002400240200420da01480d00200420fa01710d01410621220c020b411821220c010b0240200420fb0172220120e4017120fc014d0d00202220fd01712103202220ed01762104200120de01732101410021510c060b41062122200121040b20820220ed0176218302410121514100210320810221840220800221850220820221010c040b206821012067218402410d21220c020b410f21222068210120672184020c010b200220dc013a00b8800420f10120dc01360200200220f70136020c200241386a20e6016a200241086a360200200220f80137023c200220f9013602382002200241b880046a360208200241c880046a200241386a102b20022903c88004223820ea0188a7218402200241c880046a20ed016a28020021132038a72101410521220b200120ed017621830241012151410021042013218502410021032001216820840221670b2003200420e4017120ed017472202220e4017172211220510d3902402050204f470d00205020dc01742204205020dc016a220320032004491b2204ad20f60186223820ea0188a70ddd012038a7220320da01480ddd01024002402050450d00208001205020eb0174200310212280010d010cb2010b20031022228001450db1010b200421500b208001204f20eb01746a220420013a000420042012360200204d2052490d000c020b0b4104218001410021504100214d0b41012122410821810141002101410021034100219d01034020012104200241386a200241206a1029200228023820dc01460d38200241c880046a20ec016a220120d90120ec016a2d00003a0000200220d9012f00003b01c88004200241386a20e8016a2802002152200241386a20e6016a280200215320f101280200214f0240024020ee012d0000225120ef01470d00202220de016a21220c010b205120f5016a20ec014b0d00202220dc016a22820120224f2186022082012122208602450d580b200241386a20ec016a22820120012d00003a0000200220022f01c880043b013802402003209d01470d00200320dc016a22012003490ddb01205b20012001205b491b229d01ad20f20186223820ea0188a70ddb012038a7220120da01480ddb0102402003450d002081012004200110212281010d010cb0010b20011022228101450daf010b20810120046a220120513a0000200120e8016a204f360200200120ed016a2053360200200120db016a2052360200200120eb016a2082012d00003a0000200120dc016a20022f01383b0000205b20ec016a215b200420e6016a2101200320dc016a210320220d000b20e90128020020e70128020046210102402002280224450d00200228022010200b2001450d6d024020fe01204e470d0020fe0120dc0174220120fe0120dc016a220420042001491b2204ad20f3017e223820ea0188a70dda012038a7220120da01480dda010240024020fe01450d00200520fe0120f4016c2001102122050d010cb1010b200110222205450db0010b200421fe010b2005204e20f4016c6a220120810136020c2001204d360208200120503602042001208001360200200120f0016a2003360200200120e6016a209d0136020020ff012062490db7010cc2010b410f210120370deb010cfe010b410f21200c440b200241013a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022802d08004210420022802cc8004210320022802c880042107410521012037450dfc010ce9010b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b200241b880046a41086a200241206a41086a280200360200200220022903203703b880044105212020022802b8800421660c430b02402091022089026a2802002204450d0020910228020421012004208c027421040340024020012d0000208e02470d002001208a026a280200208f0271450d002001208c026a28020010200b2001208d026a210120042090026a22040d000b0b0240209102208a026a280200450d00209102208c026a28020010200b2091022087026a21010240209102208b026a280200450d0020910228021010200b20012191022001208802470db3010c480b410f21170c490b0240209a022802082204450d00209a02280200210120042093027421040340024020012d0000209602470d0020012097026a28020020980271450d0020012093026a28020010200b20012095026a210120042099026a22040d000b0b209a022095026a21010240209a022093026a280200450d00209a0228020010200b2001219a022001209402470db2010ce4010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241c880046a200241386a102b200241106a41086a200241c880046a41086a280200360200200220022903c8800437031041052117200228021021640c480b024020a502209d026a2802002204450d0020a5022802042101200420a0027421040340024020012d000020a202470d002001209e026a28020020a30271450d00200120a0026a28020010200b200120a1026a2101200420a4026a22040d000b0b024020a502209e026a280200450d0020a50220a0026a28020010200b20a502209b026a2101024020a502209f026a280200450d0020a50228021010200b200121a5022001209c02470db1010c590b410f2112204e0d660c670b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241c880046a200241386a102b20022903c880042238422088a72167200241d080046a28020021132038a7216841052112204e0d650c660b410f21500cdc010b200241013a00c88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241c880046a360208200241b880046a200241386a102b410521500cdb010b410f2101410021500cce010b024020b10220aa026a2802002204450d0020b1022802042101200420ac027421040340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a28020010200b200120ad026a2101200420b0026a22040d000b0b024020b10220ab026a280200450d0020b10220ac026a28020010200b20b10220a8026a2101024020b10220a6026a280200450d0020b10228021010200b200121b102200120a902470dac010b200d20a702882108410521014100210c201e450df401200510200cf4010b024020bd0220b6026a2802002204450d0020bd022802042101200420b8027421040340024020012d000020ba02470d00200120b7026a28020020bb0271450d00200120b8026a28020010200b200120b9026a2101200420bc026a22040d000b0b024020bd0220b7026a280200450d0020bd0220b8026a28020010200b20bd0220b4026a2101024020bd0220b2026a280200450d0020bd0228021010200b200121bd02200120b502470dab010b200a20b30288210841052101410021092014450df601200510200cf6010b024020c90220c2026a280200450d0020c90228020010200b024020c90220be026a2802002204450d0020c90228020c2101200420c2027421040340024020012d000020c502470d00200120c6026a28020020c70271450d00200120c2026a28020010200b200120c3026a2101200420c8026a22040d000b0b20c90220c0026a2101024020c90220c3026a280200450d0020c90220c4026a28020010200b200121c902200120c102470daa010b200820bf0288210a410521124100210120fe01450de201200510200ce2010b410f21530ccc010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b2002290224210820022802202104410521534100214f0ccc010b024020052802082204450d0020052802002101200420cc027421040340024020012d000020cd02470d00200120ce026a28020020cf0271450d00200120cc026a28020010200b200120cb026a2101200420d0026a22040d000b0b200520cb026a21010240200520cc026a280200450d00200528020010200b2001210520ca022001470da7010cc9010b410f21170c430b410f21010cc3010b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241c880046a200241386a102b200241b880046a41086a200241c880046a41086a280200360200200220022903c880043703b880044105211720022802b8800421640c410b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0c100b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0c0f0b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0c0e0b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b2002290224210820022802202119410521010cbe010b200241013a0010200241dc80046a41013602002002410136020c200241d880046a200241086a360200200242013702cc8004200241f8cac4003602c880042002200241106a360208200241b880046a200241c880046a102b20022903b880042238422088a72167200241c080046a28020021132038a72168410521122050450d4f204d1020204e0d510c520b200241c8006a2802002103205b2123208001210120bd010dc6010cc7010b200241c8006a28020021032082012122205b0dc3010cc4010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b2002290224210820022802202104410521534100214f410021510cc1010b410921530c190b410f21120c410b200241013a0037200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241376a360208200241c880046a200241386a102b200241b880046a41086a200241c880046a41086a280200360200200220022903c880043703b88004410521120c400b024020db0220d3026a280200450d0020db0228020010200b024020db0220d4026a2802002204450d0020db0228020c2101200420d3027421040340024020012d000020d702470d00200120d8026a28020020d90271450d00200120d3026a28020010200b200120d5026a2101200420da026a22040d000b0b20db0220d1026a2101024020db0220d5026a280200450d0020db0220d6026a28020010200b200121db02200120d202470d99010c4b0b410f21500b204e0db7010cc2010b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d280046a2f01002103200241d180046a2d00002119200241d080046a2d0000210120022802cc8004212320022802c88004210741052150204e450dc1010cb6010b2002200241c4006a2902003703b88004200241c0006a2802002119200228023c210120022802b88004210720022802bc80042103204c0db3010cb4010b200241013a0010200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241106a360208200241206a200241386a102b0b200229022421082002280220211941052101410021500cb0010b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d080046a280200210120022802cc8004212320022802c88004210741052150204e0d030cbc010b410a21010cae010b411821500b204e450db9010b204d10200cb8010b410621530c0a0b410721070c0c0b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d280046a2f01002103200241d180046a2d00002119200241d080046a2d0000210120022802cc8004212320022802c880042107410521500cb6010b200241013a0010200241dc80046a41013602002002410136020c200241d880046a200241086a360200200242013702cc8004200241f8cac4003602c880042002200241106a360208200241b880046a200241c880046a102b200241c080046a280200210b20022802bc8004216320022802b88004216441052117204d450d27205b10202080010d280c290b411721500cb4010b20830220ed0174200120e4017172216820500d220c2f0b200241c8006a280200218502200241c4006a280200218402200241c0006a2802002168200228023c21122003450d200c1f0b200241b880046a41086a200241c8006a2802003602002053418080807871214f20534180807c71215120534108762103200220383703b8800420022902bc800421080ca2010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b200241286a280200210320022903202138410521070c060b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b4105215320022902242108200228022021040c020b411821530b0b410021510ca5010b411821070b0b200441ff017141087420077221530c99010b200241013a00b88004200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241206a200241386a102b200229022421082002280220210441052153410021510ca1010b200241c8006a28020021030c97010b4100214f0c9f010b410d210120370da7010cba010b410d21200b0b200241c080046a280200210e20022802bc800421654100210c0c020b200228023c2220410876210c200241c8006a280200210e200241c4006a2802002165200241386a41086a280200216620530d030c040b200228023c2120200241386a41106a280200210e200241c4006a2802002165200241386a41086a28020021660240204e450d00204e4104742104204f21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a2101200441706a22040d000b0b2020410876210c205b0d010b2053450d020c010b204f10202053450d010b411c21870220052053411c6c6a218802410c2189024108218a024114218b024104218c024110218d024109218e0241ffffffff03218f0241702190022005219102410721230c7d0b201e450db501200510200cb5010b410d21170b0b200241186a280200210b20022802142163410021090c0e0b200228023c22174108762109200241c8006a280200210b200241c4006a2802002163200241386a41086a2802002164204f0d0f0c100b410d2112204e0d1d0c1e0b410d21500c94010b410d2101410021500c87010b410d21530c8b010b024020514109470d00205341ffffffff0371450d00205210200b4115218402418080c0002168410421122003450d010b20810121010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a2101200441706a22040d000b0b0240209d01450d0020810110200b2050450d0d0b208001102020022802240d0d0c0e0b410d21170b200241c080046a280200210b20022802bc800421630b208001450d010b208001410474210420820121010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010200b200141106a2101200441706a22040d000b0b410021092081010d010b204f450d020c010b2082011020204f450d010b411c219b022005204f411c6c6a219c02410c219d024108219e024114219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200521a502410921230c6b0b2014450da401200510200ca4010b410d21010c780b410d21120b200241106a41086a2201200241b880046a41086a280200360200200220022903b8800437031020012802002185022002280214218402200228021021680b2002280224450d010b200228022010200b208402216720850221130c050b410d2150204e0d750c80010b4104215041a1e5c000210741242123204e0d740c7f0b200241013a0020200241cc006a41013602002002410136020c200241c8006a200241086a3602002002420137023c200241f8cac4003602382002200241206a360208200241c880046a200241386a102b200241d280046a2f01002103200241d180046a2d00002119200241d080046a2d0000210120022802cc8004212320022802c88004210741052150204e0d730c7e0b41182150204e0d720c7d0b200220eb0120ec0120011b3a00b88004200241cc006a41013602002002410136020c200241386a41106a200241086a3602002002420137023c200241f8cac4003602382002200241b880046a360208200241c880046a200241386a102b200241c880046a41086a280200211320022802cc8004216720022802c88004216802402003450d00200441106a2103410021010340024020810120016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010200b2003200141106a2201470d000b0b0240209d01450d0020810110200b4105211220500d010b204e450d020c010b2080011020204e450d010b411821d1022005204e41186c6a21d202410421d302411421d402411021d502410c21d602410921d702410821d80241ffffffff0321d902417021da02200521db02410e21230c650b20fe01450d8301200510200c83010b417f200141016a102d000b200141016a201a102e000b417f2003102d000b20032051102e000b417f2003102d000b20032051102e000b417f201941016a102d000b201941016a2018102e000b417f200141016a102d000b200141016a2007102e000b417f2003102d000b20032051102e000b417f200441016a102d000b200441016a2051102e000b417f200141016a102d000b200141016a2004102e000b417f200141016a102d000b200141016a2004102e000b20042019102d000b20192018102e000b417f2001102d000b20012051102e000b417f200141016a102d000b200141016a2004102e000b417f200141016a102d000b200141016a2004102e000b417f2004102d000b20042051102e000b417f200341016a102d000b200341016a2007102e000b200441011023000b417f205341016a102d000b205341016a2022102e000b417f2003102d000b20032051102e000b200441041023000b417f2001102d000b20012004102e000b200141041023000b417f2001102d000b20012007102e000b200141041023000b2001204e102d000b204e2051102e000b200141011023000b200141041023000b200141041023000b200141041023000b417f2050102d000b20502051102e000b417f2004102d000b20042051102e000b204e41011023000b417f2059102d000b20592007102e000b200141041023000b417f2001102d000b20012051102e000b200341041023000b200141081023000b200141041023000b417f205941016a102d000b205941016a2007102e000b410021230c110b410121230c110b410221230c110b410321230c110b410421230c110b410521230c110b410621230c110b410721230c120b410821230c120b410921230c130b410a21230c140b410b21230c150b410c21230c160b410d21230c160b410e21230c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b1024000b200241106a41086a20033602002053418080807871214f20534180807c7121512053410876210320022038370310200229021421080b2038a721040c070b20504108742001722101200220083703b880042008a721070240204d450d00204e10200b20022802bc80042103204c450d010b2005210403400240200441046a280200450d00200428020010200b200441146a21042039416c6a22390d000b0b204b450d1e200510200c1e0b205210200c0a0b205a450d16205c10200c160b0b41002151410021030b205341ff0171200341ff0171410874722051418080fc077172204f7221072008422088a721032008a7212202402023450d00200110200b2004212320072101205b450d010b20800110200b20bd01450d010b2005210403400240200441046a280200450d00200428020010200b0240200441106a280200450d002004410c6a28020010200b200441286a2104202141586a22210d000b0b20bc01450d19200510200c190b200241106a41086a2201200241b880046a41086a280200360200200220022903b88004370310200128020021012002280214212320022802102107410021040b20014110762103200141087621190b201941ff0171410874200141ff017172211920034110742103200441ff01714108742104024020d701450d002005210103400240200141046a280200450d00200128020010200b200141106a210120d50141706a22d5010d000b0b201920037221032004205072210120d601450d10200510200c100b20102092028821084105210f41002101205a450d0c200510200c0c0b200510200c120b2059205546210102402056450d00205710200b02402001450d002053ad42208620d601ad84210a410221040c040b20024103410220011b3a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022903c88004210820022802d08004210302402053450d00205341047421042005210103400240200141046a280200450d00200128020010200b200141106a2101200441706a22040d000b0b2008422088210a410521014100210420d601450d0e200510200c0e0b200241d480046a28020020022802d88004462104024020022802cc8004450d0020022802c8800410200b02402004450d002001ad422086204bad84210a410821040c030b20024103410220041b3a00b88004200241386a41146a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b200229032021082002280228210302402001450d00200141146c21042005210103400240200141046a280200450d00200128020010200b200141146a21012004416c6a22040d000b0b2008422088210a4105210141002104204b450d0f200510200c0f0b2027202446210102402025450d00202610200b02402001450d002036ad4220862037ad84210a410421040c020b20024103410220011b3a0020200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241206a3602082002200241086a360248200241c880046a200241386a102b20022903c880042208422088210a20022802d08004210441052101410021032037450d10200510200c100b200241d480046a28020020022802d88004462104024020022802cc8004450d0020022802c8800410200b2004450d012001ad42208620bc01ad84210a410321040b200020043a000420004100360200200041056a20022f00c880043b0000200041186a2008370200200041146a20013602002000410c6a200a370200200041086a2005360200200041206a2002290238370200200041076a200241ca80046a2d00003a0000200041286a200241386a41086a290200370200200241e080046a24000f0b20024103410220041b3a00b88004200241cc006a41013602002002410136020c2002420137023c200241f8cac4003602382002200241b880046a3602082002200241086a360248200241206a200241386a102b200229032021082002280228210302402001450d00200141286c21042005210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200441586a22040d000b0b2008422088210a410521014100210420bc01450d0f200510200c0f0b201aad422086201dad8421082018450d00200610200b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff017172360204200241e080046a24000f0b201241087621012067ad220a4220862068ad8421082060450d00206110200b20004101360200200041106a2013360200200041086a200a422086200842ffffffff0f838437020020002001410874201241ff017172360204200241e080046a24000f0b200f4108762101205dad2208422086205ead84211020022802cc8004450d0020022802c8800410200b20004101360200200041106a2011360200200041086a2008422086201042ffffffff0f838437020020002001410874200f41ff017172360204200241e080046a24000f0b200441ffffff07712203410874201841ff0171722104201aad220a4220862006ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241e080046a24000f0b200141087621042023ad220a4220862007ad8421082056450d00205710200b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241e080046a24000f0b200141087621042007ad220a4220862019ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241e080046a24000f0b2003ad220a4220862007ad842108410021032025450d00202610200b20004101360200200041106a2004360200200041086a200a422086200842ffffffff0f838437020020002003410874200141ff017172360204200241e080046a24000f0b200141087621042022ad220a4220862023ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241e080046a24000f0b200c410874202041ff01717221012065ad22084220862066ad84210d20022802cc8004450d0020022802c8800410200b20004101360200200041106a200e360200200041086a2008422086200d42ffffffff0f83843702002000200c410874200141ff017172360204200241e080046a24000f0b200441ffffff07712203410874201a41ff01717221042018ad220a4220862007ad84210820022802cc8004450d0020022802c8800410200b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241e080046a24000f0b2009410874201741ff01717221012063ad22084220862064ad84210a2002280224450d00200228022010200b20004101360200200041106a200b360200200041086a2008422086200a42ffffffff0f838437020020002009410874200141ff017172360204200241e080046a24000f0b200241e080046a24000b940301087f230041c0006b2202240041002103200141086a2104200141046a210541002106024002400240024002400340200341204f0d012005280200220720042802002208460d02200841016a21092008417f460d0420072009490d05200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b20034120490d0220086741686a41ff017141034b0d02200041013602002000410d3a0004200241c0006a24000f0b200041013602002000410f3a0004200241c0006a24000f0b200241013a000f200241346a41013602002002410136023c20024201370224200241f8cac40036022020022002410f6a3602382002200241386a360230200241106a200241206a102b2002412b6a200241186a28020036000020022002290310370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241c0006a24000f0b2000410036020020002006360204200241c0006a24000f0b417f2009102d000b20092007102e000b9d05010c7f230041c080016b22022400200241086a2001104f41012103024020022802084101470d002000200229020c370204200041013602002000410c6a200241086a410c6a290200370200200241c080016a24000f0b200228020c2104200241086a4100418080011083041a41002105410021060240024002400240024002402004450d00200141086a2107200141046a21084100210941002105410121034100210a03402008280200220b200728020022066b2004200a6b220c41808001200c41808001491b220c490d022006200c6a220d2006490d03200b200d490d04200241086a200128020020066a200c1084041a2007200d3602000240024002400240200520096b200c4f0d002009200c6a22062009490d092005410174220d20062006200d491b220d4100480d092005450d0120032005200d102122030d020c0a0b200c20096a21060c020b200d10222203450d080b200d21050b200320096a200241086a200c1084041a200621092004200c200a6a220a4b0d000b0b2000200336020420004100360200200041146a2006360200200041106a41003602002000410c6a2006360200200041086a2005360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241013602bc8001200242013702a48001200241f8cac4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a102b200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a29000037000002402005450d00200310200b200241c080016a24000f0b2006200d102d000b200d200b102e000b1024000b200d41011023000be007010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241013602242002420137022c200241f8cac40036022820022002410f6a3602202002200241206a360238200241106a200241286a102b200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff01714104490d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff01714104490d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241013602242002420137022c200241f8cac4003602282002200241106a3602202002200241206a3602382002200241286a102b410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241013602242002420137022c200241f8cac4003602282002200241106a3602202002200241206a3602382002200241286a102b410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f2004102d000b20042003102e000b417f2006102d000b20062003102e000b417f200441016a102d000b200441016a2003102e000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d0000220641187441187522074100480d002005410371450d01200441016a22042002490d0f0c100b4280808080102108200641b6d5c4006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000bca07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a41004180081083041a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a20031084041a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e20091021220d0d020c100b200320086a21050c020b20091022220d450d0e0b2009210e0b200d20086a200241086a20031084041a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d2005105220022802084101470d050240200e450d00200d10200b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410136028c082002420137020c200241f8cac400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a102b410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410136028c08200242013702ac08200241f8cac4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a102b200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d1020200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f2009102d000b20092007102e000b20092005102d000b20052007102e000b1024000b200941011023000b200241c0086a24000b8f03010e7f230041b0016b22012400200141086a20001033024020012903284202510d00200141e0006a2102200141dc006a2103200141d8006a2104200141a4016a2105200141a0016a21062001419c016a210720014198016a210820014190016a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e2802ec03210e200d417f6a220d0d000b0340200b200b2f01064102746a41ec036a280200210b200c417f6a220c0d000c020b0b200b210e0b20014188016a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36028c01200141003602880120014188016a1042200141086a20001033200141086a41206a2903004202520d000b0b02402000280204220b4180e5c200460d00200b280200210c200b1020200c450d00200c280200210e200c1020200e450d000240200e280200220b450d000340200e1020200b210e200b280200220c210b200c0d000b0b200e10200b200141b0016a24000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010202005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110202005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b024020004180e5c200460d0020002802002101200010202001450d0020012802002104200110202004450d00024020042802002201450d000340200410202001210420012802002200210120000d000b0b200410200b0bb70b05077f017e037f017e017f230041d0016b22022400200241b0016a41186a22034200370300200241b0016a41106a22044200370300200241b0016a41086a22054200370300200242003703b001200241b0016a2001280200220620012802042207412020074120491b22081084041a2001200720086b3602042001200620086a360200024002402007411f4d0d0020024190016a41186a2207200329030037030020024190016a41106a2208200429030037030020024190016a41086a22062005290300370300200220022903b00137039001200241f0006a41186a2007290300370300200241f0006a41106a2008290300370300200241f0006a41086a20062903003703002002200229039001370370410121070c010b410021070b200241b0016a41186a2208200241f0006a41186a290300370300200241b0016a41106a2206200241f0006a41106a290300370300200241b0016a41086a2203200241f0006a41086a290300370300200220022903703703b001024002400240024002402007450d00200241306a41186a2008290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903b0013703302002200110572002290300a7450d0120022903082109200241b0016a41186a22054200370300200241b0016a41106a220a4200370300200241b0016a41086a220b4200370300200242003703b001200241b0016a20012802002204200141046a22032802002207412020074120491b22081084041a2003200720086b22063602002001200420086a22083602002007411f4d0d0220024190016a41186a2207200529030037030020024190016a41106a2204200a29030037030020024190016a41086a2205200b290300370300200220022903b00137039001200241d0006a41186a2007290300370300200241d0006a41106a2004290300370300200241d0006a41086a20052903003703002002200229039001370350200241b0016a2006412020064120491b22076a41004100412020076b2007411f4b1b1083041a200241b0016a200820071084041a2003200620076b3602002001200820076a3602002006411f4d0d0320024190016a41186a2207200241b0016a41186a220329030037030020024190016a41106a2208200241b0016a41106a220429030037030020024190016a41086a2206200241b0016a41086a2205290300370300200220022903b00137039001200241f0006a41186a220a2007290300370300200241f0006a41106a220b2008290300370300200241f0006a41086a220c20062903003703002002200229039001370370200241b0016a2001105820022802b0012201450d0420022902b401210d2003200241306a41186a2903003703002004200241306a41106a2903003703002005200241306a41086a2903003703002006200241d0006a41086a2903003703002008200241d0006a41106a2903003703002007200241d0006a41186a290300370300200241106a41086a220e200c290300370300200241106a41106a220c200b290300370300200241106a41186a220b200a290300370300200220022903303703b0012002200229035037039001200220022903703703102000200d37020c2000200136020820002009370300200041146a20022903b0013702002000411c6a2005290300370200200041246a20042903003702002000412c6a2003290300370200200041346a2002290390013702002000413c6a2006290300370200200041c4006a2008290300370200200041cc006a2007290300370200200041ec006a200b290300370200200041e4006a200c290300370200200041dc006a200e290300370200200041d4006a2002290310370200200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000bb40503057f027e047f230041106b22022400200241003a0000200220012802002203200128020422044100472205108404210202400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00002204ad210702400240200441037122034102460d00024020034101460d0020030d022004410276ad2107420121080c050b200241003a00002002200520064100472204108404210320062004490d07200141046a200620046b3602002001200520046a3602002006450d0220033100004208862007844202882107420121080c040b200241003a000e200241003b010c2002410c6a200520064103200641034922031b22041084041a200141046a200620046b3602002001200520046a36020020030d01200233010c200231000e421086844208862007844202882107420121080c030b02400240200441027622044104460d0020040d01200241003602002002200520064104200641044922031b22041084042109200141046a200620046b3602002001200520046a36020020030d0220093502002107420121080c040b42002108200242003703002002200520064108200641084922031b22041084042109200141046a200620046b3602002001200520046a36020020030d0220092903002107420121080c030b200441046a220a41084b0d0042002107200141046a210b410021030340200241003a00002002200520064100472204108404210920062004490d05200b200620046b220c3602002001200520046a22053602002006450d0120093100002003410374413871ad86200784210742012108200c2106200341016a22042103200441ff0171200a490d000c030b0b420021080b0b2000200737030820002008370300200241106a24000f0b20052004102d000b20042006102d000b20042006102d000be31507027f017e147f017e017f017e097f23004180026b22022400200241106a200110bc01024002400240024002400240024002400240024002402002280210450d0020022802142203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d01200510222206450d032003450d020c040b2000410036020020024180026a24000f0b4108210620030d020b41002116410021130c020b200541081023000b200241c4016a210520024185016a2107200241186a4101722108200141046a2109200241f8016a210a200241c3016a220b41056a210c200241bf016a210d200241b6016a210e200241b0016a41076a210f41002110410021114100211220032113034020092802002114200241003a00b001200241b0016a20012802002215201441004722161084041a0240024002400240024002400240024020142016490d002009201420166b22173602002001201520166a22163602002014450d0a20022d00b001221441044b0d0a0240024002400240024002400240024002400240024020140e050004020301000b2002200110bc012002280200450d1420022802042214417f4c0d182014450d04201410762217450d0b2017200128020020092802002216201420162014491b22161084041a200928020022152016490d0c2009201520166b3602002001200128020020166a36020020162014460d050c090b200241003602b001200241b0016a201620174104201741044922151b22141084041a2009201720146b3602002001201620146a36020020150d1320022802b0012118200241086a200110bc012002280208450d13200228020c2216417f4c0d172016450d06201610762214450d0c2014200128020020092802002217201620172016491b22171084041a200928020022152017490d0d2009201520176b3602002001200128020020176a36020020172016470d070c0e0b200241b0016a2017412020174120491b22146a41004100412020146b2014411f4b1b1083041a200241b0016a201620141084041a2009201720146b3602002001201620146a3602002017411f4d0d122002200b2900003703782002200c29000037007d200d2800002115200241b0016a41046a2f01002114200e2d00002116200f290000210420022802b00121182007411f6a200241b0016a411f6a290000370000200741186a200241b0016a41186a290000370000200741106a200241b0016a41106a290000370000200741086a200241b0016a41086a290000370000200720022900b00137000020044220882119201420164110747221162004a721144101211a0c0e0b200242003703b001200241b0016a20162017410820174108491b22141084041a2009201720146b22153602002001201620146a2216360200201741074d0d1120022903b0012104200241b0016a201541c000201541c000491b22146a4100410041c00020146b2014413f4b1b1083041a200241b0016a201620141084041a2009201520146b3602002001201620146a3602002015413f4d0d11200241f8006a41086a200b41086a290000370300200241f8006a41106a200b41106a290000370300200241f8006a41186a200b41186a290000370300200241f8006a41206a200b41206a290000370300200241f8006a41256a200b41256a2900003700002002200b290000370378200f290000221b4220882119200241b0016a41046a2f0100200e2d0000411074722116200d280000211520022802b0012118201ba721144102211a0c0e0b200241b0016a200110c00120022802b0012214450d1020022902b4012104200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b0013703782004422088211920144108762116201441187421182004a721144100211a0c020b4101211741002014470d040b200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b00137037820174108762116201741187421182014ad21194104211a0b0c090b4101211441002016460d070b2016450d0b201410200c0b0b2014450d0a201710200c0a0b20162014102d000b201441011023000b20162015102d000b201641011023000b20172015102d000b2014450d042016ad22044220862004842219422088a721154103211a0b0b200241c0006a41306a221c200241f8006a41306a280200360200200241c0006a41286a221d200241f8006a41286a290300370300200241c0006a41206a221e200241f8006a41206a290300370300200241c0006a41186a221f200241f8006a41186a2220290300370300200241c0006a41106a2221200241f8006a41106a2222290300370300200241c0006a41086a2223200241f8006a41086a222429030037030020022002290378370340200241b0016a41106a22172015360200200241b0016a41086a221520194220862014ad8437030020052002290340370200200541086a2023290300370200200541106a2021290300370200200541186a201f290300370200200541206a201e290300370200200541286a201d290300370200200541306a201c280200360200200220183600b1012002201a3a00b001200220163b00b501200220164110763a00b701200a2004370300200241186a200241b0016a10bf0120022d00182118200241b0016a411f6a22142008411f6a290000370000200241b0016a41186a221a200841186a2900003703002017200841106a2900003703002015200841086a290000370300200220082900003703b00120184103460d03201241016a2116200241f8006a411f6a221c20142900003700002020201a2903003703002022201729030037030020242015290300370300200220022903b001370378024020122013470d002010201620162010491b2213ad42287e2204422088a70d052004a722144100480d0502402012450d00200620112014102122060d010c070b201410222206450d060b200620116a221420183a0000201441206a201c290000370000201441196a2020290300370000201441116a2022290300370000201441096a2024290300370000201441016a2002290378370000201041026a2110201141286a21112016211220162003490d000b0b2000201336020420002006360200200041086a201636020020024180026a24000f0b200241033a0018200241b0016a411f6a2008411f6a290000370000200241b0016a41186a200841186a290000370300200241b0016a41106a200841106a290000370300200241b0016a41086a200841086a290000370300200220082900003703b0010b2000410036020002402012450d00200621050340024020052d00002208450d00024020084101470d00200541086a280200450d01200541046a2802001020200541286a2105201141586a22110d020c030b200541106a280200450d002005410c6a28020010200b200541286a2105201141586a22110d000b0b02402013450d00200610200b20024180026a24000f0b1024000b201441081023000b1031000b8a0d010a7f23004180026b2202240002400240024002402001412041c8d7c400410041001001417f460d00200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e001410020014120200241e0016a41204100100122062006417f461b220641204922070d03200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e00120014120200241e0016a41012006412020071b2203100141016a41014b2204450d0320022d00e0012105200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c001370300200241003a00e00120014120200241e0016a4101200320046a2203100141016a41014b2204450d03200320046a210320022d00e0012204450d0120044101470d03200241f8016a4200370300200241f0016a4200370300200241e8016a4200370300200242003703e00120014120200241e0016a4120200310012204417f460d032004411f4d0d03200241c0016a41186a2204200241e0016a41186a290300370300200241c0016a41106a2206200241e0016a41106a290300370300200241c0016a41086a2207200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22082004290300370300200241a0016a41106a22042006290300370300200241a0016a41086a22062007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200429030037030020024180016a41086a2006290300370300200220022903a00137038001200341206a2103410121060c020b200041023a002120024180026a24000f0b410021060b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a2903003703002002200229038001370360200241003a00e00120014120200241e0016a41012003100141016a41014b2207450d0041002104024020022d00e0012208450d0020084101470d01200241f8016a4200370300200241f0016a4200370300200241e8016a4200370300200242003703e00120014120200241e0016a4120200320076a10012201417f460d012001411f4d0d01200241c0016a41186a2201200241e0016a41186a290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2204200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121040b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220720024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200241e0016a41186a220b2008290300370300200241e0016a41106a22082009290300370300200241e0016a41086a2209200a290300370300200241c0016a41086a220a2007290300370300200241c0016a41106a22072003290300370300200241c0016a41186a22032001290300370300200220022903403703e001200220022903203703c001200020063a0021200020053a0020200041c2006a20043a0000200020022903e0013700222000412a6a2009290300370000200041326a20082903003700002000413a6a200b290300370000200041c3006a20022903c001370000200041cb006a200a290300370000200041d3006a2007290300370000200041db006a200329030037000020024180026a24000f0b419a88c00041331039000b8b0202037f017e230041206b22022400024002402001411041c8d7c400410041001001417f460d002002411036020420022001360200200242003703102002410020014110200241106a41084100100122032003417f461b2203410820034108491b2204360208200341074d0d012002290310210520024100360210200241086a410020014110200241106a41042004100122012001417f461b22014104200141044922011b20046a36020020010d0120022802102101200241106a2002103820022802102203450d01200020022902143703102000200336020c2000200136020820002005370300200241206a24000f0b2000410036020c200241206a24000f0b419a88c00041331039000bc60401067f230041106b22022400200241003602082002420137030020012002103e200141046a2002103e200141086a2002103e200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d0320022802002004200510212203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d0420022802002004200510212203450d050c060b200228020021030c080b200228020021030c050b2005102222030d050b200541011023000b2005102222030d010b200541011023000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002103e02400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d0120022802002005200710212204450d020c040b200228020021040c040b2007102222040d020b200741011023000b1024000b2002200736020420022004360200200721050b200420036a200620011084041a200041202004200320016a100302402005450d00200410200b200241106a24000bfe0101097f200220006b220341606a2104200341a07f6a2105200341406a21062000200141057422076a210841002101200021090240024002400340200820096b41ff004d0d014101210a20032001460d02200020016a220b20024120108604450d0220042001460d02200b41206a20024120108604450d0220062001460d02200b41c0006a20024120108604450d0220052001460d02200b4180016a210920014180016a2101200b41e0006a200241201086040d000c020b0b200020016a210b200720016b210103402001450d024101210a2002200b460d01200b200241201086042109200141606a2101200b41206a210b20090d000b0b200a0f0b41000bb43401087f230041a0016b220824000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010042209417f460d00410c1022220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041022220b450d03200b200a360200200a280208210c41031022220d450d04200d41026a41002d008cb7443a0000200d41002f008ab7443b000041061022220e450d05200e41046a41002f00e5ad433b0000200e41002800e1ad43360000412010222209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001005200a200a280204417f6a220d360204200d0d00200a10200b41031022220d450d07200d41026a41002d008cb7443a0000200d41002f008ab7443b000041031022220e450d08200e41026a41002d008fb7443a0000200e41002f008db7443b00002009412041c00010212209450d092009410636023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031022220d450d0a200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410f1022220e450d0b200e41076a41002900e0a244370000200e41002900d9a244370000200941c00041800110212209450d0c2009410736025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031022220d450d0d200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410f1022220e450d0e200e41076a41002900efa244370000200e41002900e8a2443700002009410836027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031022220d450d0f200d41026a41002d008cb7443a0000200d41002f008ab7443b000041081022220e450d10200e42e5f0d1fbb5ac98b6ec00370000200941800141800210212209450d112009410936029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031022220d450d12200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410a1022220e450d13200e41086a41002f0087a3443b0000200e41002900ffa2443700002009410a3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031022220d450d14200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410a1022220e450d15200e41086a41002f0091a3443b0000200e4100290089a3443700002009410b3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031022220d450d16200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410a1022220e450d17200e41086a41002f009ba3443b0000200e4100290093a3443700002009410c3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031022220d450d18200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410b1022220e450d19200e41076a41002800a4a344360000200e410029009da344370000200941800241800410212209450d1a2009410d36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031022220d450d1b200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410d1022220e450d1c200e41056a41002900ada344370000200e41002900a8a3443700002009410e3602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031022220d450d1d200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410c1022220e450d1e200e41086a41002800bda344360000200e41002900b5a3443700002009410f3602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031022220d450d1f200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410b1022220e450d20200e41076a41002800c8a344360000200e41002900c1a344370000200941103602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031022220e450d21200e41026a41002d008cb7443a0000200e41002f008ab7443b000041151022220d450d22200d410d6a41002900d9a344370000200d41086a41002900d4a344370000200d41002900cca3443700002009411136029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031022220d450d23200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410f1022220e450d24200e41076a41002900e8a344370000200e41002900e1a344370000200941123602bc03200941003602b8032009428f808080f0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031022220d450d25200d41026a41002d008cb7443a0000200d41002f008ab7443b000041071022220e450d26200e41036a41002800f3a344360000200e41002800f0a344360000200941133602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031022220e450d27200e41026a41002d008cb7443a0000200e41002f008ab7443b000041111022220d450d28200d41106a41002d0087a4443a0000200d41086a41002900ffa344370000200d41002900f7a344370000200941143602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031022220d450d29200d41026a41002d008cb7443a0000200d41002f008ab7443b0000410e1022220e450d2a200e41066a410029008ea444370000200e4100290088a44437000020094180044180081021220c450d2b200c411536029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d36028004410310222209450d2c200941026a41002d008cb7443a0000200941002f008ab7443b0000410e1022220d450d2d200d41066a410029009ca444370000200d4100290096a444370000200c41163602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a004410310222209450d2e200941026a41002d008cb7443a0000200941002f008ab7443b000041101022220d450d2f200d41086a41002900aca444370000200d41002900a4a444370000200c41173602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c004410310222209450d30200941026a41002d008cb7443a0000200941002f008ab7443b000041101022220d450d31200d41086a41002900bca444370000200d41002900b4a444370000200c41183602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e00441031022220d450d32200d41026a41002d008cb7443a0000200d41002f008ab7443b0000411110222209450d33200941106a41002d00d4a4443a0000200941086a41002900cca444370000200941002900c4a444370000200c411936029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d3602800541031022220d450d34200d41026a41002d008cb7443a0000200d41002f008ab7443b0000411610222209450d352009410e6a41002900e3a444370000200941086a41002900dda444370000200941002900d5a444370000200c411a3602bc05200c41003602b805200c4296808080e0023702b005200c20093602ac05200c4283808080303702a405200c200d3602a00541031022220d450d36200d41026a41002d008cb7443a0000200d41002f008ab7443b0000411210222209450d37200941106a41002f00fba4443b0000200941086a41002900f3a444370000200941002900eba444370000200c411b3602dc05200c41003602d805200c4292808080a0023702d005200c20093602cc05200c4283808080303702c405200c200d3602c005410310222209450d38200941026a41002d008cb7443a0000200941002f008ab7443b0000410b1022220d450d39200d41076a4100280084a544360000200d41002900fda444370000200c411c3602fc05200c41003602f805200c428b808080b0013702f005200c200d3602ec05200c4283808080303702e405200c20093602e005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f200841003602602008420137035820084118360248200841c8006a200841d8006a103e4100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a2802002209360248200841c8006a200841d8006a103e0240024002400240200828025c2206200841d8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828025820062003102122060d020c060b200828025821060c020b200310222206450d040b2008200336025c200820063602580b200e200a20096a3602002006200a6a200120091084041a200d410c6a28020021052008200d41146a2802002201360248200841c8006a200841d8006a103e0240024002400240200828025c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280258200a2006102122090d020c070b200828025821090c020b200610222209450d050b2008200636025c200820093602582006210a0b200e200320016a2206360200200920036a200520011084041a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001102122090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001102122090d060c140b200a21010c030b200a21010c050b200110222209450d100b2008200136025c200820093602580b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003102122090d040c100b200110222209450d0e0b2008200136025c200820093602580b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003102122090d040c0e0b200310222209450d0c0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a2204418006470d040c030b200310222209450d0a0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a2204418006470d010b0b200828025c210902400240411d2007200f20082802582206200841e0006a280200200841086a1006220d417d460d00200d417f470d014100210a2009450d470c460b4102210a20090d450c460b41041022220e450d41200b280200220a28020041016a22014102490d07200a2001360200200e200a36020002402009450d00200610200b200841d0006a4281808080103703002008200e36024c2008200d36024820022802002106200228020421012008410036026020084201370358200841003602980120084198016a200841d8006a103e20082802602103200828025c21042008280258210a410a10762209450d4241012105024002400240200d20062001200a20032009410a200841086a10072206417d460d0020060d462008410936029c012008200941016a36029801024020092d00002206450d00024020064101470d00200841d8006a20084198016a10772008280258417e714104470d010b200910202004450d02200a10200c020b410021050b2009102002402004450d00200a10200b410321092005450d010b410221090b200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a20091078200d1008200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081005200e28020022092009280204417f6a360204200e28020022092802040d00200910200b200e102041012106410021010c460b1024000b200341011023000b200641011023000b200141011023000b200141011023000b200341011023000b200341011023000b00000b1079000b410c41041023000b410441041023000b410341011023000b410641011023000b412041041023000b410341011023000b410341011023000b41c00041041023000b410341011023000b410f41011023000b41800141041023000b410341011023000b410f41011023000b410341011023000b410841011023000b41800241041023000b410341011023000b410a41011023000b410341011023000b410a41011023000b410341011023000b410a41011023000b410341011023000b410b41011023000b41800441041023000b410341011023000b410d41011023000b410341011023000b410c41011023000b410341011023000b410b41011023000b410341011023000b411541011023000b410341011023000b410f41011023000b410341011023000b410741011023000b410341011023000b411141011023000b410341011023000b410e41011023000b41800841041023000b410341011023000b410e41011023000b410341011023000b411041011023000b410341011023000b411041011023000b410341011023000b411141011023000b410341011023000b411641011023000b410341011023000b411241011023000b410341011023000b410b41011023000b410441041023000b410a41011023000b4184f1c000102f000b200610200b0240200a450d00200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a200a107841002106410121010c010b200041c28ac00036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d00200910200b0240200841246a280200450d00200841206a28020010200b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810052009280200220a200a280204417f6a360204200928020022092802040d00200910200b0240200841386a2802002209450d002008413c6a280200450d00200910200b4100210a03400240200c200a6a220941046a280200450d00200928020010200b0240200941106a280200450d002009410c6a28020010200b200a41206a220a418006470d000b200c1020200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d00200910200b200b1020200841a0016a24000f0b4100210a03400240200c200a6a220941046a280200450d00200928020010200b0240200941106a280200450d002009410c6a28020010200b200a41206a220a418006470d000b200c1020200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d00200910200b200b102041002109024020014100472006720d00200d100802400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081005200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a1020200941046a22094104470d000b0b200e10200b200841a0016a24000b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b4192c9c00041f4031039000bb80e03047f037e047f230041900d6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042103200241146a2802002105200241246a2802002106200241346a2802002107200441106a2001280224290330420042204200108804200441386a4200370300200441306a4200370300200441286a4200370300200128022c2202420020022903082208427f200429031020042903184200521b7d220920092008562009507222021b370308200442003703200240024020020d0020012802282802082003200441206a412010102202417e460d0020020d06024002400240024002402005450d002004200141246a28020029033042002007ad220a42001088042001412c6a2802002202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d052007450d0120074100480d0e20071022220b450d0f41012102200b2103024020074102490d00200b41002007417f6a220210830420026a2103200721020b200341003a00000c020b4100210b0c020b410021024101210b4200210a0b200141286a2802002802082006200b200210102203417e460d0120030d0a200b450d02200a2002ad4220868421090b20012802002102200441c0006a41186a2201200441206a41186a290300370300200441c0006a41106a2207200441206a41106a290300370300200441c0006a41086a2205200441206a41086a2903003703002004200429032037034020022802182103200441e0006a41186a2001290300370300200441e0006a41106a2007290300370300200441e0006a41086a200529030037030020042004290340370360200328020c0d082003410c6a417f360200200441d80c6a41186a200341e4006a290000370300200441d80c6a41106a200341dc006a290000370300200441d80c6a41086a200341d4006a2900003703002004200329004c3703d80c02400240200341106a220c28020022014180e5c200460d00200341146a280200210d0c010b41880b10222201450d0d4100210d200141003b010620014100360200200141086a200441d8016a41800b1084041a200341146a4100360200200341106a20013602000b0240024002400240034020012f0106220e410574210641002102417f2107024002400240034020062002460d01200741016a2107417f4101200441d80c6a200120026a41086a412010860422054100481b410020051b2205450d05200241206a210220054101460d000b200d0d010c020b200e2107200d450d010b200d417f6a210d200120074102746a41880b6a28020021010c010b0b20044180016a41186a200441d80c6a41186a29030037030020044180016a41106a200441d80c6a41106a29030037030020044180016a41086a200441d80c6a41086a290300370300200420042903d80c37038001200341186a21024100210d41000d010c020b200341186a21024101450d010b200441f0016a4200370300200441ec016a4180e5c200360200200441003602f801200441003602e801200442003703e00120044180e5c2003602dc01200441003602d8012001200741e0006c6a41e8026a2102200441d8016a10420c010b200441f40c6a20044180016a41086a290300370200200441fc0c6a20044180016a41106a290300370200200441840d6a20044180016a41186a290300370200200420023602e80c200420073602e40c2004200c3602e00c200420013602dc0c2004200d3602d80c20042004290380013702ec0c2004418c026a4200370200200441f8016a20042903c80137030020044180026a200441c8016a41086a29030037030020044195026a20042900a0013700002004419d026a200441a0016a41086a290000370000200441a5026a200441a0016a41106a290000370000200441ad026a200441a0016a41186a290000370000200441b4026a200441bf016a280000360000200442003703f001200442003703d80120044180e5c20036028802200441003a009402200441d80c6a200441d8016a104121020b200441d8016a41186a200441e0006a41186a290300370300200441d8016a41106a200441e0006a41106a290300370300200441d8016a41086a200441e0006a41086a290300370300200420042903603703d801200420093702a4012004200b3602a001200441d80c6a200241306a200441d8016a200441a0016a1044024020042802d80c450d0020042802dc0c2202450d00200441e00c6a280200450d00200210200b2003410c6a2202200228020041016a360200410421020c020b200a500d00200b10200b410521020b20002002360200200441900d6a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b10d701000b418ccbc400102f000b1024000b200741011023000b41880b41081023000bb10302017f027e230041e0006b22042400024002402003450d0020022802000d002002280204210320042001280224290330420042204200108804200441286a4200370300200441206a4200370300200441186a4200370300200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b3703082004420037031002400240024020020d0020012802282802082003200441106a412010102202417e460d0020020d04200441306a20012802002802182202410c6a200241cc006a2002410020022802001b200441106a10d2012004280230450d01200441c0006a41086a200441306a41086a220228020036020020042004290330370340200441d0006a41086a2203200228020036020020042004290330370350200141186a210202402001411c6a280200450d00200228020010200b20022004290350370200200241086a2003280200360200410021010c020b20004105360200200441e0006a24000f0b200141206a4100360200410121010b2000410036020020002001360204200441e0006a24000f0b4192c9c00041f4031039000b418ccbc400102f000ba90d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903304200200241146a2802002202ad4200108804200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a200210222203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e108304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1083041a20044180016a200320051084041a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310200b200441106a200141246a28020029033042002008ad42001088042001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b200810222202450d0e2002210541002103024020084102490d00200241002008417f6a220310830420036a21050b200541003a0000200341016a21030c020b2002450d10200310200c100b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b1084041a2003410f4d0d0020044188016a290300210f200429038001211002402008450d00200210200b2004200141246a2802002903304200200aad42001088042001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a10222202450d1041012103200221050240200a4102490d0020024100200a417f6a220310830420036a2105200a21030b200541003a00000c020b2008450d10200210200c100b4100210a41012102410021030b02400240024002400240200141286a28020028020820092002200310102205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210e20012802182108200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d0141012103200e450d0220081020200a0d030c040b200a450d12200210200c120b2005200b200c7d3703082005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b3703602001280200280218210720044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a8012004200e3602a401200420083602a001200441f0006a200720044180016a2010200f200441d0006a20022003200441a0016a108802200441f0006a41086a290300210c2004280274210e200428027021082005200429035820052903087c3703084101210320084101460d00200e450d0002402001411c6a2203280200450d00200141186a28020010200b2003200c370200200141186a200e360200410021030b200a450d010b200210200b2000410036020020002003360204200441b0016a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b418ccbc400102f000b200841011023000b418ccbc400102f000b200a41011023000b20004105360200200441b0016a24000b971006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903304200200241146a2802002202ad4200108804200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a200210222203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e108304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1083041a200441f8006a200320051084041a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310200b200441186a200141246a28020029033042002008ad42001088042001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b200810222202450d0e2002210541002103024020084102490d00200241002008417f6a220310830420036a21050b200541003a0000200341016a21030c020b2002450d15200310200c150b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b1084041a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d00200210200b200441086a200141246a2802002903304200200aad42001088042001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a10222202450d1041012103200221050240200a4102490d0020024100200a417f6a220310830420036a2105200a21030b200541003a00000c020b2008450d15200210200c150b4100210a41012102410021030b02400240200141286a28020028020820092002200310102205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b2005200b200c7d3703082005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a20012802002802182010200f20044198016a200441386a200220031086024101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200a0d130c140b200a450d14200210200c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a220e200441c9016a290000370300200441f8006a41086a2208200441c1016a290000370300200420042900b901370378200441d8006a41086a22072008290300370300200441d8006a41106a2208200e290300370300200441d8006a41186a220e2003290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200441b8016a41186a200e290300370300200441b8016a41106a2008290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a2802002005200310212205450d020c110b200141186a28020021050c110b2003102222050d0f0b200341011023000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b418ccbc400102f000b200841011023000b418ccbc400102f000b200a41011023000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b200210200b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b10212203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b102222030d060b200b41011023000b4192c9c00041f4031039000b4192c9c00041f4031039000b4186cdc00041fd001039000b4198a1c300102f000b1024000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a1083041a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b0240200128022828020820052003200210102208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d00200510200b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d00200310200b20004105360200200441106a24000f0b418ccbc400102f000b900101027f200128020021040240412010222205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a28020010200b20004104360200200442a08080808004370200200141186a20053602000f0b412041011023000b960101027f200128020028021821040240412010222205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a28020010200b20004104360200200442a08080808004370200200141186a20053602000f0b412041011023000b7703017f027e017f200128022c220441186a2903002105200429031021060240411010222204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010200b20004104360200200742908080808002370200200141186a20043602000f0b411041011023000b6202017e027f200128022c29030821040240410810222205450d002005200437000002402001411c6a2206280200450d00200141186a28020010200b20004104360200200642888080808001370200200141186a20053602000f0b410841011023000bc103020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120108604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a28020028021c110100200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a360200411010222206450d01200620103700002006200f37000802402001411c6a220d280200450d00200141186a28020010200b20004104360200200d42908080808002370200200141186a2006360200200441106a24000f0b10d101000b411041011023000b7703017f027e017f2001280200220441086a2903002105200429030021060240411010222204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010200b20004104360200200742908080808002370200200141186a20043602000f0b411041011023000b930101027f200128020021040240412010222205450d002005200429003c370000200541186a200441d4006a290000370000200541106a200441cc006a290000370000200541086a200441c4006a29000037000002402001411c6a2204280200450d00200141186a28020010200b20004104360200200442a08080808004370200200141186a20053602000f0b412041011023000b6202017e027f200128020029031021040240410810222205450d002005200437000002402001411c6a2206280200450d00200141186a28020010200b20004104360200200642888080808001370200200141186a20053602000f0b410841011023000bd80a04027f027e027f047e23004180036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903304200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d05200210222203450d062003210841002109024020024102490d00200341002002417f6a220910830420096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b02400240200128022828020820052003200910102205417e460d0020050d042003450d0c2004200936029c01200420033602980120044180026a20044198016a10b9012004280280022205410f470d010b2002450d0b200310200c0b0b200441a0016a20044180026a41047241dc001084041a20042005360238200441386a410472200441a0016a41dc001084041a02402002450d00200310200b20044100360288022004420137038002200441386a20044180026a10950120042802880221030240200428028402450d0020042802800210200b4200210720044180026a41086a22024200370300200442003703800241afe4c200411b20044180026a1002200441a0016a41086a2205200229030037030020042004290380023703a00102400240200441a0016a411041c8d7c400410041001001417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010012209417f460d072009410f4d0d0720044188026a2903002106200429038002210a0c010b4200210a420021060b20024200370300200442003703800241cae4c200411b20044180026a10022005200229030037030020042004290380023703a00102400240200441a0016a411041c8d7c400410041001001417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010012202417f460d082002410f4d0d0820044188026a290300210b20042903800221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad4200108804200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d108704200242002002290308220620042903087d220720072006562007507222031b37030802402003450d00200441386a1092010c0b0b20012802002102200441a0016a200441386a41e0001084041a20044198026a2002280218220241e4006a29000037030020044190026a200241dc006a29000037030020044180026a41086a200241d4006a2900003703002004200229004c37038002200441a0026a200441a0016a41e0001084041a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4207862207422088a70d032007a722094100480d03024002402001450d00200241346a2802002001410774200910212201450d010c0a0b2009102222010d090b200941081023000b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b419a88c00041331039000b419a88c00041331039000b418caec200102f000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014107746a20044180026a4180011084041a2003200328020041016a360200410421020c010b410521020b2000200236020020044180036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429033842002005ad4200108804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b419cccc400102f000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429033842002005ad4200108804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b4192c9c00041f4031039000b419cccc400102f000ba60703037f037e057f230041f0006b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441106a200128022422032903204200200241146a2802002206ad22074200108804200128022c2102427f2108024020042903184200520d00427f2004290310220820032903287c220920092008541b21080b200242002002290308220920087d220820082009562008507222031b37030841052102024020030d002004200141246a2802002903304200200742001088042001412c6a2802002203420020032903082209427f200429030020042903084200521b7d220820082009562008507222031b37030820030d00024002402006450d0020064100480d05200610222203450d074101210a2003210b024020064102490d00200341002006417f6a220a108304200a6a210b2006210a0b200b41003a00000c010b4100210a41012103420021070b0240024002400240200128022828020820052003200a10102206417e460d0020060d082003450d04200441d0006a41186a22052001280200280218220241e4006a290000370300200441d0006a41106a220b200241dc006a290000370300200441d0006a41086a220c200241d4006a2900003703002004200229004c370350200241306a220628020022012002412c6a280200470d03200141016a220d2001490d072001410174220e200d200d200e491b220dad42d8007e2208422088a70d072008a7220e4100480d072001450d01200241286a280200200141d8006c200e102122010d020c0a0b2007500d03200310200c030b200e10222201450d080b2002412c6a200d360200200241286a2001360200200241306a28020021010b200241286a280200200141d8006c6a22022004290350370001200241053a0000200220042f004d3b002120022007200aad422086843700282002200336002420022004290320370330200241096a200c290300370000200241116a200b290300370000200241196a2005290300370000200241236a200441cf006a2d00003a0000200241d0006a200441c0006a290300370300200241c8006a200441206a41186a290300370300200241c0006a200441206a41106a290300370300200241386a200441206a41086a2903003703002006200628020041016a360200410421020b20002002360200200441f0006a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b1024000b418ccbc400102f000b200641011023000b200e41081023000bb60a03027f027e057f230041a00c6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903304200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b3703084105210820030d09024002402002450d0020024100480d05200210222203450d06410121092003210a024020024102490d00200341002002417f6a220910830420096a210a200221090b200a41003a00000c010b4100210241012103410021090b024002400240200128022828020820052003200910102205417e460d0020050d052003450d0c200442003703a801200442003703a001200441a0016a20032009411020094110491b1084041a2009410f4d0d00200441a8016a290300210720042903a001210602402002450d00200310200b2001280200280218220328020c0d082003410c6a417f36020020044180016a200341e4006a290000370300200441e8006a41106a200341dc006a290000370300200441f0006a200341d4006a2900003703002004200329004c370368200341106a220b28020022014180e5c200460d01200341146a280200210a0c020b2002450d0b200310200c0b0b41880b10222201450d074100210a200141003b010620014100360200200141086a200441a0016a41800b1084041a200341146a4100360200200341106a20013602000b02400240034020012f0106220c410574210541002102417f2108024002400240034020052002460d01200841016a2108417f4101200441e8006a200120026a41086a412010860422094100481b410020091b2209450d05200241206a210220094101460d000b200a0d010c020b200c2108200a450d010b200a417f6a210a200120084102746a41880b6a28020021010c010b0b200441106a41186a200441e8006a41186a290300370300200441106a41106a200441e8006a41106a290300370300200441106a41086a200441e8006a41086a29030037030020042004290368370310200341186a21024100210a41000d010c090b200341186a21024101450d080b200441b8016a4200370300200441b4016a4180e5c200360200200441003602c001200441003602b001200442003703a80120044180e5c2003602a401200441003602a0012001200841e0006c6a41e8026a2102200441a0016a10420c080b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b10d701000b41880b41081023000b20044184016a200441106a41086a2903003702002004418c016a200441106a41106a29030037020020044194016a200441106a41186a29030037020020042002360278200420083602742004200b3602702004200136026c2004200a3602682004200429031037027c200441d4016a4200370200200441c0016a2004290358370300200441c8016a200441d8006a41086a290300370300200441dd016a2004290035370000200441e5016a200441356a41086a290000370000200441ed016a200441356a41106a290000370000200441f5016a200441356a41186a290000370000200441fc016a200441d4006a280000360000200442003703b801200442003703a00120044180e5c2003602d001200441003a00dc01200441e8006a200441a0016a104121020b200241286a2007370300200241206a2006370300200242013703182003410c6a2202200228020041016a360200410421080b20002008360200200441a00c6a24000bda03020b7f027e230041206b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120108604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d00200641186a280200220d450d00200641286a290300210f200641206a29030021100c010b200441086a2005411c6a2802002007200541206a280200280214110100200441186a290300210f200528020c2108200429031021102004280208210d0b2005410c6a2008417f6a360200411010222206450d0120062010427f200d1b3700002006200f427f200d1b37000802402001411c6a220d280200450d00200141186a28020010200b20004104360200200d42908080808002370200200141186a2006360200200441206a24000f0b10d101000b411041011023000bfe0203027f027e037f230041206b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903304200200241146a2802002202ad4200108804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222081b37030841052103024020080d00024002402002450d0020024100480d06200210222208450d07410121092008210a024020024102490d00200841002002417f6a220910830420096a210a200221090b200a41003a00000c010b4100210241012108410021090b0240200128022828020820052008200910102201417e460d0020010d042008450d01200441106a200820091052024020042802100d002004280214200441186a280200100f0b410421030b2002450d00200810200b20002003360200200441206a24000f0b4192c9c00041f4031039000b4192c9c00041f4031039000b418ccbc400102f000b1024000b200241011023000b870603027f017e087f230041c0006b220424002004200136020c2004200041c8d7c40020011b3602082004200441086a10bc0102400240024002400240024002402004280200450d000240024002400240024020042802042205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d00200110222207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b1031000b200141081023000b200441206a4104722108410021094100210a410021002005210b0340200441206a200441086a1077200441306a41086a220c200841086a280200360200200420082902003703302004280220220d4104460d02200041016a2101200441106a41086a220e200c2802003602002004200429033037031002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c102122070d010c070b200c10222207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290310370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200441206a20022007200120031102002004410036023820044201370330200428022021004101102221010240024020004105470d002001450d06200141013a0000200442818080801037023420042001360230420121060c010b2001450d06200141003a000020044281808080103702342004200136023020014101410210212101024020004104470d002001450d08200141003a0001200442828080802037023420042001360230420221060c010b2001450d08200141013a0001200442828080802037023420042001360230200441206a200441306a109f02200441386a3502002106200428023021010b2001ad42208620068421060240200b450d00200710200b200441c0006a240020060f0b200b450d00200710200b4191f0c00041f0001039000b1024000b200c41081023000b410141011023000b410141011023000b410241011023000b410241011023000b0700200010eb030bcb0401057f230041106b22022400200241003a0008200241086a200128020022032001280204220441004722051084041a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b22041084041a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b22041084041a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041084041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041084041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20052004102d000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a41b7c7c00036020002402003450d002004450d00200310200b200128020c2200450d010b200141106a280200450d00200010200b02402001411c6a280200450d00200128021810200b200128022822012001280200417f6a22003602000240024020000d002001280208100520012001280204417f6a22003602042000450d010b0f0b200110200f0b41c8c7c000102f000b0a0041d48ac000102f000b130020004102360204200041f8cdc4003602000b130020004100360204200041c8d7c4003602000b130020004109360204200041f8a1c0003602000b130020004101360204200041dca0c0003602000b130020004107360204200041bc99c0003602000b130020004101360204200041d480c0003602000b130020004103360204200041c8e5c0003602000b13002000410136020420004190abc2003602000b13002000410336020420004184cbc3003602000b130020004109360204200041b0e9c0003602000b130020004104360204200041e4c5c1003602000b130020004102360204200041bca8c2003602000b130020004105360204200041eca9c0003602000b1300200041013602042000418c92c2003602000b130020004105360204200041cca2c3003602000b130020004106360204200041d4dbc2003602000b130020004102360204200041acb1c2003602000bb2860107067f037e017f027e057f037e057f230041b0096b22022400200241003a00d00820012802002001280204200241d0086a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00d0082203410e4b0d07024020030e0f000b0709040c0e0a10060f03050d02000b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450db60120022d00d008450d110cb6010b2000410f360200200241b0096a24000f0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d1220022d00d00822034101460d1120030d12200241d0086a2001108b0120022802d0082103200241f0076a200241d0086a41047241dc001084041a2003410f460d1220024190076a200241f0076a41dc001084041a41e00010222201450d990120012003360200200141046a20024190076a41dc001084041a200141087621044101210341002105410021060c1e0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450db20120022d00d008450d0d0cb2010b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d1a20022d00d00822034102460d1820034101460d1720030d1a200241d0086a41186a22054200370300200241d0086a41106a22064200370300200241d0086a41086a22074200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1a200241f0076a41186a2005290300370300200241f0076a41106a2006290300370300200241f0076a41086a2007290300370300200220022903d0083703f00720022900f7072208422088a72103200241ff076a290000210920022d008f082101200229008708210a20022800f307210420022f00f107210520022d00f00721062008a721074101210b0c190b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d2320022d00d008220341044b0d23024020030e0500211e1f1d000b200241e0046a2001108c0120022903e004a7450d23200241f0046a290300210920022903e804210a200241d0086a2001108d0120022d00d00822034102460d23200241f0086a2802002101200241ec086a3502002108200241dc086a290200210c20022f00d108210420022d00d308210520022902d408210d2002200241e4086a290200370380082002200c3703f8072002200d3703f00720042005411074722104410121050c220b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d1120022d00d00822034101460d0f20030d11200241b8046a2001108e0120022802b804450d1120022802bc042104200241d0086a2001108b0120022802d0082101200241f0076a200241d0086a41047241dc001084041a2001410f460d1120024190076a200241f0076a41dc001084041a41e00010222203450d990120032001360200200341046a20024190076a41dc001084041a410121014100210642002109410021054100210e0c100b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22012001280200200341016a41014b6a3602002000410f360200200241b0096a24000f0b2000410f360200200241b0096a24000f0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d1120022d00d00822034101460d0f20030d11200241d0086a2001108d0120022d00d00822044102460d1120022d00d308210620022f00d1082107200241f0086a2802002105200241ec086a2802002103200241e4086a2902002109200241dc086a290200210a20022902d4082108200241d0006a2001108c012002290350a7450d1120072006411074722101200241d0006a41106a290300210c2002290358210d20034110762106200341087621074101210b0c100b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6120022d00d008220341094b0d61024020030e0a0036333431393a353c32000b200241d0086a2001108f0120022802d0082203450d6120022902d408210920024198036a2001108e012009a72104200228029803450d60200228029c0321012004410876210f2003410876210e20094220882109410121100c360b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d840120022d00d008220541064b0d840141022106024020050e0700aa012c2d2b2e2f000b200241106a2001108e012002280210450d840120022802142204417f4c0d8a012004450d67200410762203450d9601200141086a2205200441002001280200200141046a280200200320042005280200100122012001417f461b2201200120044b1b220120052802006a36020020012004470d680ca8010b200241003a00d008410421052001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22063602002003450d7e20022d00d008220f410e4b0d7e0240200f0e0f0051527b4e5558535c505a4d4f564c000b200241d0086a2001108d0120022d00d00822044102460d7e20022d00d308210520022f00d1082106200241ee086a2f0100210f200241ed086a2d0000210e200241ec086a2d00002110200241e4086a290200210d200241dc086a290200210920022902d408210a200241f0086a2802002107200241a8016a2001108c0120022903a801a7450d7e200241a8016a41106a290300210c20022903b0012108200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22012802001001210320012001280200200341016a41014b22036a3602002003450d7e20022d00d008220b41024b0d7e20062005411074722103200220093703f8072002200a3703f007200f411074200e4108747220107221112002200d37038008200d422088a72110200da7210e410121050c7a0b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d870120022d00d008220341044b0d8701024020030e0500241f211d000b200241d0086a2001109001200241f0076a41086a2204200241f8086a290300370300200241f0076a41106a220620024180096a290300370300200241f0076a41186a220720024188096a290300370300200220022903f0083703f00720022d009c0922014102460d870120022802ec08210320022f01ea08210b20022d00e908210f20022d00e808210520022903e008210a20022903d808210920022903d0082108200241d0066a41086a2004290300370300200241d0066a41106a2006290300370300200241d0066a41186a2007290300370300200220022903f0073703d0062002419e096a2f0100210e200229039009210c200228029809211020022d009d092111410121120ca3010b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d5b20022d00d0082205410b4b0d5b41092106024020050e0c0041423f444543499d0140483e000b200241d0086a2001108b0120022802d0082104200241f0076a200241d0086a41047241dc001084041a2004410f460d5b20024190076a200241f0076a41dc001084041a41e00010222203450d970120032004360200200341046a20024190076a41dc001084041a200241c8026a2001108c0120022903c802a7450d5a200241d8026a290300210a20022903d0022209422088a7210b2009a7211241012106410021110c450b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450da30120022d00d008450d030ca3010b200241003a00d0082001280200200141046a280200200241d0086a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d2420022d00d008220341044b0d24024020030e0500221d1f1b000b200241d0086a2001108b0120022802d0082101200241f0076a200241d0086a41047241dc001084041a2001410f460d2420024190076a200241f0076a41dc001084041a41e00010222203450d900120032001360200200341046a20024190076a41dc001084041a200228028c07210120022f018a07210620022d008907210f20022d0088072104200229038007210a20022903f806210820022903f0062109410121070c220b200241d8046a2001108e0120022802d804450da40120022802dc042203417f4c0d84012003450d38200310762204450d8c01200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d390ca0010b200220011091012002290300a7450da4012002290308210920004100360200200041086a2009370300200041106a200241d0086a41d0001084041a200241b0096a24000f0b200241c8046a200110910120022903c804a7450d9f0120022903d00421092000410a360200200041086a2009370300200041106a200241d0086a41d0001084041a200241b0096a24000f0b200241d0086a2001108d014102210320022d00d00822014102470d0b0b2000410f360200200241b0096a24000f0b200241d0086a41186a4200370300200241d0086a41106a4200370300200241d0086a41086a4200370300200242003703d008200141086a220541002001280200200141046a280200200241d0086a41202004100122032003417f461b2203412020034120491b20052802006a3602002003411f4d0d0120022d00d008210320022f00d108210420022800d308210520022900e708210920022d00ef08210620022900d708210a200241f0076a410f6a200241d0086a410f6a2900003700002002200a3700f70720024190076a41086a200241f0076a41086a290300370300200220063a008f08200220093700870820024190076a41186a200241f0076a41186a29030037030020024190076a41106a200241f0076a41106a290300370300200220053600f307200220043b00f107200220033a00f007200220022903f00737039007200241c0046a2001108e0120022802c004450d0120022802c4042105200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22012802001001210320012001280200200341016a41014b22036a3602002003450d0120022d00d008210e2002290097072208422088a7210f2002419f076a290000210920022d00af07210620022900a707210a200228009307210420022f009107210720022d009007210b2008a72103410221010b200041003b01262000200e3a0025200020073b00062000200b3a0005200020013a000420004109360200200041286a2005360200200041246a20063a00002000411c6a200a370200200041146a2009370200200041106a200f3602002000410c6a2003360200200041086a20043602002000412c6a20022902d008370200200041346a200241d0086a41086a2902003702002000413c6a200241d0086a41106a290200370200200041c4006a200241e8086a290200370200200041cc006a200241f0086a290200370200200041d4006a200241d0086a41286a290200370200200041dc006a20024180096a280200360200200241b0096a24000f0b2000410f360200200241b0096a24000f0b200241d0086a2001108d0120022d00d00822044102460d0120022d00d308210620022f00d1082107200241f0086a2802002105200241ec086a2802002103200241e4086a2902002109200241dc086a290200210a20022902d408210820024180016a2001108c01200229038001a7450d0120024180016a41106a290300210c200229038801210d200241e8006a2001108c012002290368a7450d01200720064110747221012003411076210620034108762107200241f8006a2903002113200229037021144102210b0b200020013b000d200020063b002a200020073a0029200041033602002000410f6a20014110763a0000200041c8006a2013370200200041c0006a2014370200200041386a200c370200200041306a200d3702002000412c6a2005360000200041286a20033a0000200041206a2009370000200041186a200a370000200041106a20083700002000410c6a20043a0000200041086a200b360200200041d0006a20022903d008370300200041d8006a200241d0086a41086a290300370300200241b0096a24000f0b2000410f360200200241b0096a24000f0b20024198016a2001109101200229039801a7450d0220022903a0012209422088a721032009a721074102210b0c010b41002103200241003a00d0082001280200200141046a280200200241d0086a4101200410012104200141086a22012001280200200441016a41014b22016a3602002001450d0120022d00d00821064103210b0b200020053b000a200020063a000920004104360200200041286a20013a0000200041206a200a370200200041186a2009370200200041146a2003360200200041106a20073602002000410c6a2004360200200041086a200b3a0000200041306a20022903d008370300200041386a200241d0086a41086a290300370300200041c0006a200241d0086a41106a290300370300200041c8006a200241d0086a41186a290300370300200041d0006a200241d0086a41206a290300370300200041d8006a200241d0086a41286a290300370300200241b0096a24000f0b2000410f360200200241b0096a24000f0b20022f00d10820022d00d308411074722104200241e4086a2902002109200241f0086a2802002105200241dc086a290200210a200241ec086a280200210620022902d40821080b200020033602042000410e360200200041286a2005360200200041246a20063602002000411c6a2009370200200041146a200a3702002000410c6a20083702002000412c6a20022902d008370200200041086a2004410874200141ff017172360200200041346a200241d0086a41086a2902003702002000413c6a200241e0086a290200370200200041c4006a200241e8086a290200370200200041cc006a200241f0086a290200370200200041d4006a200241d0086a41286a290200370200200041dc006a20024180096a280200360200200241b0096a24000f0b200241d0056a2001108e0120022802d005450d0620022802d40522034108762104410521050c020b200241c0056a2001108e0120022802c005450d0520022802c4052103200241a8056a2001108c0120022903a805a7450d05200241b8056a290300210920022903b005210a20024198056a2001109101200229039805a7450d0520022903a005210820024190056a2001108e01200228029005450d05200228029405210120024180086a20093703002002200a3703f807200220013602f007200341087621042008422088a72101410321050c030b200241c8056a2001108e0120022802c805450d0420022802cc0522034108762104410421050b42002108410021010c010b200241f8046a2001108c0120022903f804a7450d0220024188056a290300210920022002290380053703f007200220093703f8074102210542002108410021010b0b200241d0086a41106a2206200241f0076a41106a290300220c370300200241d0086a41086a2207200241f0076a41086a290300220d37030020024190076a41086a220b200d37030020024190076a41106a220f200c370300200220022903f007220c370390072002200c3703d008200041386a2009370200200041306a200a3702002000410c6a2004410874200341ff017172360200200041086a20053602002000410c360200200041286a2001ad422086200842ffffffff0f8384370200200041106a200229039007370200200041186a200b290300370200200041206a200f290300370200200041c0006a20022903d008370300200041c8006a2007290300370300200041d0006a2006290300370300200041d8006a200241d0086a41186a290300370300200241b0096a24000f0b200241d0086a41106a200241f0076a41106a290300370300200241d0086a41086a200241f0076a41086a290300370300200220022903f0073703d0082000410f360200200241b0096a24000f0b20024188086a420037030020024180086a4200370300200241f0076a41086a4200370300200242003703f007200141086a220341002001280200200141046a220b280200200241f0076a41202004100122042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d6a200241ff076a290000210920022900f707210820022d008f082105200229008708210a20022800f307210420022f00f107210720022d00f0072106200241003a00d0082001280200200b280200200241d0086a4101200f1001210b20032003280200200b41016a41014b220b6a220f360200200b450d6a20022d00d0082203450d5d20034101470d6a4200210c200241f0076a41186a420037030020024180086a4200370300200241f0076a41086a4200370300200242003703f007200141086a220341002001280200200141046a280200200241f0076a4120200f100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d6a20022900f707221442ffffffff0f83210d201442808080807083211420022800f3072201411876210320022f00f107220b410876210e200241ff076a2900002113200241f0076a411f6a2d0000211020024187086a290000211520022d00f00721114101210f0c5e0b200241a8046a200110910120022903a804a7450d0920022903b0042109410521070c040b200241d0086a2001108d0120022d00d00822044102460d6820022d00d308210720022f00d108210e200241f0086a2802002103200241ec086a2802002105200241e4086a290200210a200241dc086a290200210920022902d408210820024188066a2001108c01200229038806a7450d6820024188066a41106a290300210d2002290390062114200241f8056a200110910120022903f805a7450d68200229038006210c200241f0056a2001108e0120022802f005450d6820022802f4052206417f4c0d692006450d64200610762210450d7b200141086a220b200641002001280200200141046a28020020102006200b280200100122012001417f461b2201200120064b1b2201200b2802006a36020020012006470d650c83010b200241d0086a41186a22054200370300200241d0086a41106a22064200370300200241d0086a41086a22074200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d07200241f0076a41186a22012005290300370300200241f0076a41106a22032006290300370300200241f0076a41086a22042007290300370300200220022903d0083703f00720024190076a41186a200129030037030020024190076a41106a200329030037030020024190076a41086a2004290300370300200220022903f00737039007200229009707220942ffffffff0f83210c2002419f076a290000210820022d009007210520022900a707210a20022d00af07210420022f009107210b2002280093072103410321070c060b200241b8066a2001108c0120022903b806a7450d66200241c8066a290300210c20022903c006210d200241a8066a200110910120022903a806a7450d6620022903b006211420024188086a420037030020024180086a4200370300200241f0076a41086a4200370300200242003703f00741002105200141086a220341002001280200200141046a280200200241f0076a41202003280200100122042004417f461b2204412020044120491b20032802006a3602002004411f4d0d3e20022800f307220441ffffff0771210520022f00f107220641ff017121032004418080807871210420064180fe03712106200241ff076a290000210a20022900f707210820022d008f082107200229008708210920022d00f007210b4101210f0c3f0b20024198046a2001109101200229039804a7450d0520022903a0042109410421070b2009210c0c030b200241e0056a200110910120022903e005a7450d6320022903e8052109200241d8056a2001108e0120022802d805450d6320022802dc052203417f4c0d642003450d4b200310762204450d73200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d4c0c7c0b200241d0086a41186a22054200370300200241d0086a41106a22074200370300200241d0086a41086a220b4200370300200242003703d008200141086a220641002001280200200141046a220f280200200241d0086a41202004100122032003417f461b2203412020034120491b20062802006a220e3602002003411f4d0d02200241f0076a41186a2005290300370300200241f0076a41106a2007290300370300200241f0076a41086a200b290300370300200220022903d0083703f007200241ff076a290000210820022900f707210920022d008f082104200229008708210a20022800f307210320022d00f007210520022f00f1072107200241003a00d0082001280200200f280200200241d0086a4101200e1001210120062006280200200141016a41014b22016a3602002001450d0220074180fe0371200741ff017172210b20022d00d008210f410221070b2009210c0b200020063b012a2000200f3a00292000200b3b000a200020053a0009200041083602002000412c6a2001360200200041286a20043a0000200041206a200a370200200041186a2008370200200041146a20094220883e0200200041106a200c3e02002000410c6a2003360200200041086a20073a0000200041306a20022903d008370300200041386a200241d0086a41086a290300370300200041c0006a200241d0086a41106a290300370300200041c8006a200241d0086a41186a290300370300200041d0006a200241d0086a41206a290300370300200041d8006a200241d0086a41286a290300370300200241b0096a24000f0b2000410f360200200241b0096a24000f0b200241206a2001108e012002280220450d5920022802242204417f4c0d5f2004450d38200410762203450d6c200141086a2205200441002001280200200141046a280200200320042005280200100122012001417f461b2201200120044b1b220120052802006a36020020012004470d390c760b200241186a2001108e012002280218450d58200228021c2204417f4c0d5e2004450d39200410762203450d6c200141086a2205200441002001280200200141046a280200200320042005280200100122012001417f461b2201200120044b1b220120052802006a36020020012004470d3a0c740b200242003703d00841042106200141086a220341002001280200200141046a280200200241d0086a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d5720022903d00821090c7c0b200241386a2001108e012002280238450d56200228023c2216ad42187e2209422088a70d5c2009a72204417f4c0d5c2004450d3b2004102222030d3c200441041023000b200241c8006a2001108e012002280248450d55200228024c2211ad420c7e2209422088a70d5b2009a72204417f4c0d5b2004450d3c2004102222030d3d200441041023000b200241c8036a2001108e0120022802c803450d3020022802cc032203410876210e410521100c090b20024188046a2001109101200229038804a7450d2f200229039004220a4220882109200aa72204410876210f410a21100c0a0b200241b8036a2001108e0120022802b803450d2e20022802bc032103200241d0086a2001108d0120022d00d00822044102460d2e20022d00d308210620022f00d108210f200241f0086a2802002107200241ec086a2802002105200241e4086a290200210a200241dc086a290200210c20022902d4082109200241b0036a2001108e0120022802b003450d2e20022802b403210b200241a8036a2001108e0120022802a803450d2e200f200641107472210f20022802ac0321102003410876210e2002200a37038008200a422088a72106200220093703f0072009422088a721012002200c3703f80720022902fc07210a2010ad2108200ca721114200210c410321100c0b0b200241c0036a2001108e0120022802c003450d2d20022802c4032203410876210e410421100c060b200241d0086a2001108d0120022d00d00822034102460d2c20022902d408220a422088210941082110200aa72204410876210f20022f00d10820022d00d30841107472210e200241dc086a2902002208422088a72111200241e4086a290200210a200241f0086a2802002105200241ec086a28020021062008a721010c020b200241d0086a2001108f0120022802d0082203450d2b20022902d4082109200241a0036a2001108e012009a7210420022802a003450d2a20022802a40321012004410876210f2003410876210e20094220882109410221100b0b0c060b200241d0086a2001108d0120022d00d00822034102460d2820022d00d308210420022f00d1082107200241f0086a2802002105200241ec086a2802002106200241e4086a290200210a200241dc086a290200210d20022902d4082114200241d8036a2001108c0120022903d803a7450d28200241d8036a41106a290300210c20022903e0032108200241d0036a2001108e0120022802d003450d282007200441107472210e20022802d4032107201442208821092014a72204410876210f200d422088a72111200da72101410621100c050b200241f0036a2001108e0120022802f003450d2720022802f4032203410876210e410721100b420021094100210f0c020b200241f8036a200110910120022903f803a7450d25200229038004220a4220882109200aa72204410876210f410921100b0b0b20004107360200200041c0006a200c370200200041386a2008370200200041346a200b360200200041306a20073602002000412c6a2005360200200041286a2006360200200041206a200a3702002000411c6a2011360200200041186a2001360200200041086a2010360200200041c8006a20022903d0083703002000410c6a200e410874200341ff017172360200200041d0006a200241d0086a41086a290300370300200041d8006a200241d0086a41106a290300370300200041106a2009422086200fad42ffffff07834208862004ad42ff01838484370200200241b0096a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d670b2003450d6a200410200c6a0b410c21060c080b200241f0026a2001108e0120022802f002450d1c20022802f4022103200241003a00f007410421062001280200200141046a280200200241f0076a4101200141086a22012802001001210420012001280200200441016a41014b22046a3602002004450d1c20022d00f007210720022903d0082208422088a7210b200241d0086a41086a290300210a20022802ec08211120022f01ea08211020022d00e908211720022d00e808210e20022903e00821092008a721120c5d0b200241d0086a41186a22054200370300200241d0086a41106a22064200370300200241d0086a41086a22074200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1b200241f0076a41186a2005290300370300200241f0076a41106a2006290300370300200241f0076a41086a2007290300370300200220022903d0083703f00720022900f7072208422088a7210b200241ff076a290000210a20022d008f08210e200229008708210920022800f307210320022f00f107210f20022d00f00721072008a72112410a21060c5c0b200241e0026a2001108e0120022802e002450d1a410221064200210a4100210b20022802e40221030c040b200241e8026a2001108e0120022802e802450d1920022802ec0221034100210b200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22012802001001210420012001280200200441016a41014b22046a3602002004450d1920022d00d0082107410321064200210a0c5a0b20024188036a2001109101200229038803a7450d18200229039003210920024180036a2001108e01200228028003450d1820022802840321032009422088a7210b2009a72112410721060c020b200241d0086a2001108b0120022802d0082104200241f0076a200241d0086a41047241dc001084041a2004410f460d1720024190076a200241f0076a41dc001084041a41e00010222203450d5420032004360200200341046a20024190076a41dc001084041a200241003a00d0082001280200200141046a280200200241d0086a4101200141086a22042802001001210520042004280200200541016a41014b22056a22063602002005450d1620022d00d008220741034f0d16200242003703d008200141086a220441002001280200200141046a280200200241d0086a41082006100122012001417f461b2201410820014108491b20042802006a360200200141074d0d1620022903d0082209422088a7210b2009a72112410521060c580b200241f8026a2001108e0120022802f802450d16410621064200210a4100210b20022802fc022103410021120b0b0c550b200241d0086a41186a22064200370300200241d0086a41106a22074200370300200241d0086a41086a220b4200370300200242003703d008200141086a220541002001280200200141046a2210280200200241d0086a41202004100122032003417f461b2203412020034120491b20052802006a22043602002003411f4d0d13200241f0076a41186a2006290300370300200241f0076a41106a2007290300370300200241f0076a41086a200b290300370300200220022903d0083703f007200241ff076a290000210a20022900f707210820022d008f08210e200229008708210920022800f307210320022f00f107210f20022d00f0072107200241003a00d00820012802002010280200200241d0086a410120041001210120052005280200200141016a41014b22016a3602002001450d132008422088a7210b20022d00d00821172008a72112410b21060c540b200241d0086a41186a22054200370300200241d0086a41106a2207420037030041082106200241d0086a41086a220b4200370300200242003703d008200141086a220341002001280200200141046a280200200241d0086a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d12200241f0076a41186a2005290300370300200241f0076a41106a2007290300370300200241f0076a41086a200b290300370300200220022903d0083703f00720022900f7072208422088a7210b200241ff076a290000210a20022d008f08210e200229008708210920022800f307210320022f00f107210f20022d00f00721072008a721120c530b200241d0086a2001103820022802d0082204450d322004410876210320022902d408210a410f21050c2a0b200241b8026a2001108e0120022802b802450d3120022802bc0222044108762103410c21050c090b20024188026a2001108e01200228028802450d30200228028c02210e200241f0016a2001108c0120022903f001a7450d3020024180026a290300210920022903f801210a41052105410021030c2b0b41002103200241003a00d0082001280200200141046a280200200241d0086a4101200610012104200141086a22012001280200200441016a41014b22016a3602002001450d2f20022d00d008210b410d21050c040b20024198026a2001109101200229039802a7450d2e20022903a002210a410a21050c0a0b200241c0016a2001108c0120022903c001a7450d2d200241d0016a290300210920022903c801210a20024188086a290300210c200229038008210820022802fc07210720022802f807211120022802f407211020022802f007210e41022105410021030c280b200241d8016a2001108c0120022903d801a7450d2c200241e8016a290300210920022903e001210a200241e8086a290300210c20022903e008210820022802dc08210720022802d808211120022802d408211020022802d008210e41032105410021030c270b41002103200241003a00d0082001280200200141046a280200200241d0086a410120061001210441082105200141086a22012001280200200441016a41014b22016a3602002001450d2b20022d00d008220b41034f0d2b0b420021090c260b20024190026a2001108e01200228029002450d292002280294022217ad42247e2209422088a70d342009a72203417f4c0d342003450d1f2003102222040d20200341041023000b200241c0026a2001108e0120022802c002450d2820022802c40222044108762103410e21050b420021090c010b410721050b0c1f0b200241a8026a200110910120022903a802a7450d2420022903b002210a410b21050b410021030c1c0b200241d0086a2001108d0120022d00d00822044102460d2220022f00d10820022d00d308411074722103200241e4086a2902002208422088a72110200241ec086a2802002111200241f0086a2802002107200241dc086a290200210920022902d408210a2008a7210e42002108410921054200210c0c1d0b2003109201200310200b2000410f360200200241b0096a24000f0b2004450d00200310200b2000410f360200200241b0096a24000f0b4100210441002103410021064100210f0b2002419f076a200a3700002002200837009707200220073a00af072002200b3a0090072002200420057236009307200220062003723b009107200220093700a707200f450d2620024198076a290300210820022802ac07210720022903a0072113200229039007210a200241a0066a2001108e0120022802a006450d2620022802a4062205417f4c0d272005450d24200510762203450d3a200141086a2204200541002001280200200141046a280200200320052004280200100122012001417f461b2201200120054b1b220120042802006a36020020012005470d250c3b0b410121032001280200200141046a28020041014100200141086a28020010011a41002004460d3d0b20040d1e0c1f0b410121032001280200200141046a28020041014100200141086a28020010011a41002004460d3a0b20040d1c0c1d0b410121032001280200200141046a28020041014100200141086a28020010011a41002004460d400b20040d1a0c1b0b410421030b2016450d0242002109200141086a210b200141046a21124100210e4100210441002107201621170340200241306a2001108e012002280230450d1820022802342206417f4c0d20024002402006450d00200610762210450d2b200b200641002001280200201228020020102006200b280200100122052005417f461b2205200520064b1b2205200b2802006a36020020052006460d010c190b410121102001280200201228020041014100200b28020010011a41002006470d180b200241286a2001108e012002280228450d17200228022c2205417f4c0d20024002402005450d00200510762211450d29200b200541002001280200201228020020112005200b2802001001220f200f417f461b220f200f20054b1b220f200b2802006a360200200f2005460d010c180b410121112001280200201228020041014100200b28020010011a41002005470d170b200741016a210f024020072017470d00200e200f200f200e491b2217ad42187e220a422088a70d22200aa722184100480d2202402007450d00200320042018102122030d010c270b201810222203450d260b200320046a22072010360200200741146a2005360200200741106a20053602002007410c6a2011360200200741046a2006ad220a422086200a8437020020094280808080107c2109200e41026a210e200441186a2104200f2107200f2016490d000c040b0b410421030b2011450d0242002109200141086a210e200141046a21124100210b4100210541002107201121100340200241c0006a2001108e012002280240450d0820022802442204417f4c0d1e024002402004450d0020041076220f450d22200e2004410020012802002012280200200f2004200e280200100122062006417f461b2206200620044b1b2206200e2802006a36020020062004460d010c090b4101210f2001280200201228020041014100200e28020010011a41002004470d080b200741016a2106024020072010470d00200b20062006200b491b2210ad420c7e220a422088a70d20200aa722174100480d2002402007450d00200320052017102122030d010c230b201710222203450d220b200320056a2207200f360200200741046a2004ad220a422086200a8437020020094280808080107c2109200b41026a210b2005410c6a21052006210720062011490d000c040b0b41002117420021090b2003450d1520092017ad842109410621060c3a0b41002110420021090b2003450d1320092010ad842109410721060c380b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d300b2003450d16200410200c160b2004450d00200f10200b02402007450d002003210103400240200141046a280200450d00200128020010200b2001410c6a2101200541746a22050d000b0b20100d0e0c0f0b410421040b024002402017450d0042002109200241ec086a2116200241e4086a2118200241dc086a2119410021074120210641002103201721120340200241d0086a2001108d0120022d00d008220b4102460d0a200341016a210520022d00d308210f20022f00d108210e200241f0086a2802002110201628020021112018290200210a2019290200210820022902d408210c024020032012470d002007200520052007491b2212ad42247e220d422088a70d18200da7221a4100480d1802402003450d002004200641606a201a102122040d010c1c0b201a10222204450d1b0b200420066a22032010360000200341636a200e200f41107472220f4110763a0000200341616a200f3b00002003417c6a2011360000200341746a200a3700002003416c6a2008370000200341646a200c370000200341606a200b3a000020094280808080107c2109200741026a2107200641246a21062005210320052017490d000c020b0b41002112420021090b2004450d0820092012ad84210a20044108762103410621050b0b0b0b0b2000200b3a000920004105360200200041386a200c370000200041306a2008370000200041186a2009370000200041106a200a3700002000412c6a2007360000200041286a2011360000200041246a2010360000200041206a200e360000200041086a20053a0000200041c0006a20022903d0083703002000410c6a2003410874200441ff017172360000200041c8006a200241d0086a41086a290300370300200041d0006a200241d0086a41106a290300370300200041d8006a200241d0086a41186a290300370300200241b0096a24000f0b4200210c4100210f420021134200210d420021140b200241ff066a2013370000200220103a008f072002201537008707200220033a00f6062002200e3a00f2062002200b3a00f106200220113a00f006200220013b00f306200220014110763a00f5062002200c2014200d84843700f706200241d8066a200241fe066a290100370300200241d0066a41106a20024186076a290100370300200241e8066a200241f0066a411e6a2f01003b0100200241d0066a411e6a200241d4086a2f01003b0100200220022901f6063703d006200220022801d0083601ea0620022801f206210320022f01f006210b410521120c270b2012450d00200410200b2000410f360200200241b0096a24000f0b2005450d00201110200b2006450d00201010200b02402007450d002003210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200441686a22040d000b0b2017450d010b200310200b2000410f360200200241b0096a24000f0b410121102001280200200141046a28020041014100200141086a28020010011a41002006460d1e0b2006450d02201010200c020b410121032001280200200141046a28020041014100200141086a28020010011a41002005460d160b2005450d00200310200b200241f0076a41186a200241d0066a41186a290300370300200241f0076a41106a200241d0066a41106a290300370300200241f0076a41086a200241d0066a41086a290300370300200220022903d0063703f0072000410f360200200241b0096a24000f0b1031000b1024000b200441011023000b201741041023000b201a41041023000b201841041023000b41e00041081023000b200541011023000b200341011023000b200641011023000b41e00041081023000b41e00041081023000b200441011023000b200441011023000b200441011023000b200341011023000b41e00041081023000b41e00041081023000b200641011023000b200541011023000b200241d0066a41106a200c37030020022009421888a73b01ea0820022009421088a73a00e90820022009420888a73a00e808200220133703e00820022008423888a73a00df082002200d3703d8062002200a42388820084208868422083700d7082002200a421888a722043600d308200220143703e8062002200aa722063b01d008200220064110763a00d20820022005ad22094220862009843703d006200220073602ec082007411876210520064180feff0771410876210720022900e708210a20022900df08210941042112410021100c040b200020103b012a200020173a00292000200f3b000a200020073a0009200041063602002000412c6a2011360200200041286a200e3a0000200041206a2009370200200041186a200a370200200041146a200b360200200041106a20123602002000410c6a2003360200200041086a20063a0000200041306a20022903d008370300200041386a200241d0086a41086a290300370300200041c0006a200241d0086a41106a290300370300200041c8006a200241d0086a41186a290300370300200041d0006a200241d0086a41206a290300370300200041d8006a200241d0086a41286a290300370300200241b0096a24000f0b2004ad22094220862009842109410321060c080b2004ad22094220862009842109410521060c070b200241d0066a41186a200241d0086a41186a290300370300200241d0066a41106a200241d0086a41106a290300370300200241d0066a41086a200241d0086a41086a290300370300200220022903d0083703d0062003ad220a422086200a842108410221120b0c010b2005411076210b2005410876210f200241e8066a200d370300200220143703e006200220103602d00620022006ad220d422086200d843702d406200e2007411074724108742004722104410321120b200241f0076a41186a200241d0066a41186a290300220d370300200241f0076a41106a200241d0066a41106a2903002214370300200241f0076a41086a200241d0066a41086a2903002213370300200241d0086a41086a22172013370300200241d0086a41106a22162014370300200241d0086a41186a2218200d370300200220022903d006220d3703d0082002200d3703f0072000412c6a20033600002000200b3b002a2000200f3a0029200041286a20053a0000200041206a200a370000200041186a2009370000200041106a20083700002000410c6a2004360000200020073b000a200020063a0009200041086a20123a00002000410d360200200041306a20022903d008370000200041386a2017290300370000200041c0006a2016290300370000200041c8006a20182903003700002000200e3b005e200020113a005d200041dc006a20013a0000200041d8006a2010360000200041d0006a200c370000200241b0096a24000f0b2004450d03200020043602042000410b360200200041086a2003ad2209422086200984370200200041106a200241d0086a41d0001084041a200241b0096a24000f0b2000410f360200200241b0096a24000f0b2004ad22094220862009842109410121060b20004101360200200041106a20093702002000410c6a2003360200200041086a2006360200200041186a200241d0086a41c8001084041a200241b0096a24000f0b2000410f360200200241b0096a24000f0b2000410f360200200241b0096a24000bcc0603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002402003450d000240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c030b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100122012001417f461b22014103200141034922011b20032802006a36020020010d042002280210410276ad21060c020b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410012103200141086a22012001280200200341016a220141014b6a36020020014102490d0320022f0110410276ad21060c010b0240024020054102762203410c460d0020034104460d0120030d03200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100122012001417f461b22014104200141044922011b20052802006a36020020010d04200235021021060c020b420021072002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100122012001417f461b22014110200141104922011b20032802006a36020020010d04200241106a41086a290300210820022903102106420121070c050b4200210720024200370310200141086a220341002001280200200141046a280200200241106a41082004100122012001417f461b22014108200141084922011b20032802006a36020020010d03200229031021060b42002108420121070c030b200341046a220941104b0d00200141046a210a200141086a21054200210642002108410021030340200241003a00102001280200200a280200200241106a410120041001210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f80071108904200241086a29030020088421082002290300200684210642012107200341016a220341ff01712009490d000c030b0b420021070b0b2000200637030820002007370300200041106a2008370300200241206a24000bdd0801067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002402003450d0020022d0050220341ef014b0d010c020b200041023a0000200241f0006a24000f0b024002400240024002400240200341847e6a220341034b0d0002400240024020030e0400040102000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100122012001417f461b2201410220014102491b20052802006a360200200141014d0d0620022f0150220341ef014b0d08200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200041023a0000200241f0006a24000f0b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d022002412e6a20022d00523a0000200241106a41086a200241df006a290000370300200241106a41106a200241e7006a290000370300200241106a41186a200241d0006a411f6a2d00003a0000200220022f01503b012c2002200229005737031020022800532103410121050c030b200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d03410121012002280250220341ffff034b0d05200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2204200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402005450d002002410c6a41026a20012d00003a0000200241d0006a41086a2004290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b410121010b200020022f010c3b0001200020013a0000200041046a2003360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000bcc0301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081001210420012001280208200441016a41014b22046a22053602080240024002402004450d0002400240024020022d000f220641037122044102460d0020044101460d0120040d0220064102762104410121030c050b20024100360208200220063a000841012103200141086a220441002001280200200141046a280200200241086a41017241032005100122012001417f461b22014103200141034922011b20042802006a36020020010d03200228020841027621040c040b41002103200241003b010c200220063a000c2001280200200141046a2802002002410c6a4101724101200510012104200141086a22012001280200200441016a220141014b6a36020020014102490d0120022f010c4102762104410121030c030b200641034b0d02200141046a28020021044100210320024100360204200141086a2206410020012802002004200241046a41042005100122012001417f461b22014104200141044922011b20062802006a36020020010d0020022802042104410121030c020b0c010b410021030b2000200436020420002003360200200241106a24000bf602010a7f230041106b2202240020022001108e01024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d01200310222204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001001210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009102122040d010c080b200910222204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d00200410200b200241106a24000f0b1024000b200941011023000b1031000b200341011023000b9c0a05057f017e017f077e017f230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100122032003417f461b2203410420034104491b20012802086a2204360208024002400240024002400240024002400240024002400240200341034d0d002002280208210520024200370308200141086a220641002001280200200141046a280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d012002290308210720024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d022002290308210920024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d032002290308210a20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d042002290308210b20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d052002290308210c20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d062002290308210d20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d072002290308210e20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d082002290308210f2008280200210320024100360208200141086a2206410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0920022802082110200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0a20022802082106200241003a000820012802002008280200200241086a4101200410012103200141086a22012001280200200341016a41014b22016a3602002001450d0b200020022d00083a004c2000200636024820002010360244200020053602402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a3703102000200937030820002007370300200020022f00083b004d200041cf006a2002410a6a2d00003a0000200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000f0b200041023a004c200241106a24000bb70503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081001210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c050b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100122012001417f461b22014103200141034922011b20042802006a36020020010d022002280208410276ad2106420121070c040b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310012103200141086a22012001280200200341016a220141014b6a36020020014102490d0120022f0108410276ad2106420121070c030b02400240200541027622044104460d0020040d01200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100122012001417f461b22014104200141044922011b20052802006a36020020010d0220023502082106420121070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100122012001417f461b22014108200141084922011b20042802006a36020020010d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031001210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000ba80601027f024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e1201121212020304050612071208120b20002802044101470d11200041086a2200280200109201200028020010200f0b200041086a280200220141064b0d0b024020010e071100110d110e0f110b200041106a280200450d102000410c6a28020010200f0b200041086a2d00002201410e4b0d0e20014106470d0f200041106a280200450d0f2000410c6a28020010200f0b200041086a2d000022014105460d0520014101470d0e2000410c6a2200280200109201200028020010200f0b200041086a28020022014102460d0520014101470d0d200041106a280200450d0d2000410c6a28020010200f0b200041086a2d00004101470d0c2000410c6a2200280200109201200028020010200f0b20002d00044101470d0b2000410c6a2200280200109201200028020010200f0b200041086a280200450d0a200028020410200f0b200041086a2d000022014104460d0220014103460d0320014102470d09200041106a280200450d092000410c6a28020010200f0b2000410c6a2200280200109201200028020010200f0b200041106a280200450d072000410c6a28020010200f0b200041306a280200450d062000412c6a28020010200f0b200041346a280200450d05200041306a28020010200f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010200b2001410c6a2101200241746a22020d000b0b200041106a280200450d042000410c6a28020010200f0b200041106a280200450d032000410c6a28020010200f0b200041106a280200450d022000410c6a28020010200f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200241686a22020d000b0b200041106a280200450d012000410c6a28020010200f0b200041106a280200450d002000410c6a28020010200f0b0bef0301017f02400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e0e010e0e0e02030405060e070e080e0b20002802044101470d0d200041086a2200280200109301200028020010200f0b200041086a1094010f0b200041086a2d00002201410e4b0d0a20014106470d0b200041106a280200450d0b2000410c6a28020010200f0b200041086a2d000022014105460d0520014101470d0a2000410c6a2200280200109301200028020010200f0b200041086a28020022014102460d0520014101470d09200041106a280200450d092000410c6a28020010200f0b200041086a2d00004101470d082000410c6a2200280200109301200028020010200f0b20002d00044101470d072000410c6a2200280200109301200028020010200f0b200041086a280200450d06200028020410200f0b200041086a2d000022014104460d0220014103460d0320014102470d05200041106a280200450d052000410c6a28020010200f0b2000410c6a2200280200109301200028020010200f0b200041106a280200450d032000410c6a28020010200f0b200041306a280200450d022000412c6a28020010200f0b200041346a280200450d01200041306a28020010200f0b200041106a280200450d002000410c6a28020010200f0b0bb70201027f0240024002400240024002402000280200220141064b0d0020010e0705010502050304050b02402000410c6a2802002202450d00200028020421012002410c6c210203400240200141046a280200450d00200128020010200b2001410c6a2101200241746a22020d000b0b200041086a280200450d04200041046a28020010200f0b200041086a280200450d03200028020410200f0b200041086a280200450d02200028020410200f0b200041086a280200450d01200028020410200f0b02402000410c6a2802002202450d0020002802042101200241186c210203400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200241686a22020d000b0b200041086a280200450d00200041046a28020010200f0b0bd6c10103067f017e037f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200417f6a2203410d4b0d00024020030e0e00090607030a0c080e050d02040b000b200141046a280200200141086a2802002203470d16200341016a22042003490d7120034101742205200420042005491b22054100480d712003450d2d20012802002003200510212204450d2e0c620b200141046a280200200141086a2802002203470d0d200341016a22042003490d7020034101742205200420042005491b22054100480d702003450d1c20012802002003200510212204450d1d0c5f0b200141046a280200200141086a2802002203470d0d200341016a22042003490d5320034101742205200420042005491b22054100480d532003450d1d20012802002003200510212204450d1e0c510b200141046a2205280200200141086a22042802002203470d0d200341016a22062003490d6e20034101742207200620062007491b22074100480d6e2003450d1e20012802002003200710212206450d1f0c4e0b200141046a280200200141086a2802002203470d0d200341016a22042003490d5120034101742205200420042005491b22054100480d512003450d1f20012802002003200510212204450d200c4b0b200141046a280200200141086a2802002203470d0d200341016a22042003490d5020034101742205200420042005491b22054100480d502003450d2020012802002003200510212204450d210c480b200141046a280200200141086a2802002203470d0d200341016a22042003490d6b20034101742205200420042005491b22054100480d6b2003450d2120012802002003200510212204450d220c450b200141046a280200200141086a2802002203470d0d200341016a22042003490d6a20034101742205200420042005491b22054100480d6a2003450d2220012802002003200510212204450d230c420b200141046a280200200141086a2802002203470d0d200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d2320012802002003200510212204450d240c3f0b200141046a280200200141086a2802002200470d0e200041016a22032000490d6820004101742204200320032004491b22044100480d682000450d2620012802002000200410212203450d270c3c0b200141046a2206280200200141086a22042802002203470d0e200341016a22052003490d6720034101742207200520052007491b22074100480d672003450d2720012802002003200710212205450d280c390b200141046a280200200141086a2802002203470d0e200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d2820012802002003200510212204450d290c360b200141046a280200200141086a2802002203470d0e200341016a22042003490d6520034101742205200420042005491b22054100480d652003450d2920012802002003200510212204450d2a0c330b200141046a280200200141086a2802002203470d0e200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d2a20012802002003200510212204450d2b0c300b200141046a280200200141086a2802002203470d0e200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d2b20012802002003200510212204450d2c0c2d0b200128020021040c520b200128020021040c440b200128020021060c410b200128020021040c3e0b200128020021040c3b0b200128020021040c380b200128020021040c350b200128020021040c320b200128020021040c4c0b200128020021030c2e0b200128020021050c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c1f0b2005102222040d420b200541011023000b2005102222040d330b200541011023000b2007102222060d2f0b200741011023000b2005102222040d2b0b200541011023000b2005102222040d270b200541011023000b2005102222040d230b200541011023000b2005102222040d1f0b200541011023000b2005102222040d1b0b200541011023000b2005102222040d340b200541011023000b2004102222030d150b200441011023000b2007102222050d110b200741011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240024002400240024002400240200041046a22032d000022044102460d0020044101470d32200141046a280200200141086a2802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0320012802002003200510212204450d040c090b200141046a28020020052802002204470d01200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d0420012802002004200610212205450d050c060b200128020021040c080b200128020021050c050b2005102222040d050b200541011023000b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1f20054101742204200620062004491b22044100480d1f2005450d0120012802002005200410212205450d020c030b200128020021050c030b2004102222050d010b200441011023000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a29000037000020042003290001370000200041286a2001103e02400240024002400240200141046a28020020062802002200470d00200041016a22042000490d1f20004101742205200420042005491b22054100480d1f2000450d0120012802002000200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a200341216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001103e2000410c6a2802002001109501200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1b20034101742205200420042005491b22054100480d1b2003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210620022000410c6a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041086a280200417f6a220341094b0d2302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b200141046a280200200141086a2802002203470d0e200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d1d20012802002003200510212204450d1e0c390b200141046a280200200141086a2802002203470d08200341016a22042003490d4e20034101742205200420042005491b22054100480d4e2003450d1220012802002003200510212204450d130c360b200141046a280200200141086a2802002203470d08200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d1320012802002003200510212204450d140c330b200141046a280200200141086a2802002203470d08200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1420012802002003200510212204450d150c300b200141046a280200200141086a2802002203470d08200341016a22042003490d4b20034101742205200420042005491b22054100480d4b2003450d1520012802002003200510212204450d160c2d0b200141046a280200200141086a2802002203470d08200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d1620012802002003200510212204450d170c2a0b200141046a280200200141086a2802002203470d09200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d1920012802002003200510212204450d1a0c270b200141046a280200200141086a2802002203470d09200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d1a20012802002003200510212204450d1b0c240b200141046a280200200141086a2802002203470d09200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d1b20012802002003200510212204450d1c0c210b200141046a280200200141086a2802002203470d09200341016a22042003490d4620034101742205200420042005491b22054100480d462003450d1c20012802002003200510212204450d1d0c1e0b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c2b0b200128020021040c1e0b200128020021040c1b0b200128020021040c180b200128020021040c150b2005102222040d230b200541011023000b2005102222040d1f0b200541011023000b2005102222040d1b0b200541011023000b2005102222040d170b200541011023000b2005102222040d130b200541011023000b2005102222040d1b0b200541011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a20011097012002200041386a36020c2002410c6a2001109801200041306a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001103e024002402007450d00200141046a210a03400240024002400240200a28020020052802002203470d00200341016a22062003490d272003410174220b20062006200b491b220b4100480d272003450d0120012802002003200b102122060d020c060b200128020021060c020b200b10222206450d040b20012006360200200a200b360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a2001103e200241106a24000f0b200b41011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a2001103e200041106a2001109701200041346a2001103e200041386a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001103e024002402007450d00200141046a210a03400240024002400240200a28020020052802002203470d00200341016a22062003490d1b2003410174220b20062006200b491b220b4100480d1b2003450d0120012802002003200b102122060d020c060b200128020021060c020b200b10222206450d040b20012006360200200a200b360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a2001103e200241106a24000f0b200b41011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a000002400240024002400240024002400240024002400240200028020422034102460d0020034101470d2c200141046a280200200141086a2802002203470d01200341016a22042003490d1d20034101742205200420042005491b22054100480d1d2003450d0320012802002003200510212204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d1c20034101742205200420042005491b22054100480d1c2003450d0420012802002003200510212204450d050c060b200128020021040c080b200128020021040c050b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2802002001109501200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000200041086a22032d0000417f6a2205410b4b0d1f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c00070405020809060b030a01000b200628020020042802002203470d11200341016a22042003490d7320034101742205200420042005491b22054100480d732003450d2320012802002003200510212204450d240c450b200628020020042802002200470d0a200041016a22032000490d7220004101742205200320032005491b22054100480d722000450d1620012802002000200510212203450d170c420b200628020020042802002203470d0a200341016a22052003490d7120034101742207200520052007491b22074100480d712003450d1720012802002003200710212205450d180c3f0b200628020020042802002200470d0a200041016a22052000490d7020004101742207200520052007491b22074100480d702000450d1820012802002000200710212205450d190c3c0b200628020020042802002205470d0a200541016a22062005490d6f20054101742207200620062007491b22074100480d6f2005450d1920012802002005200710212206450d1a0c390b200628020020042802002205470d0a200541016a22062005490d6e20054101742207200620062007491b22074100480d6e2005450d1a20012802002005200710212206450d1b0c360b200628020020042802002200470d0a200041016a22052000490d6d20004101742207200520052007491b22074100480d6d2000450d1b20012802002000200710212205450d1c0c330b200628020020042802002203470d0b200341016a22042003490d6c20034101742205200420042005491b22054100480d6c2003450d1e20012802002003200510212204450d1f0c300b200628020020042802002203470d0b200341016a22042003490d6b20034101742205200420042005491b22054100480d6b2003450d1f20012802002003200510212204450d200c2d0b200628020020042802002203470d0b200341016a22042003490d6a20034101742205200420042005491b22054100480d6a2003450d2020012802002003200510212204450d210c2a0b200628020020042802002200470d0b200041016a22052000490d6920004101742207200520052007491b22074100480d692000450d2120012802002000200710212205450d220c270b200628020020042802002200470d0b200041016a22032000490d6820004101742205200320032005491b22054100480d682000450d2220012802002000200510212203450d230c240b200128020021030c380b200128020021050c350b200128020021050c320b200128020021060c2f0b200128020021060c2c0b200128020021050c290b200128020021040c340b200128020021040c250b200128020021040c220b200128020021040c1f0b200128020021050c1c0b200128020021030c190b2005102222030d2b0b200541011023000b2007102222050d270b200741011023000b2007102222050d230b200741011023000b2007102222060d1f0b200741011023000b2007102222060d1b0b200741011023000b2007102222050d170b200741011023000b2005102222040d210b200541011023000b2005102222040d110b200541011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2007102222050d050b200741011023000b2005102222030d010b200541011023000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41083a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410a3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22072000490d4520054101742200200720072000491b22004100480d452005450d0120012802002005200010212205450d020c030b200128020021050c030b2000102222050d010b200041011023000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240200628020020042802002200470d00200041016a22052000490d4520004101742206200520052006491b22064100480d452000450d0120012802002000200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a200341216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a0000200041106a20011096012000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a2001103e200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41073a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3d20054101742200200620062000491b22004100480d3d2005450d0120012802002005200010212205450d020c030b200128020021050c030b2000102222050d010b200041011023000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41033a00002000410c6a2001103e02400240024002400240200141046a28020020072802002200470d00200041016a22052000490d3b20004101742206200520052006491b22064100480d3b2000450d0120012802002000200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a200341016a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41023a00002000410c6a2001103e02400240024002400240200141046a28020020072802002200470d00200041016a22052000490d3920004101742206200520052006491b22064100480d392000450d0120012802002000200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021000b2004200041016a360200200520006a200341016a2d00003a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41093a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3720054101742200200620062000491b22004100480d372005450d0120012802002005200010212205450d020c030b200128020021050c030b2000102222050d010b200041011023000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41043a00002000410c6a2802002001109501024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200628020020042802002203470d03200341016a22052003490d4220034101742207200520052007491b22074100480d422003450d0720012802002003200710212205450d080c0f0b200628020020042802002203470d01200341016a22052003490d4120034101742207200520052007491b22074100480d412003450d0420012802002003200710212205450d050c0c0b200628020020042802002203470d02200341016a22052003490d4020034101742207200520052007491b22074100480d402003450d0720012802002003200710212205450d080c090b200128020021050c0b0b200128020021050c0c0b200128020021050c070b2007102222050d070b200741011023000b2007102222050d070b200741011023000b2007102222050d010b200741011023000b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41003a00000c040b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41013a00000c020b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41023a00000b200041106a29030021080240024002400240024020062802002203200428020022006b41084f0d00200041086a22052000490d3520034101742200200520052000491b22004100480d352003450d0120012802002003200010212203450d020c030b200128020021030c030b2000102222030d010b200041011023000b20012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a2008370000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410b3a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a28020020011095012002200041106a36020c2002410c6a2001109801200241106a24000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041086a22032d0000417f6a220441044b0d1b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0f20012802002003200510212204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d2820034101742205200420042005491b22054100480d282003450d0820012802002003200510212204450d090c180b200141046a280200200141086a2802002200470d03200041016a22042000490d2720004101742205200420042005491b22054100480d272000450d0920012802002000200510212204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0a20012802002003200510212204450d0b0c120b200141046a280200200141086a2802002200470d04200041016a22042000490d2520004101742205200420042005491b22054100480d252000450d0d20012802002000200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d1920044101742200200520052000491b22004100480d192004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240200141046a28020020052802002200470d00200041016a22042000490d1920004101742205200420042005491b22054100480d192000450d0120012802002000200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a200341216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41023a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d1520044101742200200520052000491b22004100480d152004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a2802002001109501200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00000240024002400240024002400240024002400240024002400240024002400240200041086a22032d000022044103460d00024020044102460d0020044101470d2a200141046a280200200141086a2802002200470d04200041016a22042000490d3720004101742205200420042005491b22054100480d372000450d0920012802002000200510212204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d0420012802002003200510212204450d050c0c0b200141046a28020020052802002200470d01200041016a22042000490d3520004101742205200420042005491b22054100480d352000450d0520012802002000200510212204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102222040d070b200541011023000b2005102222040d030b200541011023000b2005102222040d050b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41023a000002400240024002400240200141046a28020020052802002200470d00200041016a22042000490d2f20004101742205200420042005491b22054100480d2f2000450d0120012802002000200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a200341016a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041106a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41003a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d2b20044101742200200520052000491b22004100480d2b2004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240024002400240024002400240200041086a28020022034102460d0020034101470d22200141046a280200200141086a2802002203470d01200341016a22042003490d2f20034101742205200420042005491b22054100480d2f2003450d0320012802002003200510212204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d2e20034101742205200420042005491b22054100480d2e2003450d0420012802002003200510212204450d050c060b200128020021040c080b200128020021040c050b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011097012002200041306a36020c2002410c6a20011098012002200041c0006a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a20011097012002200041306a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410d3a0000200041086a22032d0000417f6a220441044b0d1302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0f20012802002003200510212204450d100c1b0b200141046a280200200141086a2802002200470d03200041016a22042000490d2020004101742205200420042005491b22054100480d202000450d0820012802002000200510212204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0920012802002003200510212204450d0a0c150b200141046a280200200141086a2802002204470d03200441016a22052004490d1e20044101742206200520052006491b22064100480d1e2004450d0a20012802002004200610212205450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d1d20034101742205200420042005491b22054100480d1d2003450d0d20012802002003200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021050c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2006102222050d070b200641011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011096012000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1120044101742203200520052003491b22034100480d112004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a36020c2002410c6a2001109801200041c8006a200110960102400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410212205450d020c030b200128020021050c030b2004102222050d010b200441011023000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a290000370000200420032900013700002000412c6a28020021052002200041346a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200628020022036b20004f0d00200320006a22062003490d0f20044101742203200620062003491b22034100480d0f2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200520001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a20011097012002200041c0006a36020c2002410c6a2001109801200041d0006a2001109601200041306a28020021062002200041386a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240024002400240024002400240200341216a2d00004101470d00200141046a28020020052802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0320012802002000200510212204450d040c090b200141046a28020020052802002200470d01200041016a22032000490d1020004101742204200320032004491b22044100480d102000450d0420012802002000200410212203450d050c060b200128020021040c080b200128020021030c050b2005102222040d050b200541011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010212204450d020c030b200128020021040c030b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341226a220041186a290000370000200141106a200041106a290000370000200141086a200041086a29000037000020012000290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a2001109901200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a0000200041086a2d0000417f6a2203410e4b0d1102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0f00090607030a0c080e050d02040b01000b200528020020042802002203470d16200341016a22062003490d7720034101742207200620062007491b22074100480d772003450d2d20012802002003200710212206450d2e0c570b200528020020042802002203470d0d200341016a22062003490d7620034101742207200620062007491b22074100480d762003450d1c20012802002003200710212206450d1d0c540b200528020020042802002203470d0d200341016a22042003490d7520034101742205200420042005491b22054100480d752003450d1d20012802002003200510212204450d1e0c510b200528020020042802002203470d0d200341016a22042003490d7420034101742205200420042005491b22054100480d742003450d1e20012802002003200510212204450d1f0c4e0b200528020020042802002203470d0d200341016a22062003490d7320034101742207200620062007491b22074100480d732003450d1f20012802002003200710212206450d200c4b0b200528020020042802002203470d0d200341016a22042003490d7220034101742205200420042005491b22054100480d722003450d2020012802002003200510212204450d210c480b200528020020042802002203470d0d200341016a22042003490d7120034101742205200420042005491b22054100480d712003450d2120012802002003200510212204450d220c450b200528020020042802002200470d0d200041016a22032000490d7020004101742205200320032005491b22054100480d702000450d2220012802002000200510212203450d230c420b200528020020042802002203470d0d200341016a22062003490d6f20034101742207200620062007491b22074100480d6f2003450d2320012802002003200710212206450d240c3f0b200528020020042802002203470d0e200341016a22042003490d6e20034101742205200420042005491b22054100480d6e2003450d2620012802002003200510212204450d270c3c0b200528020020042802002203470d0e200341016a22042003490d6d20034101742205200420042005491b22054100480d6d2003450d2720012802002003200510212204450d280c390b200528020020042802002203470d0e200341016a22042003490d6c20034101742205200420042005491b22054100480d6c2003450d2820012802002003200510212204450d290c360b200528020020042802002200470d0e200041016a22032000490d6b20004101742205200320032005491b22054100480d6b2000450d2920012802002000200510212203450d2a0c330b200528020020042802002203470d0e200341016a22042003490d6a20034101742205200420042005491b22054100480d6a2003450d2a20012802002003200510212204450d2b0c300b200528020020042802002203470d0e200341016a22042003490d6920034101742205200420042005491b22054100480d692003450d2b20012802002003200510212204450d2c0c2d0b200128020021060c470b200128020021040c440b200128020021040c410b200128020021060c3e0b200128020021040c3b0b200128020021040c380b200128020021030c350b200128020021060c320b200128020021060c410b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021030c250b200128020021040c220b200128020021040c1f0b2007102222060d370b200741011023000b2005102222040d330b200541011023000b2005102222040d2f0b200541011023000b2007102222060d2b0b200741011023000b2005102222040d270b200541011023000b2005102222040d230b200541011023000b2005102222030d1f0b200541011023000b2007102222060d1b0b200741011023000b2007102222060d290b200741011023000b2005102222040d150b200541011023000b2005102222040d110b200541011023000b2005102222040d0d0b200541011023000b2005102222030d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041106a2001109601200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410d3a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a2001103e2000450d25200041246c2100034020032001109701200341246a21032000415c6a22000d000c260b0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a2001109801200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200528020020042802002200470d03200041016a22032000490d3f20004101742205200320032005491b22054100480d3f2000450d0720012802002000200510212203450d080c0f0b200528020020042802002200470d01200041016a22032000490d3e20004101742205200320032005491b22054100480d3e2000450d0420012802002000200510212203450d050c0c0b200528020020042802002200470d02200041016a22032000490d3d20004101742205200320032005491b22054100480d3d2000450d0720012802002000200510212203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102222030d070b200541011023000b2005102222030d070b200541011023000b2005102222030d010b200541011023000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109601200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a410c3a000002400240024002400240200528020020042802002203470d00200341016a22052003490d2b20034101742206200520052006491b22064100480d2b2003450d0120012802002003200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a2001103e2002200041106a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a2001103e200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b200141086a220b200341016a360200200620036a410e3a00002000410c6a28020021032002200041146a280200220036020c2002410c6a2001103e2000450d1320004105742107200141046a210902400340024002400240024020052802002206200428020022006b41204f0d00200041206a220a2000490d2620064101742200200a200a2000491b22004100480d262006450d01200128020020062000102122060d020c050b200128020021060c020b200010222206450d030b2001200636020020092000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000c150b0b200041011023000b20012006360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200620036a41003a00002000410c6a20011097012002200041306a36020c2002410c6a200110980102400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200528020020042802002200470d03200041016a22032000490d2f20004101742205200320032005491b22054100480d2f2000450d0720012802002000200510212203450d080c0f0b200528020020042802002200470d01200041016a22032000490d2e20004101742205200320032005491b22054100480d2e2000450d0420012802002000200510212203450d050c0c0b200528020020042802002200470d02200041016a22032000490d2d20004101742205200320032005491b22054100480d2d2000450d0720012802002000200510212203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102222030d070b200541011023000b2005102222030d070b200541011023000b2005102222030d010b200541011023000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a00000c150b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200041086a280200417f6a220341044b0d0f0240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d0f20012802002003200510212204450d100c1c0b200141046a280200200141086a2802002203470d03200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d0820012802002003200510212204450d090c190b200141046a280200200141086a2802002203470d03200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0920012802002003200510212204450d0a0c160b200141046a280200200141086a2802002203470d03200341016a22042003490d1020034101742205200420042005491b22054100480d102003450d0a20012802002003200510212204450d0b0c130b200141046a280200200141086a2802002203470d04200341016a22042003490d0f20034101742205200420042005491b22054100480d0f2003450d0d20012802002003200510212204450d0e0c100b200128020021040c160b200128020021040c130b200128020021040c100b200128020021040c150b200128020021040c0c0b2005102222040d100b200541011023000b2005102222040d0c0b200541011023000b2005102222040d080b200541011023000b2005102222040d0c0b200541011023000b2005102222040d020b200541011023000b1024000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a2001109801200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a2001103e2002200041186a36020c2002410c6a2001109801200041286a2001109601200041106a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a2001103e200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a20011098012000410c6a2001109701200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109601200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a280200417f6a220341064b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0700040203010506000b200141046a280200200141086a2802002203470d09200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d1320012802002003200510212204450d140c2a0b200141046a280200200141086a2802002203470d05200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0c20012802002003200510212204450d0d0c270b200141046a280200200141086a2802002203470d05200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0d20012802002003200510212204450d0e0c240b200141046a280200200141086a2802002203470d05200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0e20012802002003200510212204450d0f0c210b200141046a280200200141086a2802002200470d06200041016a22032000490d2820004101742204200320032004491b22044100480d282000450d1120012802002000200410212203450d120c1e0b200141046a280200200141086a2802002203470d06200341016a22042003490d2720034101742205200420042005491b22044100480d272003450d1220012802002003200410212205450d130c180b200141046a280200200141086a2802002203470d06200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d1320012802002003200510212204450d140c150b200128020021040c220b200128020021040c1f0b200128020021040c1c0b200128020021040c210b200128020021030c180b200128020021050c120b200128020021040c0f0b2005102222040d1a0b200541011023000b2005102222040d160b200541011023000b2005102222040d120b200541011023000b2005102222040d160b200541011023000b2004102222030d0c0b200441011023000b2004102222050d050b200441011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00002000410c6a28020021042002200041146a280200220036020c2002410c6a2001103e2000450d0220042000410c6c6a2109200141046a210a02400340200428020021072002200441086a280200220036020c2002410c6a2001103e0240024002400240200a2802002206200528020022036b20004f0d00200320006a220b2003490d1520064101742203200b200b2003491b22034100480d152006450d01200128020020062003102122060d020c050b200128020021060c020b200310222206450d030b20012006360200200a2003360200200528020021030b2005200320006a360200200620036a200720001084041a2004410c6a22042009470d000c040b0b200341011023000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a2001103e2000450d002003200041186c6a2109200141046a210603402003280200210a2002200341086a280200220036020c2002410c6a2001103e024002400240024020062802002207200428020022056b20004f0d00200520006a220b2005490d1220074101742205200b200b2005491b22054100480d122007450d01200128020020072005102122070d020c060b200128020021070c020b200510222207450d040b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200a20001084041a2003410c6a280200210a2002200341146a280200220036020c2002410c6a2001103e024002400240024020062802002207200428020022056b20004f0d00200520006a220b2005490d1220074101742205200b200b2005491b22054100480d122007450d01200128020020072005102122070d020c070b200128020021070c020b200510222207450d050b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200a20001084041a200341186a22032009470d000b0b200241106a24000f0b200541011023000b200541011023000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41013a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041106a290300210802400240024002400240200141046a2802002203200528020022006b41084f0d00200041086a22042000490d0b20034101742200200420042000491b22004100480d0b2003450d0120012802002003200010212203450d020c030b200128020021030c030b2000102222030d010b200041011023000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a2008370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0920044101742203200520052003491b22034100480d092004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e02400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0720044101742203200520052003491b22034100480d072004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001103e024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310212204450d020c040b200128020021040c040b2003102222040d020b200341011023000b1024000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001084041a200241106a24000bc00903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0520012802002000200510212204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d0820012802002004200010212204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000102122040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004102122070d0a0c110b2005102222040d130b200541011023000b200128020021040c050b200128020021070c070b2000102222040d0d0b200041011023000b200010222204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b200410222207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008102122050d020c060b200128020021050c020b200810222205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b1024000b200841011023000b41e8e4c200102f000b2002200241086a36024020024180e5c200360244200241c8006a41146a4100360200200241286a41146a4104360200200241346a411e360200200241106a41146a4103360200200241c8d7c4003602582002420137024c20024188e5c2003602482002411e36022c20024203370214200241fcd1c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a4190e5c2001048000b200041011023000b200441011023000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241ffff034d0d01200141046a280200200141086a2802002200470d03200041016a22032000490d1820004101742204200320032004491b22044100480d182000450d0920012802002000200410212203450d0a0c160b200141046a280200200141086a2802002202470d01200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0420012802002002200410212203450d050c130b200241ef014b0d02200141046a280200200141086a2802002200470d05200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004102122030d0a0c0f0b200128020021030c120b200128020021030c130b200141046a280200200141086a2802002200470d03200041016a22032000490d1320004101742204200320032004491b22044100480d132000450d09200128020020002004102122030d0a0c0d0b2004102222030d0e0b200441011023000b200128020021030c050b200128020021030c070b2004102222030d0c0b200441011023000b200410222203450d050b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b200410222203450d030b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240024002400240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0b20034101742200200420042000491b22004100480d0b2003450d01200128020020032000102122030d020c060b200128020021030c020b200010222203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b200441011023000b200441011023000b200041011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d0120012802002003200210212203450d020c030b200128020021030c030b2002102222030d010b200241011023000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d0120012802002003200010212203450d020c040b200128020021030c040b2000102222030d020b200041011023000b1024000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b960a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d0520012802002000200610212205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d0820012802002005200010212205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000102122050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005102122080d0a0c110b2006102222050d130b200641011023000b200128020021050c050b200128020021080c070b2000102222050d0d0b200041011023000b200010222205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b200510222208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009102122060d020c060b200128020021060c020b200910222206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b1024000b200941011023000b41909dc300102f000b20022002360240200241a89dc300360244200241c8006a41146a4100360200200241286a41146a4104360200200241346a411f360200200241106a41146a4103360200200241c8d7c4003602582002420137024c20024188e5c2003602482002411f36022c20024203370214200241fcd1c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41b89dc3001048000b200041011023000b200541011023000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000be01002047f017e2000280240210202400240024002400240024002400240200141046a2802002203200141086a28020022046b41044f0d00200441046a22052004490d0520034101742204200520052004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240024002400240200141046a2802002203200528020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000280244210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280248210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a2005360000024002400240200141046a28020020022802002204470d00200441016a22032004490d0320044101742202200320032002491b22024100480d032004450d0120012802002004200210212203450d020c040b200128020021030c040b2002102222030d020b200241011023000b1024000b20012003360200200141046a2002360200200141086a28020021040b200141086a200441016a360200200320046a200041cc006a2d00003a00000bdb0f03047f017e037f230041206b2202240002400240024020012d000022034101460d0020030d0241012103200141016a21010c010b2001410c6a2802002104200141046a2802002101410021030b200241106a20043602002002200136020c200220033602082000200241086a109b01200241206a24000f0b2002410036021020024201370308024002400240024002400240024002400240410110222203450d002002410136020c200241086a41086a22042004280200220541016a36020020022003360208200320056a41023a00000240024002400240024002400240200141086a2802004101470d00200228020c20042802002203470d01200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d0320022802082003200510212204450d040c0a0b200228020c20042802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d0420022802082003200510212204450d050c070b200228020821040c090b200228020821040c060b2005102222040d060b200541011023000b2005102222040d020b200541011023000b410141011023000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41003a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0820044101742203200520052003491b22034100480d082004450d0120022802082004200310212204450d020c030b200228020821040c030b2003102222040d010b200341011023000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a103e2001450d022003200141286c6a21080240024003400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0a20044101742205200120012005491b22014100480d0a2004450d01200228020820042001102122050d020c050b200228020821050c020b200110222205450d030b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0720044101742201200920092001491b22014100480d07024002402004450d00200520042001102122050d010c050b200110222205450d040b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000c050b0b200141011023000b200141011023000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41013a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d0120022802082004200310212204450d020c030b200228020821040c030b2003102222040d010b200341011023000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2205200341086a360200200420036a2006370000200141206a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d0120022802082004200310212204450d020c030b200228020821040c030b2003102222040d010b200341011023000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a103e2001450d002003200141286c6a210803400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0620044101742205200120012005491b22014100480d062004450d01200228020820042001102122050d020c070b200228020821050c020b200110222205450d050b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0320044101742201200920092001491b22014100480d03024002402004450d00200520042001102122050d010c070b200110222205450d060b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000b0b200228020c210120022802082103200241106a220420042802003602002002200336020c200241043602082000200241086a109b0102402001450d00200310200b200241206a24000f0b1024000b200141011023000b200141011023000bcd0f02077f017e230041106b22022400200241003602082002420137030002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220341034b0d00024020030e0400040203000b20012802042101410110222203450d1120024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d06200341206a22042003490d1c20054101742203200420042003491b22034100480d1c2005450d0c20022802002005200310212204450d0d0c1f0b200141086a280200210320012802042101410110222204450d11200241086a22052005280200220541016a3602002002410136020420022004360200200420056a41013a00002002200336020c2002410c6a2002103e2003450d2020034105742106200241086a220728020021042002280204210503400240024002400240200520046b41204f0d00200441206a22032004490d2020054101742204200320032004491b22044100480d202005450d01200228020020052004102122080d020c140b20022802002108200421030c020b200410222208450d120b200220043602042002200836020020072802002103200421050b2007200341206a2204360200200820036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a29000037000020032001290000370000200141206a2101200641606a22060d000c210b0b2001410c6a2802002103200141086a280200210820012802042106410110222201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41043a000020022802042205200428020022016b41044f0d02200141046a22042001490d1a20054101742201200420042001491b22014100480d1a2005450d0620022802002005200110212204450d070c180b200141086a280200210320012802042108410110222201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41003a00002002200336020c2002410c6a2002103e20022802042205200428020022016b20034f0d02200120036a22042001490d1920054101742201200420042001491b22014100480d192005450d0720022802002005200110212204450d080c150b200141086a280200210320012802042105410110222201450d1120024101360204200241086a22042004280200220841016a36020020022001360200200120086a41033a00002005290300210920022802042205200428020022016b41084f0d03200141086a22042001490d1820054101742201200420042001491b22014100480d182005450d0a20022802002005200110212204450d0b0c120b200228020021040c160b200228020021040c130b200228020021040c190b200228020021040c0f0b2001102222040d110b200141011023000b2001102222040d0d0b200141011023000b2003102222040d120b200341011023000b2001102222040d070b200141011023000b200441011023000b410141011023000b410141011023000b410141011023000b410141011023000b410141011023000b2002200136020420022004360200200241086a28020021010b200241086a2205200141086a360200200420016a20093700000240024002400240024020022802042204200528020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d0120022802002004200110212204450d020c030b200228020021040c030b2001102222040d010b200141011023000b2002200136020420022004360200200241086a28020021010b200241086a200141c0006a360200200420016a220141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a290000370000200141206a200341206a290000370000200141286a200341286a290000370000200141306a200341306a290000370000200141386a200341386a290000370000200120032900003700000c090b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a200820031084041a0c070b2002200136020420022004360200200241086a28020021010b200241086a2205200141046a360200200420016a20062800003600002002200336020c2002410c6a2002103e02400240024020022802042204200528020022016b20034f0d00200120036a22052001490d0320044101742201200520052001491b22014100480d032004450d0120022802002004200110212204450d020c040b200228020021040c040b2001102222040d020b200141011023000b1024000b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a200820031084041a0c020b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a290000370000200320012900003700000b20002002290300370200200041086a200241086a280200360200200241106a24000bac0201027f230041206b2202240002400240410610222203450d00200341046a41002f00b48c403b0000200341002800b08c4036000020034106410c10212203450d01200320013600060240024002402003410a41c8d7c400410041001001417f460d00200241186a4200370300200241106a4200370300200241086a4200370300200242003703002003410a20024120410010012201417f460d022001411f4d0d0220002002290300370000200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031020200241206a24000f0b419a88c00041331039000b410641011023000b410c41011023000b820303047f017e017f230041206b220124000240024002400240410610222202450d00200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d01200241086a41002d00a293423a0000200241002f00a093423b00060240024002402002410941c8d7c400410041001001417f460d00200141003602004101210320024109200141044100100141016a41044d0d0220012802002104200210202004450d012004ad4205862205422088a70d052005a722024100480d05200210222203450d064100210620032102034020012006109c01200241186a200141186a290000370000200241106a200141106a290000370000200241086a200141086a29000037000020022001290000370000200241206a21022004200641016a2206470d000c020b0b2002102041012103410021040b200020043602082000200436020420002003360200200141206a24000f0b419a88c00041331039000b410641011023000b410c41011023000b1024000b200241011023000b840803037f017e067f230041c0006b22012400200141206a41086a220242003703002001420037032041b68cc000411d200141206a1002200141086a2002290300370300200120012903203703000240024002400240024002400240024002402001411041c8d7c400410041001001417f460d002001421037021420012001360210200141206a200141106a103820012802202202450d0102402001280224450d00200210200b20002802002202450d08200041046a280200450d0820021020200141c0006a24000f0b024002400240024020002802002203450d00200029020421040c010b410610222200450d05200041046a41002f00b48c403b0000200041002800b08c4036000020004106410c10212200450d06200041086a41002d00a293423a0000200041002f00a093423b0006024002402000410941c8d7c400410041001001417f460d00200141003602204101210320004109200141206a41044100100141016a41044d0d0620012802202105200010202005450d012005ad4205862204422088a70d032004a722004100480d03200010222203450d0941002102200321000340200141206a2002109c01200041186a200141206a41186a290000370000200041106a200141206a41106a290000370000200041086a200141206a41086a29000037000020002001290020370000200041206a21002005200241016a2202470d000c020b0b2000102041012103410021050b2005ad220442208620048421040b200141206a41086a220042003703002001420037032041b68cc000411d200141206a1002200141086a200029030037030020012001290320370300200141003602282001420137032020012004422088a72202360210200141106a200141206a103e02402002450d00200241057421064100200028020022026b210720012802202108200128022421092003210003400240200920076a411f4b0d00200241206a22052002490d032009410174220a20052005200a491b22054100480d03024002402009450d00200820092005102122080d010c060b200510222208450d050b200521090b200820026a22052000290000370000200541186a200041186a290000370000200541106a200041106a290000370000200541086a200041086a290000370000200741606a2107200241206a2102200041206a2100200641606a22060d000b200141286a20023602002001200936022420012008360220200141102008200210032009450d090c080b2001280224210220014110200128022022082000280200100320020d070c080b1024000b200541011023000b419a88c00041331039000b419a88c00041331039000b410641011023000b410c41011023000b200041011023000b200810200b2004a7450d00200310200b200141c0006a24000bd91705017f017e037f017e067f23004180066b22042400200441b8036a200141e8011084041a200441a0026a200441b8036a10a00102400240024020042802a0024101470d00200041086a20042902a4023702002000420137020020032802002200450d020c010b200441a0026a41086a290300210520044198016a200441a0026a41106a4188011084041a20042005370308200441086a41086a20044198016a418801108404210620044198016a41086a22014200370300200442003703980141a0c7c000411720044198016a1002200441b8036a41086a200129030037030020042004290398013703b80341002101024002400240024002400240024002400240024002400240024002400240200441b8036a411041c8d7c400410041001001417f460d00200441003602a002200441b8036a4110200441a0026a41044100100141016a41044d0d0120042802a00221010b41042107200120026a41808080024b0d0d410021080240200441106a410020042903084201511b2201450d002001450d00024002400240200110a101220520012903202209520d00410321072001200210a2010d11411310222207450d0d2007410f6a410028008ec940360000200741086a4100290087c940370000200741002900ffc84037000020074113413310212207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441b8036a41186a220a4200370300200441b8036a41106a220b4200370300200441b8036a41086a220c4200370300200442003703b80320074133200441b8036a1000200441a0026a41186a200a290300370300200441a0026a41106a200b290300370300200441a0026a41086a200c290300370300200420042903b8033703a002200441a0026a412041c8d7c400410041001001417f460d01200442003703b803200441a0026a4120200441b8036a41084100100141016a41084d0d0820042903b80342017c2105200710204113210a4113102222070d020c0f0b4101410220092005541b21070c100b42012105200710204113210a411310222207450d0d0b2007410f6a410028008ec940360000200741086a4100290087c940370000200741002900ffc8403700002007200a413310212207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441b8036a41186a22014200370300200441b8036a41106a220a4200370300200441b8036a41086a220b4200370300200442003703b80320074133200441b8036a1000200441a0026a41186a2001290300370300200441a0026a41106a200a290300370300200441a0026a41086a200b290300370300200420042903b8033703a002200420053703b803200441a0026a4120200441b8036a41081003200710200b024020032802002207450d00200341086a28020021012003280204210d4100210b024041cec6c000411041c8d7c400410041001001417f460d00200441003602b80341cec6c0004110200441b8036a41044100100141016a41044d0d0520042802b803210b0b411410222208450d06200841106a41002800bcc840360000200841086a41002900b4c840370000200841002900acc8403700002008411441281021220a450d07200a200b360014200441b8036a41186a22084200370300200441b8036a41106a220b4200370300200441b8036a41086a220c4200370300200442003703b803200a4118200441b8036a1000200441a0026a41186a2008290300370300200441a0026a41106a200b290300370300200441a0026a41086a200c290300370300200420042903b8033703a002200441003602c003200442013703b803200420013602980120044198016a200441b8036a103e024002400240024020042802bc03220c20042802c003220b6b20014f0d00200b20016a2208200b490d0c200c410174220e20082008200e491b220e4100480d0c200c450d0120042802b803200c200e102122080d020c0d0b20042802b80321080c020b200e10222208450d0b0b2004200e3602bc03200420083602b803200e210c0b2008200b6a200720011084041a200441a0026a41202008200b20016a10030240200c450d00200810200b200a102041012108200d450d00200710200b20042903082105200441b8036a200441306a41e8001084041a200441a0026a200441b8036a41086a41e0001084041a20044198016a41186a220a200641186a29030037030020044198016a41106a220b200641106a29030037030020044198016a41086a220c200641086a290300370300200420062903003703980141002101024020054201520d00200441c0056a41186a200a290300370300200441c0056a41106a200b290300370300200441c0056a41086a200c29030037030020042004290398013703c005410121010b20044198016a200441a0026a41e0001084041a200441e0056a41186a2206200441c0056a41186a220a290300370300200441e0056a41106a220b200441c0056a41106a220c290300370300200441e0056a41086a220d200441c0056a41086a220e290300370300200420042903c0053703e005200441a0026a20044198016a41e0001084041a200441a0056a41186a220f2006290300370300200441a0056a41106a2206200b290300370300200441a0056a41086a220b200d290300370300200420042903e0053703a005200441b8036a200441a0026a41e0001084041a200a200f290300370300200c2006290300370300200e200b290300370300200420042903a0053703c0054102210602402001450d00200441e0056a41186a200441c0056a41186a290300370300200441e0056a41106a200441c0056a41106a290300370300200441e0056a41086a200441c0056a41086a290300370300200420042903c0053703e005410121060b200441a2016a200441e0056a41086a290300370100200441aa016a200441e0056a41106a290300370100200441b2016a200441f8056a290300370100200420063a009901200441003a009801200420042903e00537019a012004200441b8036a20044198016a10a3012004280204210620042802002101200441003a00b803200420014100473a00b903200441b8036a103d0240024041cec6c000411041c8d7c400410041001001417f460d00200441003602b80341cec6c0004110200441b8036a41044100100141016a41044d0d0320042802b80341016a210a0c010b4101210a0b20044198016a41086a220b4200370300200442003703980141a0c7c000411720044198016a1002200441b8036a41086a200b29030037030020042004290398013703b80302400240200441b8036a411041c8d7c400410041001001417f460d002004410036029801200441b8036a411020044198016a41044100100141016a41044d0d04200428029801210b0c010b4100210b0b2004200a3602b80341cec6c0004110200441b8036a4104100320044198016a41086a220a4200370300200442003703980141a0c7c000411720044198016a1002200441b8036a41086a200a29030037030020042004290398013703b8032004417f2002200b6a220a200a2002491b36029801200441b8036a411020044198016a410410030240024002402001450d0002402006411b470d00200141e2acc200460d02200141e2acc200411b108604450d020b200041086a2006360200200041046a200136020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b200041046a4104360200200041013602002007452008720d100b200341046a280200450d0f200710200c0f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411441011023000b412841011023000b1024000b200e41011023000b411341011023000b413341011023000b200a41011023000b413341011023000b2000410136020020002007360204200441386a10930120032802002200450d010b200341046a280200450d002000102020044180066a24000f0b20044180066a24000bea1607017f027e037f017e017f037e047f23004180046b2202240002400240200129037022034202520d00200241086a20014188016a41e0001084041a420021030c010b20024186016a2001410b6a2d00003a0000200241e8006a41086a2001411c6a290200370300200241e8006a410d6a200141216a290000370000200220012f00093b018401200220012902143703682001410c6a280200210520012d0008210620012802102107200241c0016a200141e4006a290000370300200241b8016a200141dc006a290000370300200241b0016a200141d4006a290000370300200241a8016a200141cc006a290000370300200241a0016a200141c4006a29000037030020024188016a41106a2001413c6a29000037030020024188016a41086a200141346a2900003703002002200129002c3703880120012903002108200241c8016a41106a200141f0006a220941106a290300370300200241c8016a41086a200941086a290300370300200220092903003703c80120014180016a290300210a2001290378210b4200210c200241a8026a41086a22094200370300200242003703a80241cdc8c000410d200241a8026a1002200241086a41086a2009290300370300200220022903a80237030842002104024002400240024002400240024002400240024002400240200241086a411041c8d7c400410041001001417f460d00200242003703a802200241086a4110200241a8026a41084100100141016a41084d0d0120022903a80221040b024020034201520d00200b500d022004200a200a2004541b22032003200a7d200b827d210c0b200241a8026a200c10dd01200241fc016a41026a20022d00aa023a0000200241086a41086a2209200241bb026a290000370300200241086a410d6a220d200241c0026a290000370000200220022f01a8023b01fc01200220022900b30237030820022800ab02210e20022800af02210f200241e0016a410d6a200d290000370000200241e0016a41086a2009290300370300200220022903083703e001200241ec036a41026a220920024184016a41026a2d00003a0000200241a8026a41086a220d200241e8006a41086a290300370300200241a8026a410d6a2210200241e8006a410d6a290000370000200220022f0184013b01ec03200220022903683703a8020240024002400240024002400240200641ff01714101470d00200241f0036a2005410676103720022802f003210920022802f8032005413f7122054d0d01200241e8036a41026a200920054105746a220541026a2d00003a0000200241d0036a200541136a290000370300200241d5036a200541186a290000370000200220052f00003b01e8032002200529000b3703c80320052800072107200528000321054101210620022802f4030d020c030b200241e8036a41026a20092d00003a0000200241c8036a41086a200d290300370300200241c8036a410d6a2010290000370000200220022f01ec033b01e803200220022903a8023703c8030c030b4100210620022802f403450d010b200910200b2006450d010b200241f0036a41026a200241e8036a41026a2d00003a0000200241a8026a41086a200241c8036a41086a290300370300200241a8026a410d6a200241c8036a410d6a290000370000200220022f01e8033b01f003200220022903c8033703a802410021090c010b41012109411521074195a9c00021050b200241a4026a41026a2206200241f0036a41026a2d00003a0000200241086a41086a220d200241a8026a41086a2210290300370300200241086a41106a200241a8026a41106a290300370300200220022f01f0033b01a402200220022903a80237030802402009450d002000200536020420004101360200200041086a200736020020014188016a10920120024180046a24000f0b20024193026a200d29030037000020024198026a200241086a410d6a290000370000200220022f01a4023b018002200220073600870220022005360083022002200229030837008b02200220062d00003a008202200220083703a802201020014188016a41e000108404210d200241af036a200f360000200241ab036a200e360000200241a0036a200241c8016a41106a29030037030020024198036a2201200241c8016a41086a290300370300200241aa036a200241fc016a41026a2d00003a0000200241b3036a20022903e001370000200241bb036a200241e0016a41086a290300370000200241c0036a200241e0016a410d6a290000370000200220022903c80137039003200220022f01fc013b01a8032002410036021020024201370308200241a8026a200241086a109601200d200241086a1095010240024002400240024002402002290390034201520d0020012903002203420c882204420120044201561b22044200510d08200241a0036a2903002004802104200228020c2205200241106a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d0420022802082005200110212205450d050c0b0b0240200228020c200241106a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d0220022802082001200910212205450d030c090b200228020821050c090b200228020821050c0a0b2009102222050d060b200941011023000b2001102222050d060b200141011023000b419a88c00041331039000b41b0d0c400102f000b41f0c9c100102f000b2002200936020c20022005360208200241106a28020021010b200241106a200141016a360200200520016a41003a00000c020b2002200136020c20022005360208200241106a28020021010b200241106a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b024002400240200228020c2206200241106a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d0120022802082006200910212205450d020c040b200228020821050c040b2009102222050d020b200941011023000b1024000b2002200936020c20022005360208200241106a2802002101200921060b200520016a2209200241a8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241086a41186a22094200370300200241086a41106a22074200370300200241086a41086a220e42003703002002420037030820052001200241086a1000200241c8036a41186a2009290300370300200241c8036a41106a2007290300370300200241c8036a41086a200e290300370300200220022903083703c803200241c8036a412020024188016a20024180026a100d450d01200241c8036a412020024188016a20024180026a100e45210120060d020c030b2005200120024188016a20024180026a100d450d002005200120024188016a20024180026a100e45210120060d010c020b410121012006450d010b200510200b02402001450d00200241c8036a41186a20024180026a41186a290300370300200241c8036a41106a20024180026a41106a290300370300200241c8036a41086a20024180026a41086a29030037030020022002290380023703c80320022903a8022104200241086a200d41e0001084041a420121030c010b200041b4c0c00036020420004101360200200041086a411a360200200d10920120024180046a24000f0b200041086a2003370300200041306a2004370300200041106a20022903c803370300200041186a200241c8036a41086a290300370300200041206a200241c8036a41106a290300370300200041286a200241c8036a41186a290300370300200041386a200241086a41e0001084041a2000410036020020024180046a24000bec0203027f017e027f230041c0006b2201240002400240411310222202450d002002410f6a410028008ec940360000200241086a4100290087c940370000200241002900ffc84037000020024113413310212202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141206a41186a22004200370300200141206a41106a22044200370300200141206a41086a220542003703002001420037032020024133200141206a1000200141186a2000290300370300200141106a2004290300370300200141086a200529030037030020012001290320370300024002402001412041c8d7c400410041001001417f460d002001420037032020014120200141206a41084100100141016a41084d0d01200129032021030b20021020200141c0006a240020030f0b419a88c00041331039000b411341011023000b413341011023000b9e0604017f017e037f047e230041c0006b2202240042002103200241186a41086a220442003703002002420037031841c0eec000411b200241186a1002200241306a41086a220520042903003703002002200229031837033002400240024002400240200241306a411041c8d7c400410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841dbeec000411b200241186a1002200520042903003703002002200229031837033002400240200241306a411041c8d7c400410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b4200210a200241086a200320092001ad4200108804200241186a20002002290308220320087c2208200241086a41086a29030020077c2008200354ad7c410110aa02024020022802184101470d00200228021c2104200241c0006a240020040f0b200241186a41106a2903002108200241186a41086a220429030021072004420037030020024200370318418feec0004116200241186a1002200241306a41086a20042903003703002002200229031837033002400240200241306a411041c8d7c400410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d042004410f4d0d04200241206a29030021032002290318210a0c010b420021030b200241186a41086a2204420037030020024200370318418feec0004116200241186a1002200241306a41086a20042903003703002002200229031837033020024200200320087d200a200754ad7d2208200a20077d2207200a56200820035620082003511b22041b37032020024200200720041b370318200241306a4110200241186a41101003200241c0006a240041000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bdcc8010b027f017e097f047e017f027e017f017e207f077e027f23004190086b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410d4b0d00024002400240024002400240024020040e0e004505090d0c0608040b030a0102000b200341c0036a41086a200141106a2903003703002003200141086a29030022053703c0032005a72206417f6a220441064b0d49200241096a2800002107200241056a280000210820022d0001210920022d00002102024020040e0700201e1f1d2122000b4101210a200341c8036a280200210620032802c403210b200241ff017145200941ff0171410146712202450d2a02402006450d00200b10200b410021094101210c41012108410121060c310b200341a0076a200141086a41d8001084041a200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c00320034188026a200341a0076a200341c0036a10a401200328028c0221072003280288022104410021094101210d41012106410121084101210b4101210e4101210a4101210c0ca0010b200341d0026a41086a2001411c6a2902003703002003200141146a2902003703d002200141106a28020021072001410c6a2802002104200141086a2802002106200141246a3502002105200141286a310000210f20012802042109200341e0056a41086a22082002410a6a290100370300200341e0056a41106a220b200241126a290100370300200341e0056a41186a220e2002411a6a2901003703002003200241026a2901003703e00520022d0001210a20022d0000210220094101460d0c20094102470d48200341f0026a41086a200341d0026a41086a290300370300200320032903d0023703f00220034190036a41186a200341e0056a41186a29030037030020034190036a41106a200341e0056a41106a29030037030020034190036a41086a200341e0056a41086a290300370300200320032903e00537039003200241ff01710d0e200341b0036a41086a20034190036a41136a2900003703002003200329009b033703b003200a41ff01714101470d0e20032d009203210820032f019003210b20034190036a411f6a310000211020033500ab032111200328009703210e200328009303210a20034180056a41086a220c200341b0036a41086a2202290300370300200320032903b00337038005200341a0076a41086a2209200c29030037030020032003290380053703a007200341c0036a41136a20092903003700002003201120104220868422103e00db03200341c0036a411f6a20104220883c00002003200e3600c7032003200a3600c303200320032903a0073700cb032003200b20084110747222083b01c003200320084110763a00c20320024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d35200341a8036a420037030020034190036a41106a420037030020034190036a41086a42003703002003420037039003200341c0026a411020034190036a4120410010012202417f460d4f2002411f4d0d4f200341b0036a41086a220220034190036a41136a2900003703002003200329009b033703b00320034190036a411f6a3100002110200329009303211120033500ab03211220032f019003210920032d0092032108200341a0046a41086a220b2002290300370300200320083a00a207200320093b01a007200320032903b0033703a004200341a0076a411f6a20103c0000200341a0076a41136a200b290300370000200320123e00bb07200320113700a307200320032903a0043700ab070c360b200141086a28020021092001280204210620022d00000d0a4101210d20022d00014101470d0a200241096a280000210702402009450d00200610200b4100210c41012106410121084101210b4101210e4101210a41012109410121134100210420012802002202410d4d0d9f010ca0010b200341a0076a41206a200141246a290200370300200341a0076a41186a2001411c6a290200370300200341a0076a41106a200141146a290200370300200341a0076a41086a2001410c6a290200370300200320012902043703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341d8016a200341a0076a200341c0036a10a50120032802dc01210720032802d80121044100210a4101210d41012106410121084101210b4101210e0c9b010b200341d0026a41086a220b200141206a2902003703002003200141186a2902003703d002200141386a2903002110200141306a2903002111200141c8006a2903002112200141c0006a2903002114200141146a2802002107200141106a28020021042001410c6a2d00002113200141086a28020021092001410f6a2d00002106200141286a35020021052001412c6a310000210f20012f000d2108200341e0056a41086a220e2002410a6a290100370300200341e0056a41106a220a200241126a290100370300200341e0056a41186a220c2002411a6a2901003703002003200241026a2901003703e0052005200f4220868421052008200641107472210820022d0001210620022d0000210220094101460d0a20094102470d46200341c0066a41086a2209200341d0026a41086a290300370300200320032903d0023703c006200620027241ff01710d1420034190036a41086a2009290300370300200320032903c00637039003201341ff01714101470d1e200341c0036a2004410676103720032802c003210920032802c8032004413f7122024d0d2e200341b8036a200920024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210820022800072107200228000321044101210220032802c403450d90010c8f010b200341a0076a41386a200141c0006a290300370300200341a0076a41306a200141386a290300370300200341a0076a41286a200141306a290300370300200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341c8016a200341a0076a200341c0036a10a60120032802cc01210720032802c80121044100210b4101210d41012106410121080c97010b41dec6c0002104412d21074101210d20022d00000d930120022d000141ff01714102470d9301200141086a2903002105200341a0076a41086a22024200370300200342003703a00741f691c2004113200341a0076a1002200341c0036a41086a22042002290300370300200320032903a0073703c003200341c0036a411041c8d7c400410041001001417f470d4720024200370300200342003703a00741da95c200410d200341a0076a100220042002290300370300200320032903a0073703c003200341c0036a411041c8d7c400410041001001417f460d6f200342003703a007200341c0036a4110200341a0076a41084100100141016a41084d0d3e20032903a007500d6f200341a0076a41086a22024200370300200342003703a00741da95c200410d200341a0076a1002200341c0036a41086a22042002290300370300200320032903a0073703c0034200210f0240200341c0036a411041c8d7c400410041001001417f460d00200342003703a007200341c0036a4110200341a0076a41084100100141016a41084d0d4120032903a007210f0b20024200370300200342003703a00741fc95c2004117200341a0076a100220042002290300370300200320032903a0073703c003200341c0036a411041c8d7c400410041001001417f460d1f200342003703a007200341c0036a4110200341a0076a41084100100141016a41084d0d4120032903a007200f7c2005560d200c6f0b200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341d0016a200341a0076a200341c0036a10a70120032802d401210720032802d00121044100210e4101210d41012106410121084101210b0c96010b200341d4026a22082001410e6a2f01003b0100200341c0066a41086a220b200141206a290300370300200341c0066a41106a220e200141286a2903003703002003200128010a3602d0022003200141186a2903003703c006200141106a2903002105200141086a2d0000210420012d00092106200341c0036a41086a22072002410a6a290100370300200341c0036a41106a220a200241126a290100370300200341c0036a41186a220c2002411a6a2901003703002003200241026a2901003703c00320022d0001210920022d0000210220044101460d0b20044102460d0a20044103470d43200920027241ff01710d10200320063a00a007200341b0036a41086a22024200370300200342003703b00341a3a8c2004119200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a4110200341a0076a410110030c1c0b200341a0026a41086a200141186a290300370300200341a0026a41106a200141206a2903003703002003200141106a2903003703a002200141386a2903002110200141306a290300210f2001410c6a2802002108200141286a2903002105200141086a2802002104200341d0026a41086a200241106a290200370300200341d0026a41106a200241186a290200370300200341d0026a41186a200241206a2802003602002003200241026a2f01003b019e022003200241086a2902003703d0022004417f6a220441044b0d43200241046a280200210920022d0001210620022d00002102024020040e05000f0d0e0c000b200341e0056a41086a200341a0026a41106a290300370300200320032903a8023703e00520032802a402210720032802a0022104200341fe026a200341d0026a41086a29030037010020034186036a200341d0026a41106a2903003701002003418e036a200341e8026a2f01003b0100200320093601f202200320032f019e023b01f002200320032903d0023701f602200241ff01710d10200341b0036a41086a200341f0026a41136a290000370300200320032900fb023703b003200641ff01714101470d1020032d00f202210220032f01f0022109200341f0026a411f6a3100002111200335008b03211220032800f702210620032800f302210b200341a0076a41086a220e200341b0036a41086a220c290300370300200320032903b0033703a00720034180056a41086a220a200e290300370300200320032903a00737038005200341c0036a41136a200a2903003700002003201220114220868422113e00db03200341c0036a411f6a20114220883c0000200320063600c7032003200b3600c30320032003290380053700cb032003200920024110747222023b01c003200320024110763a00c20320034190036a41086a2202200341e0056a41086a290300370300200320032903e00537039003200841ff01714101470d34200341a0076a2004410676103720032802a007210620032802a8072004413f7122024d0d38200341b8036a200620024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210920022800072107200228000321044101210220032802a407450d690c680b41dec6c0002104412d21074101210d20022d00000d8f0120022d000141ff01714102470d8f01200141086a29030021054200210f200341b0036a41086a22024200370300200342003703b00341b7b0c0004110200341b0036a1002200341c0026a41086a22042002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f470d4420024200370300200342003703b00341cdc8c000410d200341b0036a100220042002290300370300200320032903b0033703c0020240200341c0026a411041c8d7c400410041001001417f460d00200342003703a007200341c0026a4110200341a0076a41084100100141016a41084d0d3c20032903a007210f0b200f2005540d45200341b0036a41086a22024200370300200342003703b00341b7b0c0004110200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200320053703a007200341c0026a4110200341a0076a41081003410021040c8f010b200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341c0016a200341a0076a200341c0036a10a80120032802c401210720032802c0012104410021084101210d410121060c90010b200341a0076a41306a200141386a290300370300200341a0076a41286a200141306a290300370300200341a0076a41206a200141286a290300370300200341a0076a41186a200141206a290300370300200341a0076a41106a200141186a290300370300200341a0076a41086a200141106a2903003703002003200141086a2903003703a007200341c0036a41206a200241206a280200360200200341c0036a41186a200241186a290200370300200341c0036a41106a200241106a290200370300200341c0036a41086a200241086a290200370300200320022902003703c003200341b8016a200341a0076a200341c0036a10a90120032802bc01210720032802b8012104410021064101210d0c8e010b41a4c6c0002104412a21074100210c4101210d02402009450d00200610200b41012106410121084101210b4101210e4101210a0c92010b20034190036a41186a200e29030037030020034190036a41106a200b29030037030020034190036a41086a2008290300370300200320032903e00537039003200241ff01710d02200341b0036a41086a220220034190036a41136a2900003703002003200329009b033703b003200a41ff01714101470d0220032d009203210420032f019003210920034190036a411f6a310000210520033500ab03210f2003280097032108200328009303210b20034180056a41086a220e2002290300370300200320032903b00337038005200341a0046a41086a2207200e29030037030020032003290380053703a004200341c0066a41136a20072903003700002003200f20054220868422053e00db06200341c0066a411f6a20054220883c0000200320083600c7062003200b3600c306200320032903a0043700cb062003200920044110747222043b01c006200320044110763a00c20620024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d2a200341a8036a420037030020034190036a41106a420037030020034198036a42003703002003420037039003200341c0026a411020034190036a4120410010012202417f460d432002411f4d0d43200341b0036a41086a220220034190036a41136a2900003703002003200329009b033703b00320034190036a411f6a3100002105200329009303210f20033500ab03211020032f019003210420032d0092032109200341c0036a41086a22082002290300370300200320093a00a207200320043b01a007200320032903b0033703c003200341a0076a411f6a20053c0000200341a0076a41136a2008290300370000200320103e00bb072003200f3700a307200320032903c0033700ab070c2b0b200341a0046a41086a200b290300370300200320032903d0023703a004200341f0026a41186a200c290300370300200341f0026a41106a200a290300370300200341f0026a41086a200e290300370300200320032903e0053703f002200241ff01710d02200341b0036a41086a2202200341f0026a41136a290000370300200320032900fb023703b003200641ff01714101470d0220032d00f202210920032f01f0022106200341f0026a411f6a310000210f200335008b03211220032800f702210b20032800f302210e200341a0076a41086a220a2002290300370300200320032903b0033703a00720034180056a41086a2202200a290300370300200320032903a00737038005200341c0066a41136a200229030037000020032012200f42208684220f3e00db06200341c0066a411f6a200f4220883c00002003200b3600c7062003200e3600c30620032003290380053700cb062003200620094110747222023b01c006200320024110763a00c20620034190036a41086a200341a0046a41086a290300370300200320032903a00437039003201341ff01714101470d24200341a0076a2004410676103720032802a007210920032802a8072004413f7122024d0d2b200341b8036a200920024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210820022800072107200228000321044101210220032802a407450d5f0c5e0b200341a0076a41086a20034180056a41086a29020037030020032003290280053703a007412a210741a4c6c00021040c5c0b200341a0046a41086a20034180056a41086a29020037030020032003290280053703a004412a210741a4c6c00021040c5a0b20034180056a41086a200341a0076a41086a290300370300200320032903a007370380050c080b200920027241ff01710d05200341b0036a41086a22024200370300200342003703b0034198d0c2004119200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200320053703a007200341c0026a4110200341a0076a410810030c110b200341e5056a20082f01003b0000200341f7056a200b290300370000200341e0056a411f6a200e2d00003a0000200320063a00e005200320053700e705200320032802d0023600e105200320032903c0063700ef05200341f0026a41186a200c290300370300200341f0026a41106a200a290300370300200341f0026a41086a2007290300370300200320032903c0033703f0020240200241ff01710d00200341b0036a41086a220220034183036a290000370300200320032900fb023703b003200941ff01714101470d0020032d00f202210920032f01f0022106200341f0026a411f6a3100002105200335008b03210f20032800f702210720032800f302210820034180056a41086a22042002290300370300200320032903b00337038005200341a0076a41086a2202200429030037030020032003290380053703a007200341a0046a41086a220b2002290300370300200320032903a0073703a0042004200b290300370300200320032903a00437038005200341a0076a41186a200341e0056a41186a290000370300200341a0076a41106a200341e0056a41106a2900003703002002200341e0056a41086a290000370300200320032900e0053703a007411210222202450d45200241106a41002f00efad423b0000200241086a41002900e7ad42370000200241002900dfad4237000020024112413210212202450d462002200620094110747222043b00122002200f20054220868422053e002d2002200736001920022008360015200220032903800537001d200241146a20044110763a0000200241316a20054220883c0000200241256a20034180056a41086a29030037000020034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413220034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002412010222204450d47200420032903a007370000200441186a200341a0076a41186a290300370000200441106a200341a0076a41106a290300370000200441086a200341a0076a41086a290300370000200341f0026a41202004412010032004102020021020410021040c85010b200341a0076a41086a20034180056a41086a29030037030020032003290380053703a0070c060b41aaa9c000210441c0002107200241ff0171450d830120094104490d8301411210222202450d3d200241106a41002f0098a7433b0000200241086a4100290090a74337000020024100290088a74337000020024112412410212202450d3e2002200836001220034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002411620034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002200341f0026a412041c8d7c4004100410010012104200210202004417f460d20200341b0036a41086a22024200370300200342003703b0034194c9c3004112200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c00241002104200341c0026a411041c8d7c400410041001001417f460d26200342103702c4032003200341c0026a3602c003200341a0076a200341c0036a10aa0120032802a007220c450d48200341a8076a280200210420032902a4072205422088a722022005a7460d2720032802a40721130c4a0b200620027241ff01710d02200341b0026a290300210f20032903a802211020032802a0022106200341b0036a41086a22024200370300200342003703b00341afcac3004115200341b0036a1002200341c0026a41086a22042002290300370300200320032903b0033703c002410410222209450d4020092008360000200341c0026a41102009410410032009102020024200370300200342003703b0034193cac300411c200341b0036a100220042002290300370300200320032903b0033703c0022003200f3703a807200320103703a007200341c0026a4110200341a0076a4110100320024200370300200342003703b00341e8c8c3004114200341b0036a100220042002290300370300200320032903b0033703c002200320053703a007200341c0026a4110200341a0076a4108100320024200370300200342003703b00341a6c9c300410d200341b0036a100220042002290300370300200320032903b0033703c002410410222202450d4120022006360000200341c0026a4110200241041003200210200c0e0b41aaa9c000210441c0002107200241ff0171450d810120094102490d8101411210222202450d3d200241106a41002f0098a7433b0000200241086a4100290090a74337000020024100290088a74337000020024112412410212202450d3e2002200836001220034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002411620034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002200341f0026a412041c8d7c400410041001001417f460d1d20034220370294032003200341f0026a36029003200341a0076a20034190036a10ab0120032903a0074201520d4420032802a8072104200341c0066a200341ac076a41dc001084041a200341f0026a41201009200341e0056a200341c0066a41dc001084041a20034180056a200341e0056a41dc001084041a20021020200341a0046a20034180056a41dc001084041a200320043602c003200341c0036a410472200341a0046a41dc001084041a200341f8016a200341c0036a41206a20032903d003200341d8036a29030010ac0120032903f80120034180026a29030010ad010c0d0b200620027241ff0171450d0b0b41fcc5c0002104412821070c7f0b20034180056a41086a200341a0076a41086a290300370300200320032903a007370380050b412a210741a4c6c00021040c7d0b200341c8036a280200210620032802c4032108200920027241ff0171450d0e41fcc5c0002104412821072006450d4e200810200c4e0b4101210a200341c8036a280200210b20032802c403210e200241ff017145200941ff0171410146712202450d0a0240200b450d00200e10200b410021064101210c41012108410121090c130b200920027241ff0171450d0d0c4b0b41dec6c000410041dec6c000200941ff01714102461b200241ff01711b2104412d21074101210a4101210c41012108410121060c090b200341cc036a2802002108200341c8036a280200210e20032802c403210b200920027241ff0171450d0c02402008450d00200841186c2104200b210203400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200441686a22040d000b0b410021094101210a200e450d010c470b200341c0036a410c6a2802002108200341c8036a280200210e20032802c403210b200920027241ff0171450d0c02402008450d002008410c6c2104200b210203400240200241046a280200450d00200228020010200b2002410c6a2102200441746a22040d000b0b410121094100210a200e0d460b4100210e0c460b200341b0036a41086a20034190036a41086a29030037030020032003290390033703b0030c720b200341a0026a41086a290300210520032903a002210f200341b0036a41086a22024200370300200342003703b00341fca6c300410c200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200320053703a8072003200f3703a007200341c0026a4110200341a0076a411010030b410021040c730b4203200f7c2005580d4f0b41f494c200102f000b200841a4c6c00020021b2104412a2107410021060240200b450d00200e10200b4101210c410121080b410121090c080b200841a4c6c00020021b2104412a21074100210902402006450d00200b10200b4101210c41012108410121060c070b41baa3c00041052008200341cc036a28020010034101210a02402006450d00200810200b410021084101210c0c040b200341c0036a41086a2903002105410810222202450d302002200537000041b0a3c000410a20024108100320021020410021044101210a4101210c4101210841012106410121090c050b0240200841186c2202450d00200b20026a2104200b210203402002280200200241086a2802002002410c6a280200200241146a2802001003200241186a22022004470d000b0b02402008450d00200841186c2104200b210203400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200441686a22040d000b0b4101210a0240200e450d00200b10200b4100210c0c010b02402008410c6c2202450d00200b20026a2104200b210203402002280200200241086a28020010092002410c6a22022004470d000b0b02402008450d002008410c6c2104200b210203400240200241046a280200450d00200228020010200b2002410c6a2102200441746a22040d000b0b4101210c0240200e450d00200b10200b4100210a0b410121080b41012106410121090b410021040b02400240024020032802c003417f6a220241064b0d0002400240024020020e07003e0103040502000b2009450d3d200341c8036a280200450d3d20032802c40310200c3d0b2006450d3c200341c8036a280200450d3c20032802c40310200c3c0b200a450d3b0240200341c0036a410c6a2802002209450d0020032802c40321022009410c6c210903400240200241046a280200450d00200228020010200b2002410c6a2102200941746a22090d000b0b200341c8036a280200450d3b20032802c40310200c3b0b200341c0036a1094010c3a0b2008450d39200341c8036a280200450d3920032802c40310200c390b200c450d380240200341c0036a410c6a2802002209450d0020032802c4032102200941186c210903400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200941686a22090d000b0b200341c8036a280200450d3820032802c40310200c380b4100210220032802c4030d600c610b200341b0036a41086a20034190036a41086a29030037030020032003290390033703b0030c3b0b200341e0056a200341c0066a41dc001084041a200210200b41dacac3002104411921070c620b200341b8076a4200370300200341a0076a41106a420037030020094200370300200342003703a0070b0240200341c0036a200341a0076a4120108604450d0041f2d2c2002104413121070c350b20034190036a41086a2202200341f0026a41086a290300370300200320032903f00237039003200641ff01714101470d06200341a0076a2004410676103720032802a007210620032802a8072004413f7122024d0d0a200341b8036a200620024105746a220241136a2900003703002003200229000b3703b003200235001b2002411f6a31000042208684210520022f0000200241026a2d000041107472210920022800072107200228000321044101210220032802a407450d290c280b200341b8076a4200370300200341b0076a4200370300200341a8076a4200370300200342003703a0070b0240200341c0066a200341a0076a4120108604450d0041c8d2c2002104412221070c320b200341a0076a200641e0001084041a41002104200341003b01c00320034190026a200341a0076a200341c0036a10a3012003200328029002453a00a2072003410c3b01a007200341a0076a103d200610200c2a0b4100210220032802a4070d320c330b4104210c410021020b200241016a22092002490d3920024101742206200920092006491b2213ad4202862205422088a70d392005a722094100480d392002450d02200c200241027420091021220c450d030c210b200c200229030037030020032003290390033703b003200841087621090c350b2005200f422086842105200341b0036a41086a200229030037030020032003290390033703b003200641087621090c230b20091022220c0d1e0b200941041023000b4100210220032802a4070d2f0c300b4100210220032802a4070d1d0c1e0b1046000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200341b4076a4101360200200341033602c406200341eca1c4003602c006200342013702a407200341f4a1c4003602a0072003200341c0066a3602b007200341a0076a41c0a3c0001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41a4d3c2001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41a0c1c1001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41b4d3c2001048000b200341b4076a41013602002003410336028405200341eca1c40036028005200342013702a407200341f4a1c4003602a007200320034180056a3602b007200341a0076a41f4cac3001048000b41ac94c200102f000b41dcb0c000102f000b41f0b1c000102f000b419a88c00041331039000b419a88c00041331039000b411241011023000b412441011023000b411241011023000b412441011023000b410441011023000b410441011023000b411241011023000b413241011023000b412041011023000b419a88c00041331039000b410841011023000b419a88c00041331039000b200421020b200c20024102746a2008360200200341b0036a41086a22024200370300200342003703b0034194c9c3004112200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341003602a807200342013703a0072003200441016a22023602c003200341c0036a200341a0076a103e0240024002402002450d00200441027441046a210e4100200341a0076a41086a220a28020022026b210420032802a4072106200c21090340200928020021070240024002400240200620046a41044f0d00200241046a22082002490d1e2006410174220b20082008200b491b220b4100480d1e2006450d0120032802a0072006200b102122080d020c070b20032802a00721080c020b200b10222208450d050b2003200b3602a407200320083602a007200b21060b200941046a2109200a200241046a220b360200200820026a20073600002004417c6a2104200b2102200e417c6a220e0d000c020b0b200341a0076a41086a280200210b20032802a407210620032802a00721080b200341c0026a41102008200b100302402006450d00200810200b4100210402402013450d00200c10200b0c390b200b41011023000b200610200b20020d0041012102411521074195a9c00021040c010b200341a0076a41086a200341b0036a41086a290300370300200320032903b0033703a007410021020b200341a0046a41086a2206200341a0076a41086a290300370300200320032903a0073703a00420020d0820034180056a41086a2006290300370300200320032903a004370380054200210f200341b0036a41086a22024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c0024100210202400240200341c0026a411041c8d7c400410041001001417f460d00200341a8036a420037030020034190036a41106a420037030020034198036a42003703002003420037039003200341c0026a411020034190036a4120410010012202417f460d032002411f4d0d03200341b0036a41086a2202200341a3036a2900003703002003200329009b033703b00320034190036a411f6a310000210f2003280097032108200328009303210b20033500ab03211020032f019003210620032d009203210e200341a0076a41086a2002290300370300200320032903b0033703a0072006200e4110747221022010200f42208684210f0c010b200341a8076a4200370300200342003703a0074100210b410021080b200341c0066a41086a220e200341a0076a41086a2206290300370300200320032903a0073703c006200341c1076a200f4220883c0000200341bd076a200f3e0000200341a9076a2008360000200341ad076a20032903c006370000200341b5076a200e2903003700002003200b3600a5072003418c023b01a007200320023b01a207200320024110763a00a407200341a0076a103d200620034180056a41086a29030037030020032003290380053703a007200341b0036a41086a22024200370300200342003703b00341ead2c2004108200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002412010222202450d02200220093b0000200220053e001b2002200736000720022004360003200220032903a00737000b200241026a20094110763a00002002411f6a20054220883c0000200241136a2006290300370000200341c0026a411020024120100320021020410021040b0c070b419a88c00041331039000b412041011023000b200b10200b2006417f6a220241064b0d0041fcc5c00021044128210702400240024020020e0702040203020100020b200a450d032008450d012008410c6c2109200b210203400240200241046a280200450d00200228020010200b2002410c6a2102200941746a22090d000c020b0b2009450d022008450d00200841186c2109200b210203400240200241046a280200450d00200228020010200b0240200241106a280200450d002002410c6a28020010200b200241186a2102200941686a22090d000b0b200e450d01200b10200c010b200341c0036a10940141fcc5c0002104412821070b410121064100210d0c2f0b2006109201200610200b410021134101210d41012106410121084101210b4101210e4101210a4101210c4101210920012802002202410d4d0d340c350b200910200b20020d00410121024195a9c0002104411521070c010b200341a0076a41086a200341b0036a41086a290300370300200320032903b0033703a007410021020b20034180056a41086a2209200341a0076a41086a290300370300200320032903a0073703800520020d27200320053e00db03200341df036a20054220883c0000200341d3036a2009290300370000200320073600c703200320043600c30320032003290380053700cb03200320083b01c003200320084110763a00c203024002400240411410222202450d00200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef4037000020024114413410212202450d01200220032903c0063700142002412c6a200341c0066a41186a290300370000200241246a200341c0066a41106a2903003700002002411c6a200341c0066a41086a2903003700004200210520034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413420034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002024002400240200341f0026a412041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341f0026a4120200341a0076a4110410010012204417f460d022004410f4d0d02200341a8076a290300210f20032903a00721052002102041142104411410222202450d010c050b4200210f20021020411421044114102222020d040b200441011023000b419a88c00041331039000b411441011023000b413441011023000b200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef403700000240024002400240024020022004413410212202450d00200220032903c0033700142002412c6a200341c0036a41186a290300370000200241246a200341c0036a41106a2903003700002002411c6a200341c0036a41086a29030037000020034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413420034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002024002400240200341f0026a412041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341f0026a4120200341a0076a4110410010012204417f460d022004410f4d0d02200341a8076a290300211420032903a00721170c010b42002117420021140b20021020200341b0036a41086a22024200370300200342003703b0030240024002400240201720148422384200510d0041e3c0c1004114200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d02200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d062002410f4d0d06200341a8076a29030021390c010b41cfc0c1004114200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d01200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d062002410f4d0d06200341a8076a29030021390b20032903a007213a0c010b4200213a420021390b02402011203a7c223c2011542202201020397c2002ad7c221220105420122010511b450d004128210741f7c0c10021040c2e0b02402005203c7d223b200556200f20127d2005203c54ad7d2205200f562005200f511b450d00411d2107419aaac30021040c2e0b20384200520d05200341b0036a41086a22024200370300200342003703b00341a5eec000411b200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002200341c0026a411041c8d7c400410041001001417f460d05200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d042002410f4d0d0420032903a007201156200341a8076a290300220f201056200f2010511b450d05411f210741b7aac30021040c2d0b419a88c00041331039000b413441011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200341b0016a200341c0066a4102203b200510ae01024020032802b0012204450d0020032802b40121070c280b0240201720117c22122017542202201420107c2002ad7c220f201454200f2014511b450d00412d210741d6aac30021040c280b200341c0066a200341c0036a4120108604450d26200341c0066a203b200510af0102400240411410222202450d00200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef4037000020024114413410212202450d01200220032903c0033700142002412c6a200341c0036a41186a2208290300370000200241246a200341c0036a41106a2903003700002002411c6a200341c0036a41086a2903003700004200210520034190036a41186a2204420037030020034190036a41106a2209420037030020034190036a41086a2206420037030020034200370390032002413420034190036a1000200341f0026a41186a2004290300370300200341f0026a41106a2009290300370300200341f0026a41086a200629030037030020032003290390033703f002200341f0026a412041c8d7c40041004100100121042002102002402004417f470d00200341c0036a103a200341d8076a200f370300200341d0076a2012370300200341a0076a41086a41003a0000200341a9076a20032903c003370000200341b1076a200341c0036a41086a290300370000200341b9076a200341d0036a290300370000200341c1076a2008290300370000200341023a00a007200341a0076a103d0b200341c0036a2012200f10af01200341b0036a41086a22024200370300200342003703b003418feec0004116200341b0036a1002200341c0026a41086a22042002290300370300200320032903b0033703c002024002400240200341c0026a411041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012209417f460d022009410f4d0d02200341a8076a290300210f20032903a00721050c010b4200210f0b20024200370300200342003703b003418feec0004116200341b0036a100220042002290300370300200320032903b0033703c00220034200200f20397d2005203a54ad7d22122005203a7d22142005562012200f562012200f511b22021b3703a80720034200201420021b3703a007200341c0026a4110200341a0076a41101003200341a0076a41086a41023a0000200341a9076a20032903c006370000200341b1076a200341c0066a41086a290300370000200341b9076a200341c0066a41106a290300370000200341c1076a200341c0066a41186a290300370000200341c9076a20032903c003370000200341d1076a200341c0036a41086a290300370000200341d9076a200341c0036a41106a290300370000200341e1076a200341c0036a41186a290300370000200341023a00a00720034188086a203937030020034180086a203a370300200341f8076a2010370300200341f0076a2011370300200341a0076a103d0c290b419a88c00041331039000b411441011023000b413441011023000b200610200b20020d0041012102411521074195a9c00021040c010b200341a0076a41086a200341b0036a41086a290300370300200320032903b0033703a007410021020b20034180056a41086a2206200341a0076a41086a290300370300200320032903a0073703800520020d23200341a0046a41086a200629030037030020032003290380053703a004200341b0036a41086a22024200370300200342003703b0034193cac300411c200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002024002400240024002400240024002400240200341c0026a411041c8d7c400410041001001417f460d00200342003703a807200342003703a007200341c0026a4110200341a0076a4110410010012202417f460d022002410f4d0d02200341a8076a290300211120032903a00721120c010b42002112420021110b200341b0036a41086a22024200370300200342003703b00341afcac3004115200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002024002400240200341c0026a411041c8d7c400410041001001417f460d00200341003602a007200341c0026a4110200341a0076a41044100100141016a41044d0d0220033502a00721140c010b420021140b200341e0016a200f420020144200108804200341f0016a200341c0036a201242edeb82bdef980420032903e00142c0843d8020032903e8014200521b2214201420125420114200522011501b22021b22122011420020021b221110b001024020032802f001450d0041f9c9c3002104411a21070c2c0b200341b0036a41086a22024200370300200342003703b00341c4cac3004116200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c002410021060240200341c0026a411041c8d7c400410041001001417f460d00200341003602a007200341c0026a4110200341a0076a41044100100141016a41044d0d0320032802a00721060b200341b0036a41086a22024200370300200342003703b00341c4cac3004116200341b0036a1002200341c0026a41086a2002290300370300200320032903b0033703c0022003200641016a3602a007200341c0026a4110200341a0076a41041003200341a0076a41186a200341c0036a41186a290300370300200341a0076a41106a200341c0036a41106a290300370300200341a0076a41086a200341c0036a41086a290300370300200341c0066a41086a200341a0046a41086a290300370300200320032903c0033703a007200320032903a0043703c006411210222202450d03200241106a41002f0098a7433b0000200241086a4100290090a74337000020024100290088a74337000020024112412410212208450d042008200636001220034190036a41186a2202420037030020034190036a41106a220b420037030020034190036a41086a220e420037030020034200370390032008411620034190036a1000200341f0026a41186a2002290300370300200341f0026a41106a200b290300370300200341f0026a41086a200e29030037030020032003290390033703f002412010222202450d05200220032903a007370000200241186a200341a0076a41186a290300370000200241106a200341a0076a41106a290300370000200241086a200341a0076a41086a2903003700002002412041c00010212202450d062002200f370020200241286a2010370000200241c00041800110212202450d07200220093b0030200220053e004b200220123700502002200736003720022004360033200220032903c00637003b200241326a20094110763a0000200241cf006a20054220883c0000200241d8006a2011370000200241c3006a200341c0066a41086a290300370000200341f0026a4120200241e00010032002102020081020200341ac076a200636020041002104200341a0076a41086a41003a00002003410a3a00a007200341a0076a103d0c2b0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411241011023000b412441011023000b412041011023000b41c00041011023000b41800141011023000b200341a0076a41086a22024200370300200342003703a00741da95c200410d200341a0076a1002200341c0036a41086a22042002290300370300200320032903a0073703c003200320053703a007200341c0036a4110200341a0076a41081003200341013a00c00620024200370300200342003703a00741f691c2004113200341a0076a100220042002290300370300200320032903a0073703c003200341c0036a4110200341c0066a4101100320024200370300200342003703a00741fc95c2004117200341a0076a1002200341b0036a41086a2002290300370300200320032903a0073703b00302400240200341b0036a411041c8d7c400410041001001417f460d00200342003703a007200341b0036a4110200341a0076a41084100100141016a41084d0d0a20032903a007210f0c010b4203210f0b200341a0076a41086a22024200370300200342003703a0074195b0c0004112200341a0076a1002200341c0026a41086a22092002290300370300200320032903a0073703c002410021044101210d02400240200341c0026a411041c8d7c400410041001001417f460d00200342003703a007200341c0026a4110200341a0076a41084100100141016a41084d0d0b20032903a0072110410021060c010b410121060b20024200370300200342003703a0074195b0c0004112200341a0076a100220092002290300370300200320032903a0073703c002200320053703a007200341c0026a4110200341a0076a410810032010500d2320060d23427f200f200f7c22112011200f541b220f4200510d182005200f8022052010200f80220f580d192005200f42017c2210510d2342002115200341a0076a41086a22024200370300200342003703a00741cdadc2004112200341a0076a1002200341c0026a41086a2002290300370300200320032903a0073703c00202400240200341c0026a411041c8d7c400410041001001417f460d00200342103702c4032003200341c0026a3602c003200341a0076a200341c0036a103820032802a0072216450d1e20032902a40721150c010b410121160b02402005200f427f857ca72218450d002015422088a7221920184d0d002010a7211a200341a0076a41096a211b200341c0066a410472211c200341c0036a41286a211d200341c0036a41206a211e200341c0036a41246a211f200341d8076a2120200341a0076a412c6a2121410021220340200341a0026a41186a20162022201a6a2019704105746a220241186a290000370300200341a0026a41106a200241106a290000370300200341a0026a41086a200241086a290000370300200320022900003703a002200341c0036a200341a0026a10b1010240201e2802002240450d00200341c0066a41086a201d41086a290300370300200341c0066a41106a201d41106a290300370300200341c0066a41186a201d41186a290300370300200341c0066a41206a201d41206a2802003602002003201d2903003703c006201f280200213f200341d0026a41186a2223201c41186a290000370300200341d0026a41106a2224201c41106a290000370300200341d0026a41086a2225201c41086a2900003703002003201c2900003703d002200341a0076a41086a22084200370300200342003703a00741e5ecc3004115200341a0076a1002200341b0036a41086a222d2008290300370300200320032903a0073703b0030240024002400240200341b0036a411041c8d7c400410041001001417f470d0041014100200341d0026a105c0d020c010b200342103702e4052003200341b0036a3602e005200341a0076a200341e0056a103820032802a0072202450d1520022008280200200341d0026a105c2104024020032802a407450d00200210200b20040d010b411210222202450d15200241106a41002f008aed4322043b0000200241086a4100290082ed432205370000200241002900faec43220f37000020024112413210212202450d16200220032903d0023700122002412a6a2023290300370000200241226a20242903003700002002411a6a2025290300370000200341e0056a41186a22264200370300200341e0056a41106a22274200370300200341e0056a41086a22284200370300200342003703e00520024132200341e0056a1000200341a0076a41186a22292026290300370300200341a0076a41106a222a202729030037030020082028290300370300200320032903e0053703a00702400240200341a0076a412041c8d7c400410041001001417f460d00200341003602e005200341a0076a4120200341e0056a41044100100141016a41044d0d1120032802e005212b200210204112102222020d010c190b4100212b20021020411210222202450d180b200241106a20043b0000200241086a20053700002002200f37000020024112413210212202450d18200220032903d0023700122002412a6a2023290300370000200241226a20242903003700002002411a6a2025290300370000202642003703002027420037030020284200370300200342003703e00520024132200341e0056a100020292026290300370300202a202729030037030020082028290300370300200320032903e0053703a0072003202b41016a222c3602e005200341a0076a4120200341e0056a410410032002102020084200370300200342003703a007418cedc3004119200341a0076a1002202d2008290300370300200320032903a0073703b00302400240200341b0036a411041c8d7c400410041001001417f460d00200341003602a007200341b0036a4110200341a0076a41044100100141016a41044d0d1220032802a007212e0c010b4100212e0b200341a0046a41186a22022023290300370300200341a0046a41106a22042024290300370300200341a0046a41086a22092025290300370300200320032903d0023703a0044200211120084200370300200342003703a00741cdc8c000410d200341a0076a1002202d2008290300370300200320032903a0073703b0030240200341b0036a411041c8d7c400410041001001417f460d00200342003703a007200341b0036a4110200341a0076a41084100100141016a41084d0d0d20032903a00721110b20034180056a41186a222f200229030037030020034180056a41106a2230200429030037030020034180056a41086a22312009290300370300200320032903a0043703800520084200370300200342003703a00741a5edc3004117200341a0076a1002202d2008290300370300200320032903a0073703b003024002400240024002400240200341b0036a411041c8d7c400410041001001417f460d00200342103702a4072003200341b0036a3602a007200341a8016a200341a0076a108e0120032802a801450d0d20032802ac012232ad42307e2205422088a70d182005a72202417f4c0d182002450d012002102222130d020c250b2026202f2903003703002027203029030037030041082113200341e0056a41086a220220034180056a41086a29030037030020032003290380053703e00520292026290300370300202a2027290300370300200341a0076a41086a2002290300370300200320032903e0053703a0074100210b420021100c020b410821130b024002402032450d00200828020021064100210b20032802a407210e20032802a007210a4100210941002102203221330340202642003703002027420037030020284200370300200342003703e00520084100200a200e200341e0056a41202006100122042004417f461b220441202004412049220c1b20066a2204360200200c0d0c20034190036a41186a2234202629030037030020034190036a41106a2235202729030037030020034190036a41086a22362028290300370300200320032903e00537039003200342003703e00520084100200a200e200341e0056a41082004100122062006417f461b2206410820064108491b20046a2204360200200641074d0d0c20032903e0052105200341003602e00520084100200a200e200341e0056a41042004100122062006417f461b220c4104200c4104491b20046a2206360200200c41034d0d0c200241016a210420032802e005210c200341f0026a41186a22372034290300370300200341f0026a41106a22342035290300370300200341f0026a41086a2235203629030037030020032003290390033703f002024020022033470d00200b20042004200b491b2233ad42307e220f422088a70d0c200fa722364100480d0c02402002450d00201320092036102122130d010c130b203610222213450d120b201320096a22022005370300200241206a2037290300370300200241186a2034290300370300200241106a2035290300370300200241086a20032903f002370300200241286a200c360200200b41026a210b200941306a21092004210220042032490d000c020b0b41002104410021330b2013450d0a2026202f290300370300202720302903003703002028203129030037030020032003290380053703e00502402004ad4220862033ad842210422088a7220b4120490d0041302102200b41306c21062013ad422086210f4201210520132109034002402009290300201320026a2204290300580d002004ad422086200584210f200421090b200542017c21052006200241306a2202470d000b2009450d1f200f42ffffffff0f580d1f20292026290300370300202a202729030037030020082028290300370300200320032903e0053703a007200b200fa722024d0d242013200241306c6a22022011370300200241206a2029290300370300200241186a202a290300370300200241106a2008290300370300200220032903a007370308200241013602280c030b20292026290300370300202a202729030037030020082028290300370300200320032903e0053703a0072010a7200b470d010b200b4101742202200b41016a220420042002491bad220542307e220f422088a70d07200fa722024100480d0702400240200b450d002013200b41306c2002102122130d010c200b200210222213450d1f0b2010422088a7210b200521100b2013200b41306c6a22022011370300200241206a2029290300370300200241186a202a290300370300200241106a2008290300370300200220032903a00737030820024101360228201042ffffffff0f83200b41016aad4220868421100b20084200370300200342003703a00741a5edc3004117200341a0076a1002202d2008290300370300200320032903a0073703b00320084100360200200342013703a00720032010422088a722023602e005200341e0056a200341a0076a103e024002402002450d00200241306c210a4158200828020022026b210b2002412c6a210220032802a407210920132104034002400240024002402009200b6a41286a41204f0d00200241546a220e41206a2206200e490d0c2009410174220e20062006200e491b220e4100480d0c2009450d0120032802a0072009200e102122060d020c0f0b20032802a00721060c020b200e10222206450d0d0b2003200e3602a407200320063602a007200e21090b2008200241746a220c360200200620026a220e416c6a200441206a290000370000200e41646a200441186a290000370000200e415c6a200441106a290000370000200e41546a200441086a2900003700002004290300210502400240024002402009200b6a220e41086a200e4f0d00200c41086a220e200c490d0c2009410174220c200e200e200c491b220e4100480d0c2009450d0120062009200e102122060d020c100b2009210e0c020b200e10222206450d0e0b2003200e3602a407200320063602a0070b20082002417c6a2209360200200620026a41746a2005370000200441286a280200210c0240024002400240200e200b6a41034b0d00200941046a22342009490d0c200e4101742209203420342009491b22094100480d0c200e450d012006200e2009102122060d020c110b200e21090c020b200910222206450d0f0b200320093602a407200320063602a0070b200441306a210420082002360200200620026a417c6a200c360000200b41546a210b2002412c6a2102200a41506a220a0d000c020b0b20032802a407210920032802a00721060b200341b0036a411020062008280200100302402009450d00200610200b02402010a7450d00201310200b411210222202450d19200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d1a200220032903d0023700122002412a6a2023290300370000200241226a20242903003700002002411a6a2025290300370000202642003703002027420037030020284200370300200342003703e00520024132200341e0056a100020292026290300370300202a202729030037030020082028290300370300200320032903e0053703a007024002400240200341a0076a412041c8d7c400410041001001417f460d00200342203702e4052003200341a0076a3602e005200341a0016a200341e0056a108e0120032802a001450d1620032802a401210420034188016a200341e0056a108c01200328028801450d1620021020410a2102200441094d0d010c020b20021020410321040b200421020b0240024002400240202c2002202e6a4d0d00200341a0076a200341d0026a10b2012008290300210520032903a007210f0240200341a0076a41246a2206280200450d00200341a0076a41206a28020010200b20084200370300200342003703a00741e0edc3004114200341a0076a1002202d2008290300370300200320032903a0073703b003200341b0036a411041c8d7c400410041001001417f460d01200341003602a007200341b0036a4110200341a0076a41044100100141016a41044d0d1520033502a00721100c020b202620232903003703002027202429030037030020282025290300370300200320032903d0023703e005410121020c020b42c0843d21100b200341c8006a200f420020104200108804200341d8006a4289f48bdcc4002003290348428094ebdc038020032903504200521b42002002108904200341d8006a41086a290300211020032903582111200341a0076a200341d0026a10b201200341e8006a200341d0026a20032903a0072238200f2011200241ff004b200f201154200520105420052010511b7222021b22392038203954200829030022172005201020021b223a542017203a511b22021b2211202a290300223b203b2011562029290300223c2017203a20021b221056203c2010511b22021b22122010203c20021b221410b301200341e8006a41086a29030021052003290368210f02402003290378223d20127d223e20117c2211200341e8006a41186a29030020147d203d201254ad7d20107c2011203e54ad7c221284500d002038203b7d22142017203c7d2038203b54ad7d221784500d00200341a0076a41286a2802002204450d00200341a0076a41206a2802002202200441306c6a21090340200341186a2002290300200241086a29030020112012108804200341086a2003290318200341186a41086a29030020142017108704200341286a200241106a2003290308200341086a41086a29030010b301427f2005200341286a41086a2903007c200f20032903287c2210200f542204ad7c220f2004200f200554200f2005511b22041b2105427f201020041b210f200241306a22022009470d000b0b200f200510ad0102402006280200450d00200341a0076a41206a28020010200b200341d0026a10b40120084200370300200342003703a00741f4edc3004115200341a0076a1002202d2008290300370300200320032903a0073703b003200341b0036a411041c8d7c40041001003200341003a00e00520084200370300200342003703a00741a3a8c2004119200341a0076a1002202d2008290300370300200320032903a0073703b003200341b0036a4110200341e0056a41011003202620232903003703002027202429030037030020282025290300370300200320032903d0023703e005410221020b2020203a370300200341a0076a41306a2039370300200820023a0000201b20032903e0053700002021202b360200201b41086a2028290300370000201b41106a2027290300370000201b41186a2026290300370000200341043a00a007200341a0076a103d203f0d010c020b203f450d010b204010200b202241016a22222018470d000b0b410021042015a7450d23201610200c230b1024000b2033450d00201310200b419a88c00041331039000b200e41011023000b200e41011023000b200941011023000b203641081023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b1031000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b411241011023000b413241011023000b411241011023000b413241011023000b41bcedc30041131039000b200241081023000b41ecb5c000102f000b41e8b6c000102f000b200241081023000b41d0edc3002002200b10b501000b419a88c00041331039000b200910200b20020d0041012102411521074195a9c00021040c010b200341c0036a41086a200341b0036a41086a290300370300200320032903b0033703c003410021020b20034180056a41086a2209200341c0036a41086a290300370300200320032903c0033703800520020d01200320053e00bb07200341bf076a20054220883c0000200341b3076a2009290300370000200320073600a707200320043600a30720032003290380053700ab07200320083b01a007200320084110763a00a207200341a0076a2011201010af01200341a0076a2014201210b6010b410021044101210d41012106410121084101210b4101210e4101210a4101210c410121094101211320012802002202410d4d0d090c0a0b4101210d0b410121060b410121080b4101210b0b4101210e0b4101210a0b4101210c0b410121090b4101211320012802002202410d4b0d010b024002400240024002400240024002400240024002400240024020020e0e0e050e0e0e03070206000e010e040e0b200a450d0d20012d00044101470d0d2001410c6a2201280200109301200128020010200c0d0b200c450d0c200141086a280200450d0c200128020410200c0c0b200b450d0b200141086a28020022024102460d0520024101470d0b200141106a280200450d0b2001410c6a28020010200c0b0b2006450d0a200141086a2d00002202410e4b0d0820024106470d0a200141106a280200450d0a2001410c6a28020010200c0a0b2009450d09200141086a2d000022024104460d0620024103460d0520024102470d09200141106a280200450d092001410c6a28020010200c090b200d450d08200141086a1094010c080b200e450d07200141086a2d00004101470d072001410c6a2201280200109301200128020010200c070b2008450d06200141086a2d000022024105460d0120024101470d062001410c6a2201280200109301200128020010200c060b200141106a280200450d052001410c6a28020010200c050b2001410c6a2201280200109301200128020010200c040b200141346a280200450d03200141306a28020010200c030b200141306a280200450d022001412c6a28020010200c020b200141106a280200450d012001410c6a28020010200c010b2013450d0020012802044101470d00200141086a2201280200109301200128020010200b200020073602042000200436020020034190086a24000be26607097f037e047f017e017f057e047f23004190076b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441044b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200341d8036a41386a2205200141c0006a290300370300200341d8036a41306a2206200141386a29030037030041282104200341d8036a41286a200141306a290300370300200341d8036a41206a2207200141286a290300370300200341d8036a41186a2208200141206a290300370300200341d8036a41106a2209200141186a290300370300200341d8036a41086a220a200141106a290300370300200341e8016a41086a220b200141d4006a2802003602002003200141086a2903003703d8032003200141cc006a2902003703e80120022d000120022d000072450d0b41fcc5c00021050c420b200341a8056a41186a200141196a290000370300200341a8056a41106a200141116a290000370300200341a8056a41086a200141096a290000370300200320012900013703a805200341d8036a41206a200141c1006a2d00003a0000200341d8036a41186a200141396a290000370300200341d8036a41106a200141316a290000370300200341d8036a41086a200141296a2900003703002003200141216a2900003703d803200341a8026a41086a2204200241096a290000370300200341a8026a41106a2205200241116a290000370300200341a8026a41186a2206200241196a290000370300200341a8026a41206a2207200241216a2d00003a0000200320022900013703a80220022d0000450d03200341033a00880641f09ec300210541e90021040c320b200141c0006a290300210c200141386a290300210d200141c8006a290300210e2003418c016a41026a200141076a2d00003a000020034190016a41086a200141186a29020037030020034190016a410d6a2001411d6a2900003700002003200141056a2f00003b018c012003200141106a29020037039001200141046a2d00002109200141086a28020021062001410c6a2802002108200141286a280200210f2001412c6a2802002110200141306a2802002111200241096a2800002104200241056a280000210520022d0001210a20022d00002107200341f0046a41086a220b200241156a290000370300200341f0046a410d6a22122002411a6a2900003700002003200241046a2d00003a00a2052003200241026a2f01003b01a00520032002410d6a2900003703f0042007450d03410121020c040b200141386a290300210d200141306a2903002113200141c0006a290300210e200341a8016a200141196a290000370300200341a0016a200141116a29000037030020034190016a41086a200141096a2900003703002003200129000137039001200141246a2802002114200141286a280200210f2001412c6a280200210a200241096a2800002104200241056a280000210520022d0001210720022d00002106200341f0046a41086a2208200241156a290000370300200341f0046a410d6a22092002411a6a2900003700002003200241046a2d00003a00a2052003200241026a2f01003b01a00520032002410d6a2900003703f0042006450d05410121020c060b2001410c6a2802002108200141086a2802002107200141046a2802002109200141106a290300210e200241096a2800002104200241056a280000210520022d0001210a20022d00002106200341f0046a41086a220b200241156a290000370300200341f0046a410d6a22122002411a6a2900003700002003200241046a2d00003a00a2052003200241026a2f01003b01a00520032002410d6a2900003703f0042006450d08410121020c090b20034188066a41206a20072d00003a000020034188066a41186a200629030037030020034188066a41106a200529030037030020034188066a41086a2004290300370300200320032903a802220e3703880641f09ec300210541e9002104200ea741ff017122024102460d1020024101470d2e20032d00d8034101460d2e4200210e200341f0046a41086a22024200370300200342003703f00441d99fc300411c200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c8040240200341c8046a411041c8d7c400410041001001417f460d00200342003703a802200341c8046a4110200341a8026a41084100100141016a41084d0d2220032903a802210e0b20034188066a41017221020c110b200341c8016a41086a200b290300370300200341c8016a410d6a2012290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c80141012102200a41ff01714101470d00200341da036a20032d009a053a0000200341a8026a41086a200341c8016a41086a290300370300200341a8026a410d6a200341c8016a410d6a290000370000200320032f0198053b01d803200320032903c8013703a802410021020c010b412a210441a4c6c00021050b200341a8056a41026a2207200341d8036a41026a2d00003a000020034188066a41086a220a200341a8026a41086a220b29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01d8033b01a805200320032903a8023703880620020d342003419b026a200a290300370000200341a0026a20034188066a410d6a290000370000200320032f01a8053b0188022003200436008f022003200536008b02200320032903880637009302200320072d00003a008a02200341c8016a41026a2003418c016a41026a2d00003a0000200b20034190016a41086a290300370300200341a8026a410d6a220220034190016a410d6a290000370000200320032f018c013b01c80120032003290390013703a802200941ff01714101470d07200341a8056a2006410676103720032802a805210420032802b0052006413f7122024d0d0f200341f0046a41026a200420024105746a220241026a2d00003a0000200341e0036a200241136a290000370300200341e5036a200241186a290000370000200320022f00003b01f0042003200229000b3703d80320022800072108200228000321064101210220032802ac05450d300c2f0b200341c8016a41086a2008290300370300200341c8016a410d6a2009290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c80141012102200741ff01714101470d00200341da036a20032d009a053a0000200341a8026a41086a200341c8016a41086a290300370300200341a8026a410d6a200341c8016a410d6a290000370000200320032f0198053b01d803200320032903c8013703a802410021020c010b412a210441a4c6c00021050b200341c8046a41026a2206200341d8036a41026a2d00003a000020034188066a41086a2207200341a8026a41086a29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01d8033b01c804200320032903a8023703880620020d29200341fb016a2007290300370000200341e8016a41186a220220034195066a290000370000200320032f01c8043b01e801200320043600ef01200320053600eb0120032003290388063700f301200320062d00003a00ea01200341a8026a200341e8016a200e10ff0220032802a8024101470d0520032802b002210420032802ac022105200f0d2a0c2b0b200141c8006a280200210420034188066a41386a200529030037030020034188066a41306a200629030037030020034188066a41286a200341d8036a41286a29030037030020034188066a41206a200729030037030020034188066a41186a200829030037030020034188066a41106a200929030037030020034188066a41086a200a29030037030020034188026a41086a200b280200360200200320032903d80337038806200320032903e80137038802200341f0046a41086a22024200370300200342003703f00441a39ec3004118200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c804410021020240200341c8046a411041c8d7c400410041001001417f460d00200342103702ac052003200341c8046a3602a805200341a8026a200341a8056a10900120032d00f40222054102460d1d200341c8016a41026a2206200341f7026a22072d00003a0000200320032f00f5023b01c80120032903a802210e20032903b002210c20032903b802210d20032903c002211320032903c802211520032903d002211620032903d802211720032903e002211820032802e802210220032902ec022119200720062d00003a0000200320053a00f402200320193702ec02200320023602e802200320183703e002200320173703d802200320163703d002200320153703c802200320133703c0022003200d3703b8022003200c3703b0022003200e3703a802200320032f01c8013b00f5020b41bb9ec30021050240200220044f0d00200341b4026a2004360200200341a8026a41086a220241033a00002003410b3a00a802200341a8026a103d200341a8026a41386a20034188066a41386a290300370300200341a8026a41306a20034188066a41306a290300370300200341a8026a41286a20034188066a41286a290300370300200341a8026a41206a20034188066a41206a290300370300200341a8026a41186a20034188066a41186a290300370300200341a8026a41106a20034188066a41106a290300370300200220034188066a41086a290300370300200341f4026a20034188026a41086a280200360200200320043602e80220032003290388063703a80220032003290388023702ec02200341f0046a41086a22024200370300200342003703f00441a39ec3004118200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c80441002105200341003602b005200342013703a805200341a8026a200341a8056a10990120032802ac052102200341c8046a411020032802a805220420032802b00510032002450d00200410200b413521040c270b200341c8016a41086a200b290300370300200341c8016a410d6a2012290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c80141012102200a41ff01714101470d00200341da036a20032d009a053a0000200341a8026a41086a200341c8016a41086a290300370300200341a8026a410d6a200341c8016a410d6a290000370000200320032f0198053b01d803200320032903c8013703a802410021020c010b412a210441a4c6c00021050b200341c8046a41026a2206200341d8036a41026a2d00003a000020034188066a41086a220a200341a8026a41086a29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01d8033b01c804200320032903a8023703880620020d04200341bb056a200a290300370000200341a8056a41186a20034195066a290000370000200320032f01c8043b01a805200320043600af05200320053600ab0520032003290388063700b305200320062d00003a00aa05200341f0046a41086a22024200370300200342003703f00441a39ec3004118200341f0046a1002200341c8046a41086a2002290300370300200320032903f0043703c804200341c8046a411041c8d7c400410041001001417f460d02200342103702dc032003200341c8046a3602d803200341a8026a200341d8036a10900120032d00f40222024102460d18200341c8016a41026a2204200341a8026a41cf006a220b2d00003a0000200320032f00f5023b01c80120032903a802210c20032903b002210d20032903b802211320032903c002211520032903c802211620032903d002211720032903d802211820032903e002211920032802e802210520032802ec02210620032802f002210a200b20042d00003a0000200320023a00f4022003200a3602f002200320063602ec02200320053602e802200320193703e002200320183703d802200320173703d002200320163703c802200320153703c002200320133703b8022003200d3703b0022003200c3703a802200320023a00d4062003200a3602d006200320063602cc06200320053602c806200320193703c006200320183703b806200320173703b006200320163703a806200320153703a00620032013370398062003200d370390062003200c37038806200320032f01c8013b00f50220034188066a41cf006a20042d00003a0000200320032f01c8013b00d5060c030b200341f0046a41026a200341c8016a41026a2d00003a0000200341d8036a41086a200341a8026a41086a290300370300200341d8036a410d6a2002290000370000200320032f01c8013b01f004200320032903a8023703d8030c290b200341a8026a41306a290300210c200341a8026a41286a290300210e20034188026a41186a200341a8026a41206a29030037030020034188026a41106a200341a8026a41186a29030037030020034188026a41086a200341a8026a41106a290300370300200320032903b00237038802200341a8026a1095032003200341a8026a3602d4032003200341a8026a3602b801200341a8056a41186a2002290300370300200341a8056a41106a2205200341e8016a41106a290300370300200341a8056a41086a2206200341e8016a41086a290300370300200320032903e8013703a80520034188066a200341a8056a10c7014100210420032d00880622074102460d1120034188066a41306a28020021022007450d0a410021040c110b200341003a00d406200341103602d006200342013703c006200342013703b806200342013703b006200342013703a806200342013703a006200342013703980620034201370390062003420137038806200342808080808080c0003703c8060b200341a8026a200341a8056a200e10ff0220032802a8024101470d0120032802b002210420032802ac0221050b41002108410121062007450d1e200910200c1e0b200341c8026a2903002115200341c0026a2903002116200341d8026a290300210c200341d0026a290300210e200341b8026a290300210d20032903b0022117200341286a20032903880642002008ad4200108804200d427f200329032820032903304200521b7d2213200d56201350722205450d0341ffe0c0002106412c21044101210220070d040c1c0b20032d00d8034101470d1d200341d8036a41017221024200210e0b4100210541012106200341a8056a200e410010f10241ff01714101470d084200210e200341f0046a41086a22044200370300200342003703f00441f59fc3004118200341f0046a1002200341c8046a41086a2004290300370300200320032903f0043703c804200341c8046a411041c8d7c400410041001001417f460d06200342003703f804200342003703f004200341c8046a4110200341f0046a4110410010012204417f460d122004410f4d0d12200341f8046a290300210c20032903f004210e0c070b4100210220032802ac050d1f0c200b200341a8026a2009200820034188066a10980220032802a8024101470d01200341b0026a280200210420032802ac022106410121022007450d180b200910200c170b200341c8046a41186a220a200341a8026a410472220241186a280200360200200341c8046a41106a220b200241106a290200370300200341c8046a41086a2212200241086a290200370300200320022902003703c804200341a8026a41186a22024200370300200341a8026a41106a4200370300200341a8026a41086a4200370300200342003703a80220092008200341a8026a100020034190016a41026a221120032d00aa023a0000200341e8016a41086a2210200341bb026a290000370300200341e8016a410d6a220f2002290000370000200320032f01a8023b019001200320032900b3023703e80120032800ab02210620032800af022104200341c8016a41026a20112d00003a000020034188026a41086a201029030037030020034188026a410d6a200f290000370000200320032f0190013b01c801200320032903e80137038802200341f0046a41186a200a280200360200200341f0046a41106a200b290300370300200341f0046a41086a2012290300370300200320032903c8043703f004411410222202450d0f200241106a41002800bce342360000200241086a41002900b4e342370000200241002900ace34237000020024114413410212202450d10200220032f01c8013b00142002200436001b20022006360017200220032903880237001f200241166a200341c8016a41026a220a2d00003a0000200241276a20034188026a41086a2903003700002002412c6a20034188026a410d6a290000370000200341a8026a41186a220b4200370300200341a8026a41106a22124200370300200341a8026a41086a22114200370300200342003703a80220024134200341a8026a1000200341d8036a41186a200b290300370300200341d8036a41106a2012290300370300200341d8036a41086a2011290300370300200320032903a8023703d803200341d8036a200341f0046a105b200210200240200341f0046a41106a280200450d0020032802fc0410200b200a20034190016a41026a2d00003a0000200341f0046a41086a200341e8016a41086a290300370300200341f0046a410d6a200341e8016a410d6a290000370000200320032f0190013b01c801200320032903e8013703f004411510222202450d112002410d6a41002900a4e342370000200241086a410029009fe34237000020024100290097e34237000020024115413510212202450d12200220032f01c8013b00152002200436001c20022006360018200220032903f004370020200241176a200341ca016a2d00003a0000200241286a200341f0046a41086a2903003700002002412d6a200341f0046a410d6a290000370000200341a8026a41186a220a4200370300200341a8026a41106a220b4200370300200341a8026a41086a22124200370300200342003703a80220024135200341a8026a1000200341d8036a41186a200a290300370300200341d8036a41106a200b290300370300200341d8036a41086a2012290300370300200320032903a8023703d803200341003602b002200342013703a802200320083602880220034188026a200341a8026a103e20032802ac02221220032802b002220b6b20084f0d01200b20086a220a200b490d1320124101742211200a200a2011491b22114100480d132012450d0820032802a802201220111021220a450d090c140b2002417f4c0d1f200341b4066a280200210820034188066a41286a28020021072002450d042002102222040d05200241011023000b20032802a802210a0c130b4200210c0b200341a8026a2002200e200c10a902024020032802a8024101470d0020032802b002210420032802ac0221050c150b200320032903b002370388022003200341b8026a2903003703900220034188026a10cf010b410121074101210820012d000022024104470d200c210b410121040b2004200720021084041a2008450d00200710200b20034194046a410036020020034184046a22074200370200200341d8036a41206a41a8a2c300360200200341f4036a41c8d7c400360200200341ec036a22084200370200200341d8036a41106a4180e5c200360200200341d8036a41086a2002360200200341bc046a200341a8056a41186a290300370200200341b4046a2005290300370200200341ac046a20062903003702002003420837028c042003428080808080013702fc03200341003602e403200320023602dc03200320043602d803200320032903a8053702a4042003200341b8016a3602a0042003200341d4036a36029c042003200341a8026a36029804200341c8046a200341d8036a2013200d20034188026a20034190016a2014200a1086024101211a024020032d00c804221b0d0020034188066a41086a22062008290200370300200341a8056a41086a20034194066a280200360200200320032902e403370388062003200329028c063703a80520034188076a200341a8056a10ca0120034180046a280200220820034188046a280200220441d8006c6a21052007280200210920082102024002402004450d0020034191066a2107200821020240034020022d00002104200341a8056a200241016a41d7001084041a20044106460d01200620043a00002003410b3a0088062007200341a8056a41d7001084041a20034188066a103d200241d8006a22022005470d000c030b0b200241d8006a21020b20022005460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a28000010200b200241d8006a22022005470d000b0b4100211a2009450d00200810200b200341e8006a20032903980220034188026a41186a290300200329039002220d4200108804200329038802200d7d109403200341f8006a200341e8016a2003290368200341e8006a41086a29030010f80120034198066a200c200341f8006a41086a29030022137d200e2003290378220d54ad7d2013200c7d200d200e54ad7d200d200e582013200c582013200c5122021b22041b22153703002003200e200d7d200d200e7d20041b2216370390062003200d200e562013200c5620021b2202ad370388060240024020020d002016201510ad010c010b20034188066a41086a10cf010b2003418c046a280200221c20034194046a28020022044107746a210a20034190046a280200211d201c21020240024002402004450d0020034191066a2104200341f0046a410272210520034188066a410472210b200341b1066a2112201c210202400340200341c8016a41186a2207200241186a290300370300200341c8016a41106a2208200241106a290300370300200341c8016a41086a2209200241086a290300370300200320022903003703c801200241206a2802002106200341a8056a200241246a41dc001084041a2006410f460d012003200636028806200b200341a8056a41dc001084041a200520032903c801370000200541086a2009290300370000200541106a2008290300370000200541186a200729030037000020034180023b01f004200341e0006a20034188066a200341f0046a10a3012003280260210620034188066a41086a41043a000020122006453a0000200420032903c801370000200441086a2009290300370000200441106a2008290300370000200441186a20072903003700002003410b3a00880620034188066a103d20024180016a2202200a470d000b200a2202200a470d020c030b20024180016a21020b2002200a460d010b20034188066a41206a210820034188066a410b6a210520034188066a41246a2110200341f0046a410d6a2106200341f0046a41086a21070340200320022f01003b01a0052003200241026a2d00003a00a205200241036a2800002109200241076a280000210b2006200241186a2900003700002007200241136a29000037030020032002410b6a2900003703f004200241206a280200210420034188066a200241246a41dc001084041a2004410f460d01200341c8016a41086a22122007290300370300200341c8016a410d6a22112006290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c801200341a8056a20034188066a41dc001084041a20082004360200200520032903c801370000200541086a20122903003700002005410d6a20112900003700002003200b36008f062003200936008b06200320032d009a053a008a06200320032f0198053b0188062010200341a8056a41dc001084041a200810920120024180016a2202200a470d000b0b0240201d450d00201c10200b200341d0046a2802002104410021050240201b4101470d0020032802cc0421050b024020032802d8032202450d0020032802dc03450d00200210200b201a450d11200341d8036a41186a2802002109200341e8036a280200210202400240200341d8036a41146a2802002207450d002007210820022106034020062802880b21062008417f6a22080d000b0340200220022f01064102746a41880b6a28020021022007417f6a22070d000c020b0b200221060b200341a4066a20022f010636020020034188066a41186a410036020020034188066a41146a2002360200200320093602a806200341003602980620034200370390062003200636028c06200341003602880620034188066a1054024020034188046a2802002206450d00200341d8036a41286a2802002102200641d8006c21060340024020022d00004105490d00200241286a280200450d00200241246a28020010200b200241d8006a2102200641a87f6a22060d000b0b20034184046a280200450d1120034180046a2802001020200f0d120c130b20111022220a0d0b0b201141011023000b200341bc026a41013602002003410336028c06200341eca1c40036028806200342013702ac02200341f4a1c4003602a802200320034188066a3602b802200341a8026a4190a0c3001048000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b411541011023000b413541011023000b1024000b200320113602ac022003200a3602a802201121120b200a200b6a200920081084041a200341d8036a4120200a200b20086a100302402012450d00200a10200b2002102002402007450d00200910200b200341f0046a41026a220220034190016a41026a2d00003a0000200341d8036a41086a2207200341e8016a41086a290300370300200341d8036a410d6a2208200341e8016a410d6a290000370000200320032f0190013b01f004200320032903e8013703d803200341a8026a41086a41023a0000200341b8026a2004360200200341b4026a2006360200200341b1026a20032f01f0043b0000200341bc026a20032903d803370200200341c4026a2007290300370200200341c9026a200829000037000020022d000021022003410b3a00a802200341a8026a410b6a20023a0000200341a8026a103d410021020b200341086a201620154200201320051b220d42001088042017200d7d109403200341186a200341a8056a2003290308200341086a41086a29030010f801200341b8026a200c200341186a41086a29030022137d200e2003290318220d54ad7d2013200c7d200d200e54ad7d200d200e582013200c582013200c5122051b22071b22153703002003200e200d7d200d200e7d20071b22163703b0022003200d200e562013200c5620051b2205ad3703a80202400240024020050d002016201510ad0141002108410021052002450d020c010b200341a8026a41086a10cf0141002108410021052002450d010b200621050b410121060b4101210720012d000022024104470d0d0c0e0b41012106410121070c0b0b200f450d010b201410200b41002107410121060c080b200410200b20020d00410121024195a9c0002106411521080c010b200341a8056a41026a200341f0046a41026a2d00003a0000200341a8026a41086a200341d8036a41086a290300370300200341a8026a410d6a200341d8036a410d6a290000370000200320032f01f0043b01a805200320032903d8033703a802410021020b200341c8046a41026a2204200341a8056a41026a2d00003a000020034188066a41086a2205200341a8026a41086a29030037030020034188066a41106a200341a8026a41106a290300370300200320032f01a8053b01c804200320032903a8023703880602402002450d00200821042006210520100d030c040b200341b0016a41026a20042d00003a0000200341e8016a41086a2005290300370300200341e8016a410d6a20034188066a410d6a290000370000200320032f01c8043b01b00120032003290388063703e801200341a8026a20034188026a200e10ff02024020032802a8024101470d0020032802b002210420032802ac02210520100d030c040b200341a8026a41306a2903002113200341a8026a41286a290300210e200341c8046a41186a200341a8026a41206a290300370300200341c8046a41106a200341a8026a41186a290300370300200341c8046a41086a200341a8026a41106a290300370300200320032903b0023703c804200341a8026a1095032003200341a8026a3602b4012003200341a8026a3602d403200341a8056a41186a220520034188026a41186a290300370300200341a8056a41106a220720034188026a41106a290300370300200341a8056a41086a220920034188026a41086a29030037030020032003290388023703a80520034188066a200341a8056a10c70141002104024020032d008806220a4102460d0020034188066a41306a28020021020240200a450d00410021040c010b2002417f4c0d01200341b4066a280200210b20034188066a41286a280200210a024002402002450d002002102222040d01200241011023000b410121040b2004200a20021084041a200b450d00200a10200b20034194046a410036020020034184046a220a4200370200200341d8036a41206a41a8a2c300360200200341f4036a41c8d7c400360200200341ec036a220b4200370200200341d8036a41106a4180e5c200360200200341d8036a41086a2002360200200341bc046a2005290300370200200341b4046a2007290300370200200341ac046a20092903003702002003420837028c042003428080808080013702fc03200341003602e403200320023602dc03200320043602d803200320032903a8053702a4042003200341d4036a3602a0042003200341b4016a36029c042003200341a8026a360298042003419b066a200341e8016a41086a29030037000020034188066a41186a200341f5016a2900003700002003200836008f062003200636008b062003200341b0016a41026a2d00003a008a06200320032f01b0013b018806200320032903e80137009306200341003602b005200342013703a805200341b8016a200341d8036a20034188066a200d200c200341c8046a200f2011200341a8056a1088024101211a024020032802b801221b0d0020034188066a41086a2206200b290200370300200341a8056a41086a20034194066a280200360200200320032902e403370388062003200329028c063703a80520034188076a200341a8056a10ca0120034180046a280200220820034188046a280200220441d8006c6a2105200a280200210920082102024002402004450d0020034191066a2107200821020240034020022d00002104200341a8056a200241016a41d7001084041a20044106460d01200620043a00002003410b3a0088062007200341a8056a41d7001084041a20034188066a103d200241d8006a22022005470d000c030b0b200241d8006a21020b20022005460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a28000010200b200241d8006a22022005470d000b0b4100211a2009450d00200810200b200341c0006a20032903d804200341e0046a29030020032903d004220c420010880420032903c804200c7d109403200341d0006a20034188026a2003290340200341c0006a41086a29030010f80120034198066a2013200341d0006a41086a290300220d7d200e2003290350220c54ad7d200d20137d200c200e54ad7d200c200e58200d201358200d20135122021b22041b22153703002003200e200c7d200c200e7d20041b2216370390062003200c200e56200d20135620021b2202ad370388060240024020020d002016201510ad010c010b20034188066a41086a10cf010b2003418c046a280200221c20034194046a28020022044107746a210a20034190046a280200211d201c21020240024002402004450d0020034191066a2104200341f0046a410272210520034188066a410472210b200341b1066a2112201c210202400340200341c8016a41186a2207200241186a290300370300200341c8016a41106a2208200241106a290300370300200341c8016a41086a2209200241086a290300370300200320022903003703c801200241206a2802002106200341a8056a200241246a41dc001084041a2006410f460d012003200636028806200b200341a8056a41dc001084041a200520032903c801370000200541086a2009290300370000200541106a2008290300370000200541186a200729030037000020034180023b01f004200341386a20034188066a200341f0046a10a3012003280238210620034188066a41086a41043a000020122006453a0000200420032903c801370000200441086a2009290300370000200441106a2008290300370000200441186a20072903003700002003410b3a00880620034188066a103d20024180016a2202200a470d000b200a2202200a470d020c030b20024180016a21020b2002200a460d010b20034188066a41206a210820034188066a410b6a210520034188066a41246a2114200341f0046a410d6a2106200341f0046a41086a21070340200320022f01003b01a0052003200241026a2d00003a00a205200241036a2800002109200241076a280000210b2006200241186a2900003700002007200241136a29000037030020032002410b6a2900003703f004200241206a280200210420034188066a200241246a41dc001084041a2004410f460d01200341c8016a41086a22122007290300370300200341c8016a410d6a22112006290000370000200320032d00a2053a009a05200320032f01a0053b019805200320032903f0043703c801200341a8056a20034188066a41dc001084041a20082004360200200520032903c801370000200541086a20122903003700002005410d6a20112900003700002003200b36008f062003200936008b06200320032d009a053a008a06200320032f0198053b0188062014200341a8056a41dc001084041a200810920120024180016a2202200a470d000b0b0240201d450d00201c10200b200341c0016a280200210420032802bc012102024002400240201b450d002002210520032802d80322020d010c020b2003200341c4016a280200360290062003200436028c0620032002360288064100210502402004450d00200210200b20032802d8032202450d010b20032802dc03450d00200210200b201a450d01200341d8036a41186a2802002109200341e8036a280200210202400240200341d8036a41146a2802002207450d002007210820022106034020062802880b21062008417f6a22080d000b0340200220022f01064102746a41880b6a28020021022007417f6a22070d000c020b0b200221060b200341a4066a20022f010636020020034188066a41186a410036020020034188066a41146a2002360200200320093602a806200341003602980620034200370390062003200636028c06200341003602880620034188066a1054024020034188046a2802002206450d00200341d8036a41286a2802002102200641d8006c21060340024020022d00004105490d00200241286a280200450d00200241246a28020010200b200241d8006a2102200641a87f6a22060d000b0b20034184046a280200450d0120034180046a280200102020100d020c030b1031000b2010450d010b200f10200b41012107410021060b4101210820012d000022024104460d010b024020024103460d0020024102470d022008450d02200141086a280200450d02200141046a28020010200c020b2006450d012001412c6a280200450d01200141286a28020010200c010b2007450d00200141286a280200450d00200141246a28020010200b200020043602042000200536020020034190076a24000b944d030f7f037e017f23004190046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d0020044102470d11200141216a2d00002105200141246a2802002106200341106a41186a200141196a290000370300200341106a41106a200141116a290000370300200341106a41086a200141096a2900003703002003200129000137031020022d0001210720022d0000210820034180036a41186a22092002411a6a29010037030020034180036a41106a200241126a29010037030020034180036a41086a2002410a6a2901003703002003200241026a290100370380032008450d01410121090c020b200141086a2802002104200141046a280200210520022d0001210820022d0000210120034198036a22092002411a6a29010037030020034190036a200241126a29010037030020034180036a41086a2002410a6a2901003703002003200241026a290100370380032001450d03410121010c040b200341d0006a41026a220a20032d0082033a0000200341b0016a41086a20034193036a290000370300200341b0016a410d6a220b2009290000370000200320032f0180033b01502003200329008b033703b00141012109200741ff01714101470d002003280083032102200328008703210820034180036a41026a200a2d00003a000020034190026a41086a200341b0016a41086a29030037030020034190026a410d6a200b290000370000200320032f01503b018003200320032903b00137039002410021090c010b41a4c6c0002102412a21080b20034180046a41026a220720034180036a41026a2d00003a0000200341a0036a41086a220a20034190026a41086a290300370300200341a0036a41106a20034190026a41106a290300370300200320032f0180033b01800420032003290390023703a00320090d24200341c3006a200a290300370000200341c8006a200341ad036a290000370000200320032f0180043b01302003200836003720032002360033200320032903a00337003b200320072d00003a0032200341306a108402450d03411510222202450d0e2002410d6a4100290085c540370000200241086a4100290080c540370000200241002900f8c44037000020024115413510212202450d0f200220032903103700152002412d6a200341106a41186a290300370000200241256a200341106a41106a2903003700002002411d6a200341106a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320024135200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a0033703800320034180036a412041c8d7c400410041001001417f460d06200320034180036a3602b001200341203602b40120034100360290022003410020034180036a412020034190026a41044100100122082008417f461b22084104200841044922091b22083602b80120090d13200328029002210c2003410036029002200341b8016a410020034180036a412020034190026a41042008100122092009417f461b2209410420094104491b20086a360200200941034d0d13200328029002210d200341a0036a200341b0016a103820032802a003220b450d13200341a0036a41086a280200210a20032802a403210e20034190026a200341b0016a1038200328029002220f450d1220034190026a41086a28020021102003280294022111200210202006200c470d08200b200a4105746a2107200b2102410021090340200720026b41ff004d0d0b200341306a2002460d0c20092002200341306a412010860422084100476a21092008450d0c200241206a2208200341306a460d0c20092008200341306a412010860422084100476a21092008450d0c200241c0006a2208200341306a460d0c20092008200341306a412010860422084100476a21092008450d0c200241e0006a2208200341306a460d0c20024180016a210220092008200341306a412010860422084100476a210920080d000c0c0b0b200341d0006a41026a20032d0082033a0000200341b0016a41086a20034193036a290000370300200341b0016a410d6a22072009290000370000200320032f0180033b01502003200329008b033703b00141012101200841ff01714101470d002003280083032102200328008703210820034180036a41026a200341d0006a41026a2d00003a000020034190026a41086a200341b0016a41086a29030037030020034190026a410d6a2007290000370000200320032f01503b018003200320032903b00137039002410021010c010b41a4c6c0002102412a21080b20034180046a41026a220920034180036a41026a2d00003a0000200341a0036a41086a220720034190026a41086a290300370300200341a0036a41106a20034190026a41106a290300370300200320032f0180033b01800420032003290390023703a00320010d02200341c3006a2007290300370000200341306a41186a200341ad036a290000370000200320032f0180043b01302003200836003720032002360033200320032903a00337003b200320092d00003a0032200341306a108402450d0120034100360298022003420137039002200420034190026a109501200328029402210120032802980221082003280290022102200341a0036a41186a22094200370300200341a0036a41106a22074200370300200341a0036a41086a220a4200370300200342003703a00320022008200341a0036a1000200341d0006a41186a2009290300370300200341d0006a41106a22082007290300370300200341d0006a41086a2209200a290300370300200320032903a00337035002402001450d00200210200b20034190026a41186a200341d0006a41186a29030037030020034190026a41106a200829030037030020034190026a41086a20092903003703002003200329035037039002411910222202450d0d200241186a41002d00acc4403a0000200241106a41002900a4c440370000200241086a410029009cc44037000020024100290094c44037000020024119413910212202450d0e2002200329039002370019200241316a20034190026a41186a290300370000200241296a20034190026a41106a290300370000200241216a20034190026a41086a290300370000200341a0036a41186a22014200370300200341a0036a41106a22084200370300200341a0036a41086a22094200370300200342003703a00320024139200341a0036a100020034180036a41186a200129030037030020034180036a41106a200829030037030020034180036a41086a2009290300370300200320032903a0033703800320034180036a412041c8d7c4004100410010012101200210202001417f460d0441fed3c2002102411f21080c020b418dc5c00021024114210820044101460d210c220b41adc4c0002102411721080b2004109201200410200c200b2002102041a1c5c00021024113210820044101460d1e0c1f0b200541014b0d0120034190026a200441e0001084041a200341013a00a003200341013602a403200320034190026a200341a0036a10a301200341b5026a2003280200453a0000200341a5026a200341e0006a290300370000200341ad026a200341e8006a290300370000200341083a0090022003419d026a200341d0006a41086a290300370000200341043a009402200320032903503700950220034190026a103d0c120b41b4c5c000210241102108200e450d1a0c190b20034190026a41086a22024200370300200342003703900241c4c4c000411c20034190026a1002200341a0036a41086a200229030037030020032003290390023703a003410021100240200341a0036a411041c8d7c400410041001001417f460d002003410036029002200341a0036a411020034190026a41044100100141016a41044d0d0b20032802900221100b20034190026a41086a22024200370300200342003703900241c4c4c000411c20034190026a1002200341a0036a41086a200229030037030020032003290390023703a00302400240200341a0036a411041c8d7c400410041001001417f460d002003410036029002200341a0036a411020034190026a41044100100141016a41044d0d0d20032802900241016a21020c010b410121020b4200211220034190026a41086a22014200370300200342003703900241c4c4c000411c20034190026a1002200341a0036a41086a2208200129030037030020032003290390023703a0032003200236029002200341a0036a411020034190026a4104100320014200370300200342003703900241e0c4c000411820034190026a10022008200129030037030020032003290390023703a0034100210202400240024002400240200341a0036a411041c8d7c400410041001001417f460d00200342103702b4012003200341a0036a3602b00120034190026a200341b0016a1038200328029002220f450d11200329029402211220034190026a41186a200341d0006a41186a29030037030020034190026a41106a200341d0006a41106a29030037030020034190026a41086a200341d0006a41086a29030037030020032003290350370390022012422088a722022012a7470d0220034190026a210141012109200241016a220820024f0d010c160b20034190026a41186a200341d0006a41186a29030037030020034190026a41106a200341d0006a41106a2903003703002001200341d0006a41086a29030037030020032003290350370390024101210f20034190026a210141012109410041016a22084100490d150b20022009742209200820082009491bad22134205862214422088a70d142014a722084100480d142002450d01200f200241057420081021220f450d020c110b20034190026a21010c110b20081022220f0d0f0b200841011023000b20022007460d01200b200a4105746a21070340200341306a2002460d0120092002200341306a412010860422084100476a21092008450d01410021152007200241206a2202470d000c0d0b0b410121150c0b0b410021150c0a0b200341a4026a4101360200200341033602a403200341eca1c4003602a0032003420137029402200341f4a1c400360290022003200341a0036a3602a00220034190026a41ecc5c0001048000b411541011023000b413541011023000b411941011023000b413941011023000b200e450d00200b10200b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200f20104105746a2106200f210241002108024002400240024002400240024002400240024002400240024002400240024002400340200620026b41ff004d0d01200341306a2002460d0220082002200341306a412010860422074100476a21082007450d02200241206a2207200341306a460d0220082007200341306a412010860422074100476a21082007450d02200241c0006a2207200341306a460d0220082007200341306a412010860422074100476a21082007450d02200241e0006a2207200341306a460d0220024180016a210220082007200341306a412010860422074100476a210820070d000c020b0b20022006460d02200f20104105746a21060340200341306a2002460d0120082002200341306a412010860422074100476a21082007450d01410021072006200241206a2202470d000c020b0b410121070b200541ff0171450d010c020b41002107200541ff01710d010b20070d0120034190026a41186a2208200341306a41186a29030037030020034190026a41106a2207200341306a41106a29030037030020034190026a41086a2206200341306a41086a2903003703002003200329033037039002024020112010470d00201041016a22022010490d1020104101742211200220022011491b2211ad4205862212422088a70d102012a722024100480d10024002402010450d00200f201041057420021021220f450d010c020b20021022220f0d010b200241011023000b200f20104105746a2202200329039002370000200241186a2008290300370000200241106a2007290300370000200241086a2006290300370000201041016a21102015450d030240200a20094d0d00200b200a417f6a220a4105746a220229000021122002290008211320022900102114200b20094105746a220841186a200241186a2900003700002008201437001020082013370008200820123700000c040b41dcc5c0002009200a10b501000b20150d0020034190026a41186a2209200341306a41186a29030037030020034190026a41106a2206200341306a41106a29030037030020034190026a41086a2215200341306a41086a2903003703002003200329033037039002200e200a470d01200a41016a2202200a490d0e200a410174220e20022002200e491b220ead4205862212422088a70d0e2012a722024100480d0e02400240200a450d00200b200a41057420021021220b450d010c030b20021022220b0d020b200241011023000b41c4c5c000210241162108200e0d140c150b200b200a4105746a2202200329039002370000200241186a2009290300370000200241106a2006290300370000200241086a2015290300370000200a41016a210a2007450d00201020084d0d01200f2010417f6a22104105746a220229000021122002290008211320022900102114200f20084105746a220841186a200241186a2900003700002008201437001020082013370008200820123700000b200341b5026a200329031037000020034190026a41156a200341306a41106a290300370000200341ad026a200341306a41186a290300370000200341c5026a200341106a41106a290300370000200341cd026a200341106a41186a290300370000200341083a0090022003419d026a200341306a41086a290300370000200341bd026a200341106a41086a290300370000200341013a0094022003200329033037009502200341dc026a2010360200200341d8026a200a360200200341d5026a20053a000020034190026a103d20034190026a41086a22024200370300200342003703900241dbc9c100411520034190026a1002200341a0036a41086a200229030037030020032003290390023703a003410021020240024002400240200341a0036a411041c8d7c400410041001001417f460d00200342103702b4012003200341a0036a3602b00120034190026a200341b0016a10f3012003280290022208450d012003290294022212422088a721022012a7450d00200810200b0240200a200d4f22090d004100200220106b2208200820024b1b200d490d00200341ac026a2010360200200341a8026a2011360200200341a0026a200a3602002003419c026a200e3602002003200f3602a4022003200b360298022003200d360294022003200c36029002411510222202450d022002410d6a4100290085c540370000200241086a4100290080c540370000200241002900f8c44037000020024115413510212202450d03200220032903103700152002412d6a200341106a41186a290300370000200241256a200341106a41106a2903003700002002411d6a200341106a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320024135200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a00337038003200341203602a403200320034180036a3602a00320034190026a200341a0036a10850220021020200e450d0b0c0a0b024002402009450d00200341a5026a200341106a41106a290300370000200341ad026a200341106a41186a290300370000200341083a0090022003419d026a200341106a41086a290300370000200341023a009402200320032903103700950220034190026a103d411910222202450d06200241186a41002d00acc4403a0000200241106a41002900a4c440370000200241086a410029009cc44037000020024100290094c44037000020024119413910212202450d0720022003290310370019200241316a200341106a41186a290300370000200241296a200341106a41106a290300370000200241216a200341106a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320024139200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a00337038003410f2108024020034180036a412041c8d7c400410041001001417f460d002003422037028404200320034180036a3602800420034190026a20034180046a108b012003280290022208410f460d09200341a0036a20034190026a41047241dc001084041a20034180036a412010090b200341b0016a200341a0036a41dc001084041a2008410f470d0120021020411521084115102222020d090c0a0b200341a5026a200341206a290300370000200341ad026a200341286a290300370000200341083a0090022003419d026a200341106a41086a290300370000200341033a009402200320032903103700950220034190026a103d41152108411510222202450d090c080b200341d0006a200341b0016a41dc001084041a20021020200320083602900220034190026a410472200341d0006a41dc001084041a200341013a00a0032003200d3602a403200341086a20034190026a200341a0036a10a301200341b5026a2003280208453a0000200341a5026a200341206a290300370000200341ad026a200341286a290300370000200341083a0090022003419d026a200341106a41086a290300370000200341043a009402200320032903103700950220034190026a103d411521084115102222020d070c080b419a88c00041331039000b411541011023000b413541011023000b41dcc5c0002008201010b501000b411941011023000b413941011023000b419a88c00041331039000b2002410d6a4100290085c540370000200241086a4100290080c540370000200241002900f8c4403700000240024020022008413510212202450d00200220032903103700152002412d6a200341106a41186a290300370000200241256a200341106a41106a2903003700002002411d6a200341106a41086a29030037000042002112200341a0036a41186a22094200370300200341a0036a41106a22074200370300200341a0036a41086a22084200370300200342003703a00320024135200341a0036a100020034180036a41186a200929030037030020034180036a41106a200729030037030020034180036a41086a2008290300370300200320032903a0033703800320034180036a412010092002102020034190026a41086a22024200370300200342003703900241e0c4c000411820034190026a10022008200229030037030020032003290390023703a00302400240200341a0036a411041c8d7c400410041001001417f460d00200342103702b4012003200341a0036a3602b00120034190026a200341b0016a1038200328029002220c450d0320032902940221120c010b4101210c0b4100210502400240024002402012422088a72207450d004100210a410021054100210802400340024002402005450d00200c20084105746a2102200c2008200a6a4105746a21090340200820074f0d06200341106a2002460d022002200341106a4120108604450d02200a20086a220620074f0d0720092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200241206a2102200941206a21092007200841016a2208470d000c050b0b200c20084105746a21020340200820074f0d05200341106a2002460d012002200341106a4120108604450d01200241206a21022007200841016a2208470d000c030b0b200a417f6a210a200541016a2105200841016a22082007470d000c020b0b410021050b20034190026a41086a22024200370300200342003703900241e0c4c000411820034190026a1002200341a0036a41086a200229030037030020032003290390023703a003200341003602980220034201370390022003200720056b22083602b001200341b0016a20034190026a103e024002402008450d00200741057420054105746b21064100200228020022086b21072003280290022105200328029402210a200c210203400240200a20076a411f4b0d00200841206a22092008490d0f200a4101742210200920092010491b22094100480d0f02400240200a450d002005200a2009102122050d010c080b200910222205450d070b2009210a0b200520086a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200741606a2107200841206a2108200241206a2102200641606a22060d000b20034198026a20083602002003200a3602940220032005360290020c010b20022802002108200328029402210a20032802900221050b200341a0036a41102005200810030240200a450d00200510200b02402012a7450d00200c10200b200e0d060c070b41ccc4c1002008200710b501000b41a4c5c1002006200710b501000b200941011023000b413541011023000b419a88c00041331039000b200841011023000b200b10200b02402011450d00200f10200b4100210220044101470d0e0c0d0b2012422088a72102201321120b200f200241057422096a22082001290000370000200841186a200141186a290000370000200841106a200141106a290000370000200841086a200141086a29000037000020034190026a41086a22014200370300200342003703900241e0c4c000411820034190026a1002200341a0036a41086a200129030037030020032003290390023703a003200341003602980220034201370390022003200241016a22023602b001200341b0016a20034190026a103e024002402002450d00200941206a210a4100200128020022016b210920032802900221062003280294022107200f210203400240200720096a411f4b0d00200141206a22082001490d052007410174220b20082008200b491b22084100480d05024002402007450d00200620072008102122060d010c080b200810222206450d070b200821070b200620016a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200941606a2109200141206a2101200241206a2102200a41606a220a0d000b20034198026a2001360200200320073602940220032006360290020c010b20012802002101200328029402210720032802900221060b200341a0036a411020062001100302402007450d00200610200b02402012a7450d00200f10200b200341b0016a41186a200341d0006a41186a290300370300200341b0016a41106a200341d0006a41106a290300370300200341b0016a41086a200341d0006a41086a290300370300200320032903503703b00120034190026a200441e0001084041a411910222202450d03200241186a41002d00acc4403a0000200241106a41002900a4c440370000200241086a410029009cc44037000020024100290094c44037000020024119413910212202450d04200220032903b001370019200241316a200341b0016a41186a2201290300370000200241296a200341b0016a41106a2208290300370000200241216a200341b0016a41086a2209290300370000200341a0036a41186a22074200370300200341a0036a41106a220a4200370300200341a0036a41086a22064200370300200342003703a00320024139200341a0036a100020034180036a41186a200729030037030020034180036a41106a200a29030037030020034180036a41086a2006290300370300200320032903a00337038003200341003602a803200342013703a00320034190026a200341a0036a10950120032802a403210720034180036a412020032802a003220a20032802a803100302402007450d00200a10200b2002102020034190026a1092012001200341d0006a41186a2903003703002008200341d0006a41106a2903003703002009200341d0006a41086a290300370300200320032903503703b001412010222202450d0520022003290330370000200341ac026a41003602002003419c026a428180808010370200200241186a200341306a41186a290300370000200241106a200341306a41106a290300370000200241086a200341306a41086a290300370000200342013702a402200320023602980220032005360294022003201036029002411510222201450d062001410d6a4100290085c540370000200141086a4100290080c540370000200141002900f8c44037000020014115413510212201450d07200120032903b0013700152001412d6a200341b0016a41186a290300370000200141256a200341b0016a41106a2903003700002001411d6a200341b0016a41086a290300370000200341a0036a41186a22084200370300200341a0036a41106a22094200370300200341a0036a41086a22074200370300200342003703a00320014135200341a0036a100020034180036a41186a200829030037030020034180036a41106a200929030037030020034180036a41086a2007290300370300200320032903a00337038003200341203602a403200320034180036a3602a00320034190026a200341a0036a108502200110202002102020034190026a410d6a200341306a41086a290300370000200341a5026a200341306a41106a29030037000020034190026a411d6a200341306a41186a29030037000020034190026a41256a200329035037000020034190026a412d6a200341d0006a41086a29030037000020034190026a41356a200341d0006a41106a290300370000200341cd026a200341d0006a41186a290300370000200341003a009402200341083a0090022003200329033037009502200341dc026a2005360200200341d8026a201036020020034190026a103d0b20041020410021020c0b0b1024000b200841011023000b411941011023000b413941011023000b412041011023000b411541011023000b413541011023000b200b10200b2011450d00200f102020044101470d020c010b20044101470d010b200141086a2802002201109201200110200b200020083602042000200236020020034190046a24000b8bb7010f087f017e057f027e087f027e037f017e067f027e097f037e027f027e407f230041c0036b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b2001410c6a2802002105200141086a2802002106200141106a28020021072001280204210820022d0001210920022d00002104200341c8016a220a2002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d134101210a0c140b2001280204210520022d0001210720022d00002104200341c8016a220a2002411a6a290100370300200341c0016a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d094101210a0c0a0b20022d000120022d0000720d07200141086a290300210b20034198036a41086a22024200370300200342003703980341f482c200411420034198036a100220034190016a41086a20022903003703002003200329039803370390012003200b3703b00120034190016a4110200341b0016a410810030c580b200141306a280200210c2001412c6a280200210d2001280204210e200341ac016a41026a2001410b6a2d00003a0000200341a0026a41086a2001411c6a290200370300200341a0026a410d6a200141216a290000370000200320012f00093b01ac012003200141146a2902003703a002200141086a2d000021072001410c6a280200210a200141106a280200210620022d0001210820022d00002104200341c8016a22052002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d0a410121050c0b0b2001280204210620022d0001210520022d00002104200341c8016a220a2002411a6a290100370300200341c0016a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d0c4101210a0c0d0b200341ac016a41026a2205200141076a2d00003a0000200341f0006a41086a220e200141186a290200370300200341f0006a410d6a220d2001411d6a290000370000200320012f00053b01ac012003200141106a29020037037020022d000120022d0000720d042001410c6a2802002104200141086a280200210220012d0004210f200341c4026a41026a20052d00003a0000200341b0016a41086a200e290300370300200341b0016a410d6a200d290000370000200320032f01ac013b01c402200320032903703703b001200f41ff01714101470d1e200341f0026a2002410676103720032802f002210520032802f8022002413f7122024d0d22200341c0026a41026a200520024105746a220241026a2d00003a0000200341a0036a200241136a290000370300200341a5036a200241186a290000370000200320022f00003b01c0022003200229000b3703980320022800072104200228000321024101210e20032802f402450d4b0c4a0b2001410c6a2802002109200141086a2802002106200141106a28020021102001280204210820022d0001210520022d00002104200341c8016a220a2002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d104101210a0c110b200141386a2903002111200141306a2903002112200141286a2802002113200341ac016a41026a200141076a2d00003a0000200341a0026a41086a200141186a290200370300200341a0026a410d6a2001411d6a290000370000200320012f00053b01ac012003200141106a2902003703a002200141086a28020021142001410c6a280200211520012d0004211620022d0001211720022d00002104200341b0016a41186a22182002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012004450d12410121180c130b20022d000120022d0000720d012001280204210220034198036a41086a22044200370300200342003703980341cc82c200411420034198036a100220034190016a41086a2004290300370300200320032903980337039001200320023602b00120034190016a4110200341b0016a410410030c520b20022d000120022d000072450d130b41fcc5c0002102412821040c550b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2206200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200741ff01714101470d0020032800b301210220032800b7012104200341c8026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2006290000370000200320032f01703b01c80220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2207200341c8026a41026a2d00003a000020034190016a41086a2206200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01c8023b01a801200320032903b00137039001200a0d4920034183036a200629030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320043600f702200320023600f30220032003290390013700fb02200320072d00003a00f202411610222202450d262002410e6a41002900d3c941370000200241086a41002900cdc941370000200241002900c5c94137000020024116413610212202450d27200220032903f0023700162002412e6a200341f0026a41186a290300370000200241266a200341f0026a41106a290300370000411e21042002411e6a200341f0026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2207420037030020034198036a41086a2206420037030020034200370398032002413620034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2007290300370300200341b0016a41086a200629030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001210a2002102041fc89c2002102200a417f470d4920034198036a41086a22024200370300200342003703980341a284c200411620034198036a100220034190016a41086a200229030037030020032003290398033703900141002110024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d2620032802b00121100b20034198036a41086a220242003703002003420037039803419084c200411220034198036a100220034190016a41086a20022903003703002003200329039803370390014100210c20034190016a411041c8d7c400410041001001417f460d1d2003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b001220e450d2a200341b8016a280200210a20032802b401210c20102005460d1e0c1f0b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2005290000370000200320032f01b0013b0170200320032900bb013703980341012105200841ff01714101470d0020032800b301210220032800b701210420034190016a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01703b01900120032003290398033703b001410021050c010b41a4c6c0002102412a21040b2003418c016a41026a220820034190016a41026a2d00003a0000200341f0026a41086a2209200341b0016a41086a2210290300370300200341f0026a41106a200341b0016a41106a290300370300200320032f0190013b018c01200320032903b0013703f00220050d46200341db026a2009290300370000200341e0026a200341f0026a410d6a290000370000200320032f018c013b01c802200320043600cf02200320023600cb02200320032903f0023700d302200320082d00003a00ca02200341c4026a41026a200341ac016a41026a2d00003a00002010200341a0026a41086a290300370300200341b0016a410d6a2202200341a0026a410d6a290000370000200320032f01ac013b01c402200320032903a0023703b001200741ff01714101470d0d200341f0006a200a4106761037200328027021042003280278200a413f7122024d0d16200341c0026a41026a200420024105746a220241026a2d00003a0000200341a0036a200241136a290000370300200341a5036a200241186a290000370000200320022f00003b01c0022003200229000b37039803200228000721062002280003210a410121022003280274450d3b0c3a0b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2207200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200541ff01714101470d0020032800b301210220032800b7012104200341c8026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2007290000370000200320032f01703b01c80220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2207200341c8026a41026a2d00003a000020034190016a41086a2205200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01c8023b01a801200320032903b00137039001200a0d4320034183036a200529030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320043600f702200320023600f30220032003290390013700fb02200320072d00003a00f20220034198036a41086a22024200370300200342003703980341e082c200411420034198036a10022005200229030037030020032003290398033703900120034190016a411041c8d7c400410041001001417f460d0f419589c2002102411e21040c430b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2210200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200941ff01714101470d0020032800b301210220032800b7012104200341f0026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2010290000370000200320032f01703b01f00220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2209200341f0026a41026a2d00003a000020034190016a41086a2210200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01f0023b01a801200320032903b001370390010240200a450d0041002105410121072006450d42200810202001280200220a4102470d490c480b2003418c016a41026a220a20092d00003a0000200341a0026a41086a22092010290300370300200341a0026a410d6a221020034190016a410d6a290000370000200320032f01a8013b018c0120032003290390013703a002200341c3016a2009290300370000200341c8016a2010290000370000200320043600b701200320023600b3012003200a2d00003a00b201200320032f018c013b01b001200320032903a0023700bb01200320053602a0032003200636029c0320032008360298032003200341b0016a20034198036a200710e902200328020421042003280200210241002105410121072001280200220a4102470d480c470b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2207200a290000370000200320032f01b0013b0170200320032900bb01370398034101210a200541ff01714101470d0020032800b301210220032800b7012104200341c4026a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a2007290000370000200320032f01703b01c40220032003290398033703b0014100210a0c010b41a4c6c0002102412a21040b200341a8016a41026a2205200341c4026a41026a2d00003a000020034190016a41086a2207200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01c4023b01a801200320032903b00137039001200a0d07200341ab036a2007290300370000200341b0036a20034190016a410d6a290000370000200320032f01a8013b0198032003200436009f032003200236009b0320032003290390013700a303200320052d00003a009a03200341b0016a20034198036a10b2024101210a20032d00b0014101470d052003418e016a20032d00b3013a0000200341f0026a41086a200341c4016a290200370300200341f0026a410d6a200341c9016a290000370000200320032f00b1013b018c012003200341bc016a2902003703f002200341b0016a41086a28020021044100210a20032802b40121020c060b200341f0006a41026a20032d00b2013a000020034198036a41086a200341c3016a29000037030020034198036a410d6a2018290000370000200320032f01b0013b0170200320032900bb013703980341012118201741ff01714101470d0020032800b301210220032800b701210420034190016a41026a200341f0006a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01703b01900120032003290398033703b001410021180c010b412a210441a4c6c00021020b2003418c016a41026a221720034190016a41026a2d00003a0000200341f0026a41086a2219200341b0016a41086a290300370300200341f0026a41106a200341b0016a41106a290300370300200320032f0190013b018c01200320032903b0013703f00220180d3a200341db026a2019290300370000200341e0026a200341f0026a410d6a290000370000200320032f018c013b01c802200320043600cf02200320023600cb02200320032903f0023700d302200320172d00003a00ca022012201184500d08200341c4026a41026a2202200341ac016a41026a2d00003a0000200341b0016a41086a2204200341a0026a41086a290300370300200341b0016a410d6a200341a0026a410d6a290000370000200320032f01ac013b01c402200320032903a0023703b001201641ff01714101470d09200341f0006a201441067610372003280270210420032802782014413f7122024d0d0c200341c0026a41026a200420024105746a220241026a2d00003a0000200341a0036a200241136a290000370300200341a5036a200241186a290000370000200320022f00003b01c0022003200229000b370398032002280007211520022800032114410121022003280274450d2b0c2a0b200141086a290300210b20034198036a41086a220242003703002003420037039803419883c200411c20034198036a100220034190016a41086a20022903003703002003200329039803370390012003200b3703b00120034190016a4110200341b0016a410810030c3d0b200341c0026a41026a200341c4026a41026a2d00003a000020034198036a41086a200341b0016a41086a29030037030020034198036a410d6a2002290000370000200320032f01c4023b01c002200320032903b001370398030c2e0b410b2104418887c20021020b200341c0026a41026a22052003418c016a41026a2d00003a0000200341c8026a41086a2207200341f0026a41086a290300370300200341c8026a41106a200341f0026a41106a290300370300200320032f018c013b01c002200320032903f0023703c802200a450d010b41012105410021072006450d36200810202001280200220a4102470d3d0c3c0b200341ac016a41026a220a20052d00003a0000200341a0026a41086a22052007290300370300200341a0026a410d6a2207200341c8026a410d6a290000370000200320032f01c0023b01ac01200320032903c8023703a002200341c3016a2005290300370000200341c8016a2007290000370000200320043600b701200320023600b3012003200a2d00003a00b201200320032f01ac013b01b001200320032903a0023700bb01200320093602a0032003200636029c032003200836029803200341086a200341b0016a20034198036a201010e902200328020c21042003280208210241012105410021072001280200220a4102470d3c0c3b0b411410222202450d12200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d13200220032903f002370014411821042002412c6a200341f0026a41186a290300370000200241246a200341f0026a41106a2903003700002002411c6a200341f0026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001210a20021020200a417f460d0620034198036a41086a22024200370300200342003703980341b483c200410e20034198036a100220034190016a41086a200229030037030020032003290398033703900120034190016a411041c8d7c400410041001001417f460d0a2003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b001220a450d1520032802b4012105200341b8016a280200220220064d0d0b200a20064105746a2204200341f0026a460d0d2004200341f0026a4120108604450d0d41e389c20021024119210420050d0c0c330b200341c0026a41026a200341c4026a41026a2d00003a000020034198036a41086a200341b0016a41086a29030037030020034198036a410d6a200341b0016a410d6a290000370000200320032f01c4023b01c002200320032903b001370398030c2d0b41ce8ac200210241d00021040c310b200341c0026a41026a20022d00003a000020034198036a41086a200429030037030020034198036a410d6a200341b0016a410d6a290000370000200320032f01c4023b01c002200320032903b001370398030c220b4100210220032802740d230c240b4100210e20032802f4020d270c280b4100210220032802740d1d0c1e0b41b389c20021020c2c0b4101210e4100210a20102005470d010b200a2005460d0e0b419a8ac200210241162104200a20054d0d0e200341c8016a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b001200e20054105746a2207200341b0016a460d0d2007200341b0016a41201086040d0e0c0d0b41cb89c20021020c280b41cb89c2002102411821042005450d270b200a10200c260b200320023602b801200320053602b4012003200a3602b001200341f0026a2006200341b0016a10ea024200210b20034198036a41086a22024200370300200342003703980341f388c200411220034198036a100220034190016a41086a2002290300370300200320032903980337039001410021020240024020034190016a411041c8d7c400410041001001417f460d00200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012204417f460d0a2004410f4d0d0a200341b8016a290300212020032903b001210b0c010b420021200b200341f0026a200b202010e5010c2a0b200341c4016a41013602002003410336029c03200341eca1c40036029803200342013702b401200341f4a1c4003602b001200320034198036a3602c001200341b0016a41f88dc2001048000b419a88c00041331039000b411641011023000b413641011023000b411441011023000b413441011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b4200210b20034198036a41086a22024200370300200342003703980341c984c200411520034198036a100220034190016a41086a20022903003703002003200329039803370390010240024020034190016a411041c8d7c400410041001001417f460d00200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d042002410f4d0d04200341b8016a290300210b20032903b00121200c010b420921200b200341306a200341f0026a2020200b10b0012003280230450d0141b08ac2002102411e21040b200c450d1a200e10200c1a0b20034198036a41086a22024200370300200342003703980341b884c200411120034198036a100220034190016a41086a200229030037030020032003290398033703900141002107024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0220032802b00121070b411610222202450d022002410e6a41002900d3c941370000200241086a41002900cdc941370000200241002900c5c94137000020024116413610212202450d03200220032903f0023700162002412e6a200341f0026a41186a290300370000200241266a200341f0026a41106a2903003700002002411e6a200341f0026a41086a29030037000020034198036a41186a2204420037030020034198036a41106a2206420037030020034198036a41086a2208420037030020034200370398032002413620034198036a1000200341b0016a41186a2004290300370300200341b0016a41106a2006290300370300200341b0016a41086a200829030037030020032003290398033703b001410410222204450d042004200736000020044104410810212204450d0520042005360004200341b0016a41202004410810032004102020021020024002400240200a2005470d00200341b0016a41186a2204200341f0026a41186a290300370300200341b0016a41106a220a200341f0026a41106a290300370300200341b0016a41086a2207200341f0026a41086a290300370300200320032903f0023703b001200c2005470d0a200541016a22022005490d1a20054101742206200220022006491b220cad420586220b422088a70d1a200ba722024100480d1a2005450d01200e200541057420021021220e450d020c0a0b200341b0016a41186a2204200341f0026a41186a290300370300200341b0016a41106a2207200341f0026a41106a290300370300200341b0016a41086a2206200341f0026a41086a290300370300200320032903f0023703b001200a20054d0d08200e20054105746a220220032903b001370000200241186a2004290300370000200241106a2007290300370000200241086a20062903003700000c0a0b20021022220e0d080b200241011023000b419a88c00041331039000b419a88c00041331039000b411641011023000b413641011023000b410441011023000b410841011023000b418084c2002005200a10b501000b200e20054105746a220220032903b001370000200241186a2004290300370000200241106a200a290300370000200241086a2007290300370000200541016a210a0b20034198036a41086a220242003703002003420037039803419084c200411220034198036a1002200341b0016a41086a200229030037030020032003290398033703b001200341003602a00320034201370398032003200a3602c802200341c8026a20034198036a103e024002400240200a450d00200e200a4105746a21084100200228020022046b21052003280298032106200328029c032107200e210203400240200720056a411f4b0d00200441206a220a2004490d1320074101742209200a200a2009491b220a4100480d13024002402007450d0020062007200a102122060d010c060b200a10222206450d050b200a21070b200620046a220a2002290000370000200a41186a200241186a290000370000200a41106a200241106a290000370000200a41086a200241086a290000370000200541606a2105200441206a2104200241206a220a21022008200a470d000b200341a0036a20043602002003200736029c0320032006360298030c010b20022802002104200328029c03210720032802980321060b200341b0016a411020062004100302402007450d00200610200b0240200c450d00200e10200b20034198036a41086a22024200370300200342003703980341a284c200411620034198036a100220034190016a41086a2002290300370300200320032903980337039001410121072003201041016a3602b00120034190016a4110200341b0016a410410030c090b200a41011023000b200410200b20020d00410121024195a9c0002114411521150c010b200341f0006a41026a200341c0026a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01c0023b017020032003290398033703b001410021020b200341a8016a41026a2218200341f0006a41026a2d00003a000020034190016a41086a2204200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01703b01a801200320032903b0013703900102402002450d0020152104201421020c0d0b20034183036a200429030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320153600f702200320143600f30220032003290390013700fb02200320182d00003a00f20220034198036a41086a22024200370300200342003703980341b884c200411120034198036a100220042002290300370300200320032903980337039001410021020240024002400240024002400240024002400240024002400240024002400240024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0120032802b00121020b0240024002400240024002400240024020022013470d0020034198036a41086a22024200370300200342003703980341e082c200411420034198036a100220034190016a41086a22042002290300370300200320032903980337039001200341b0016a20034190016a105a20032802bc012216450d0120032903c001211b20024200370300200342003703980341c283c200411820034198036a1002200420022903003703002003200329039803370390014100211420034190016a411041c8d7c400410041001001417f460d022003421037029c03200320034190016a36029803200341e8006a20034198036a108e012003280268450d07200328026c2213ad221c421c88a70d0b201c420486a72202417f4c0d0b2002450d032002102222180d04200241081023000b41cb8bc2002102411121040c230b419e8bc2002102412d21040c220b410821184108212c4100212a0c020b410821180b024002402013450d0020034198036a41086a2802002115200328029c032131200328029803212b410021174100210441002102201321140340200342003703b801200342003703b0014100202b2031200341b0016a41102015100122192019417f461b2219411020194110491b20156a21152019410f4d0d04200241016a212a200341b0016a41086a290300211c20032903b0012132024020022014470d002017202a202a2017491b2214ad4204862233422088a70d212033a722194100480d2102402002450d00201820042019102122180d010c090b201910222218450d080b201820046a2202201c37030820022032370300201741026a2117200441106a2104202a2102202a2013490d000b200341a0036a201536020020180d010c040b4100212a410021142018450d030b2018212c0b20034198036a41086a22024200370300200342003703980341b483c200410e20034198036a100220034190016a41086a2002290300370300200320032903980337039001410021190240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b0012213450d0e200341b8016a280200212d20032802b40121190c010b410121134100212d0b4200211c20034198036a41086a22024200370300200342003703980341b78dc200411c20034198036a100220034190016a41086a20022903003703002003200329039803370390010240024020034190016a411041c8d7c400410041001001417f460d00200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d082002410f4d0d08200341b8016a290300211c20032903b00121320c010b420121320b200341d8006a2032201c202dad4200108804411410222202450d08200341d8006a41086a290300211c20032903582134200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef4037000020024114413410212202450d09200220032903c8023700142002412c6a200341c8026a41186a290300370000200241246a200341c8026a41106a2903003700002002411c6a200341c8026a41086a2903003700004200213320034198036a41186a2204420037030020034198036a41106a2215420037030020034198036a41086a2217420037030020034200370398032002413420034198036a1000200341b0016a41186a2004290300370300200341b0016a41106a2015290300370300200341b0016a41086a201729030037030020032003290398033703b00102400240200341b0016a412041c8d7c400410041001001417f460d00200342003703a0032003420037039803200341b0016a412020034198036a4110410010012204417f460d092004410f4d0d09200341a0036a290300213220032903980321330c010b420021320b200210200240024002400240024020332034542032201c542032201c511b450d00418d8cc2002102412e210420190d010c020b20034198036a41086a22024200370300200342003703980341ec83c200411320034198036a100220034190016a41086a2002290300370300200320032903980337039001024002400240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a10dc0220032802b0012215450d15200341b0016a41086a2802002217450d1620032802b401213141bb8cc2002102412321042015290300201254201541086a290300223220115420322011511b450d034108213020034198036a41086a22024200370300200342003703980341dbc9c100411520034198036a100220034190016a41086a20022903003703002003200329039803370390014100213520034190016a411041c8d7c400410041001001417f460d012003421037029c03200320034190016a36029803200341b0016a20034198036a10f30120032802b0012230450d17200341b8016a280200213620032802b40121350c020b41dc8bc20021024131210420190d030c040b410021360b2030203641286c6a212f203021024100212b02400240024002400340202f20026b419f014d0d012002200341f0026a460d02202b2002200341f0026a4120108604222e4100476a212b202e450d02200241286a222e200341f0026a460d02202b202e200341f0026a4120108604222e4100476a212b202e450d02200241d0006a222e200341f0026a460d02202b202e200341f0026a4120108604222e4100476a212b202e450d02200241f8006a222e200341f0026a460d02200241a0016a2102202b202e200341f0026a4120108604222e4100476a212b202e0d000c020b0b202f2002460d012030203641286c6a212f0340200341f0026a2002460d01202b2002200341f0026a4120108604222e4100476a212b202e450d01202f200241286a2202470d000c020b0b202b201b422088a74f0d010b02402035450d00203010200b200341b0016a200341f0026a10de0241948dc200210220032802b0014101470d01202a41ffffffff00712202202d41ffffff3f712204200420024b1b222f450d04200341b8016a280200213520032802b4012130201321044100212a42002137420021380340411410222202450d11200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d12200220042900003700142002412c6a200441186a290000370000200241246a200441106a2900003700002002411c6a200441086a29000037000020034198036a41186a222b420037030020034198036a41106a222d420037030020034198036a41086a222e420037030020034200370398032002413420034198036a1000200341b0016a41186a202b290300370300200341b0016a41106a202d290300370300200341b0016a41086a222d202e29030037030020032003290398033703b001024002400240200341b0016a412041c8d7c400410041001001417f460d002003410036029803200341b0016a412020034198036a41044100100141016a41044d0d0e200328029803212e4100212b202a41016a212a20021020202e20304f0d010c020b4101212b202a41016a212a2002102041002030490d010b202b0d00200341b0016a200410eb0242002132420021330240202d28020020354d0d00202c41086a290300420020032802b00120356a2d000022021b2133202c290300420020021b21320b024020032802b401450d0020032802b00110200b203320387c203220377c2237203254ad7c21380b200441206a2104202c41106a212c202a202f490d000c060b0b41de8cc2002102413621042035450d00203010200b02402031450d00201510200b2019450d010b201310200b02402014450d00201810200b201ba7450d200c130b42002137420021380b2015201741306c6a212b201521020240024002400340202b20026b41bf014d0d014101212a200241106a2204200341f0026a460d022004200341f0026a4120108604450d02200241c0006a2204200341f0026a460d022004200341f0026a4120108604450d02200241f0006a2204200341f0026a460d022004200341f0026a4120108604450d02200241a0016a2204200341f0026a460d02200241c0016a21022004200341f0026a41201086040d000c020b0b02402002202b460d0003404101212a200241106a2202200341f0026a460d022002200341f0026a4120108604450d02200241206a2202202b470d000b0b4100212a20372012852038201185844200520d00200341f0026a41086a290300211c200341f0026a41106a2903002132200341f0026a41186a290300213320032903f00221342015201137030820152012370300200341b0016a41186a2033370300200341b0016a41106a2032370300200341b0016a41086a201c37030020152034370310201541186a201c370300201541206a2032370300201541286a2033370300200320343703b001201741144b0d014101213a201741014d0d1f417f213b2017417f6a213c4130213d2015201741306c6a213e4102213f41082140412821414118214241202143411021444103214541e80021464150214741782148417021494168214a4160214b4158214c4138214d410121020c1d0b200341386a200341c8026a2034201c10b3012003290338200341c0006a29030010ad0102402031450d00201510200b02402019450d00201310200b02402014450d00201810200b41d38dc20041e98dc200202a1b21024116410f202a1b2104201ba70d120c1f0b2017410176224ead42307e220b422088a70d05200ba72202417f4c0d054108210a024002402002450d0020021022224f450d12204f21500c010b4108214f410821500b41502110201541506a21514130210c201541306a2152201541f07e6a21534100215441042155417f215641012139420321204220210b4103215741022158417d21594158215a41282109412021084118210741102106417e215b4174215c4164215d41a87f215e41a07f215f4109216041e80021614178216241702163416821644160216541382166410a216741042168410021694100216a2017216b410221020c1b0b200341a0036a20153602002014450d00201810200b419a88c00041331039000b419a88c00041331039000b201941081023000b419a88c00041331039000b1031000b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b411441011023000b413441011023000b419a88c00041331039000b419a88c00041331039000b418883c2004100410010b501000b419a88c00041331039000b200241081023000b201610200c0c0b200410200b20020d00410121024195a9c000210a411521060c010b200341f0006a41026a200341c0026a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01c0023b017020032003290398033703b001410021020b200341a8016a41026a2205200341f0006a41026a2d00003a000020034190016a41086a2204200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01703b01a801200320032903b0013703900102402002450d00410121074101210520062104200a21022001280200220a4102470d110c100b20034183036a200429030037000020034188036a2003419d016a290000370000200320032f01a8013b01f002200320063600f7022003200a3600f30220032003290390013700fb02200320052d00003a00f20220034198036a41086a22024200370300200342003703980341e082c200411420034198036a100220042002290300370300200320032903980337039001024020034190016a411041c8d7c400410041001001417f460d0041a787c2002102412621040c090b02400240024002400240411410222202450d00200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d01200220032903c802370014411821042002412c6a200341c8026a41186a290300370000200241246a200341c8026a41106a2903003700002002411c6a200341c8026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b0010240024002400240024002400240200341b0016a412041c8d7c400410041001001417f460d002003410036029803200341b0016a412020034198036a41044100100141016a41044d0d0420021020411410222202450d09200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d0a200220032903f002370014412c21042002412c6a200341f0026a41186a290300370000200241246a200341f0026a41106a2903003700002002411c6a200341f0026a41086a29030037000020034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001417f460d012003410036029803200341b0016a412020034198036a41044100100141016a41044d0d05200328029803210a2002102020034198036a41086a22024200370300200342003703980341b884c200411120034198036a100220034190016a41086a200229030037030020032003290398033703900120034190016a411041c8d7c400410041001001417f460d02200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0620032802b001200c470d030c0b0b2002102041cd87c20021020c130b20021020419a88c20021020c120b4100200c460d080b41e587c2002102411621040c100b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b411441011023000b413441011023000b20034198036a41086a22024200370300200342003703980341d888c200411b20034198036a100220034190016a41086a2002290300370300200320032903980337039001024002400240024020034190016a411041c8d7c400410041001001417f460d00200341003602b00120034190016a4110200341b0016a41044100100141016a41044d0d0220032802b001200a6a200c4f0d010c030b4101200a6a200c490d020b41fb87c2002102411f21040c0a0b419a88c00041331039000b20034198036a41086a22024200370300200342003703980341b483c200410e20034198036a100220034190016a41086a2002290300370300200320032903980337039001024002400240024002400240024002400240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b0012205450d0220032802b401210741c688c2002102411221040240200341b8016a2802002209200e4d0d0002402005200e4105746a2206200341c8026a460d002006200341c8026a41201086040d010b418589c2002102411021042009200d4d0d002005200d4105746a2206200341f0026a460d022006200341f0026a4120108604450d020b2007450d12200510200c120b41c688c2002102411221040c110b200341f0006a200341f0026a10eb02200328027821022003280270210620034198036a41086a220442003703002003420037039803419084c200411220034198036a100220034190016a41086a2004290300370300200320032903980337039001410021040240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a103820032802b0012239450d03200341b8016a280200210420032802b40121180c010b41012139410021180b02400240200441ffffff3f7122042002200220044b1b2208450d0041002104200341c8016a2110200341c0016a210c200341b8016a210f2039210203400240200620046a2d0000450d0020104200370300200c4200370300200f4200370300200342003703b001200341b0016a2002460d002002200341b0016a4120108604450d00200341b0016a200210de024101212120032802b0014101470d0020032802b401200a4d0d030b200241206a2102200441016a22042008490d000b0b410021210b02402018450d00203910200b02402003280274450d00200610200b200320093602b801200320073602b401200320053602b001200341c8026a200341f0026a20211b200e200d20211b200341b0016a10ea024200210b20034198036a41086a22024200370300200342003703980341f388c200411220034198036a100220034190016a41086a200229030037030020032003290398033703900120034190016a411041c8d7c4004100410010012102024002400240024002402021450d002002417f460d01200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d072002410f4d0d07200341b8016a290300210b20032903b00121200c020b2002417f460d02200342003703b801200342003703b00120034190016a4110200341b0016a4110410010012202417f460d072002410f4d0d07200341b8016a290300212820032903b001210b0c030b420021204200210b0b200341106a200341c8026a2020200b10ac012003290310200341106a41086a29030010ad01200341bd016a200341c8026a41086a290300370000200341c5016a200341d8026a290300370000200341cd016a200341e0026a29030037000041012107200341013a00b401200341063a00b001200320032903c8023700b501200341b0016a103d0c0a0b420021280b200341206a200341c8026a103b0240024002402003290320200341286a29030084500d00411810222202450d08200241106a41002900b9ef40370000200241086a41002900b1ef40370000200241002900a9ef4037000020024118413810212202450d09200220032903f002370018200241306a200341f0026a41186a290300370000200241286a200341f0026a41106a290300370000200241206a200341f0026a41086a2903003700004200212020034198036a41186a2204420037030020034198036a41106a220a420037030020034198036a41086a2205420037030020034200370398032002413820034198036a1000200341b0016a41186a2004290300370300200341b0016a41106a200a290300370300200341b0016a41086a200529030037030020032003290398033703b001200341b0016a412041c8d7c400410041001001417f460d01200342003703a0032003420037039803200341b0016a412020034198036a4110410010012204417f460d072004410f4d0d07200341a0036a290300211b20032903980321202002102041142104411410222202450d020c0a0b41d5e8c0002102412221040c120b4200211b20021020411421044114102222020d080b200441011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411841011023000b413841011023000b200241106a41002800a5ef40360000200241086a410029009def4037000020024100290095ef40370000024020022004413410212202450d00200220032903c8023700142002412c6a200341c8026a41186a2204290300370000200241246a200341c8026a41106a2903003700002002411c6a200341c8026a41086a2903003700004200212720034198036a41186a220a420037030020034198036a41106a2205420037030020034198036a41086a2207420037030020034200370398032002413420034198036a1000200341b0016a41186a200a290300370300200341b0016a41106a2005290300370300200341b0016a41086a200729030037030020032003290398033703b001024002400240200341b0016a412041c8d7c400410041001001417f460d00200342003703a0032003420037039803200341b0016a412020034198036a411041001001220a417f460d02200a410f4d0d02200341a0036a290300211120032903980321270c010b420021110b20021020200341c8026a2027200b20202020200b56201b202856201b2028511b22021b220b7c221220112028201b20021b22287c2012202754ad7c10af01200341f0026a2020200b7d201b20287d2020200b54ad7d10b601200341bd016a200341f0026a41086a290300370000200341c5016a200341f0026a41106a290300370000200341cd016a200341f0026a41186a290300370000200341d5016a20032903c802370000200341dd016a200341c8026a41086a290300370000200341e5016a200341c8026a41106a290300370000200341ed016a200429030037000041002102200341003a00b401200341063a00b001200320032903f0023700b501200341b0016a103d0c0f0b419a88c00041331039000b413441011023000b410021020c0d0b200510200b200e0d00410121054195a9c0002102411521040c010b200341f0026a41026a200341c0026a41026a2d00003a0000200341b0016a41086a20034198036a41086a290300370300200341b0016a410d6a20034198036a410d6a290000370000200320032f01c0023b01f00220032003290398033703b001410021050b200341a8016a41026a220d200341f0026a41026a2d00003a000020034190016a41086a220e200341b0016a41086a29030037030020034190016a41106a200341b0016a41106a290300370300200320032f01f0023b01a801200320032903b0013703900120050d03200341b3026a200e290300370000200341b8026a2003419d016a290000370000200320032f01a8013b01a002200320043600a702200320023600a30220032003290390013700ab022003200d2d00003a00a20220034198036a41086a22024200370300200342003703980341dbc9c100411520034198036a1002200e20022903003703002003200329039803370390014100211a0240024002400240024002400240024020034190016a411041c8d7c400410041001001417f460d002003421037029c03200320034190016a36029803200341b0016a20034198036a10f30120032802b001220e450d0620032802b401211a41282105200341b8016a280200220f41286c220d0d010c020b4108210e4100210f41282105410041286c220d450d010b410021040340200341b0016a41206a200e20046a220241206a290300370300200341b0016a41186a200241186a290300370300200341b0016a41106a200241106a290300370300200341b0016a41086a200241086a290300370300200320022903003703b001200341b0016a200341a0026a41201086040d02200d200420056a2204470d000b0b4108211d4100211e201a450d01200e10204100211f0c0b0b20034198036a41206a2205200341b0016a41206a29030037030020034198036a41186a220d200341b0016a41186a29030037030020034198036a41106a2221200341b0016a41106a29030037030020034198036a41086a2222200341b0016a41086a290300370300200320032903b00137039803200341f0026a41206a22232005290300370300200341f0026a41186a2205200d290300370300200341f0026a41106a220d2021290300370300200341f0026a41086a2221202229030037030020032003290398033703f002200341c8026a41206a22222023290300370300200341c8026a41186a22232005290300370300200341c8026a41106a2205200d290300370300200341c8026a41086a220d2021290300370300200320032903f0023703c80241281022221d450d03201d20032903c802370300201d41206a2022290300370300201d41186a2023290300370300201d41106a2005290300370300201d41086a200d290300370300200f41286c41586a2004460d01200241286a212441282122200e200f41286c6a222341586a21254101212641202105411821214110210f4108210d4228212742202128410021294101211e4101211f410021020c040b4100211f0c090b4101211e4101211f0c070b419a88c00041331039000b412841081023000b02400340024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2024210202400340200341b0016a20056a2204200220056a290300370300200341b0016a20216a222a200220216a290300370300200341b0016a200f6a222b2002200f6a290300370300200341b0016a200d6a222c2002200d6a290300370300200320022903003703b001200341b0016a200341a0026a20051086040d012023200220226a2202470d000c1a0b0b20034198036a20056a2224200429030037030020034198036a20216a222d202a29030037030020034198036a200f6a222e202b29030037030020034198036a200d6a222f202c290300370300200320032903b00137039803200341f0026a20056a22302024290300370300200341f0026a20216a2224202d290300370300200341f0026a200f6a222d202e290300370300200341f0026a200d6a222e202f29030037030020032003290398033703f00220042030290300370300202a2024290300370300202b202d290300370300202c202e290300370300200320032903f0023703b0010240201f201e470d00201e20266a221f201e490d15201e2026742224201f201f2024491b221fad20277e2211202888a70d152011a722242029480d150240201e450d00201d201e20226c20241021221d0d010c040b20241022221d450d030b200220226a2124201d201e20226c6a222d20032903b001370300202d20056a2004290300370300202d20216a202a290300370300202d200f6a202b290300370300202d200d6a202c290300370300201e20266a211e20252002470d070c180b2017203c2202203b6a223c490d0202402017203c6b222a203f490d0020152002203d6c6a22022903002015203c203d6c6a2204290300221c5a200220406a222b2903002212200420406a222c29030022115a20122011511b0d0020034198036a20426a222e200420416a222d29030037030020034198036a20446a222f200420436a223029030037030020034198036a20406a2235200420426a2236290300370300200320042903103703980320042002290300370300202c202b290300370300200420446a200220446a2903003703002036200220426a2903003703002030200220436a290300370300202d200220416a2903003703004101212b0240202a2045490d002004290360201c5a200420466a290300221220115a20122011511b0d004103212b203e212c02400340202c220220476a2002290300370300200220486a200220416a290300370300200220496a200220436a2903003703002002204a6a200220426a2903003703002002204b6a200220446a2903003703002002204c6a200220406a290300370300202b222d202a4f0d01202d203a6a212b2002203d6a222c290300201c5a2002204d6a290300221220115a20122011511b450d000b0b202d203b6a212b0b2002201c370300200220113703082004202b203d6c6a220220416a202e290300370300200220436a202f290300370300200220426a203529030037030020022003290398033703100b203e20476a213e203c0d070c140b206b216c4100216b4101216d206c20566a222e450d0702400240024002400240024002402015202e200c6c6a22022903002015206c200c6c222c6a2204205f6a2903002212542002200a6a290300221c2004205e6a290300221154201c2011511b450d002053202c6a21020340202e2039460d0220122002290300223254210420112002200a6a290300221c51212a2011201c54212b200220106a2102202e20566a212e20322112201c21112004202b202a1b0d000c030b0b206c205b6a212d2053202c6a21024100216b410021040340202d2004460d052012200229030022325a212a20112002200a6a290300221c51212b2011201c5a212c200220106a2102200420396a210420322112201c2111202a202c202b1b0d000b200420396a216d206c20046b20566a222e0d030c020b4100212e0b206c202e490d06206c20174b0d080240206c202e6b226d203976222a450d002051202c6a21022015202e200c6c6a21040340200341b0016a20096a222b200420096a222c290300370300200341b0016a20086a222d200420086a222f290300370300200341b0016a20076a2230200420076a2235290300370300200341b0016a20066a2236200420066a226e290300370300200341b0016a200a6a226f2004200a6a2270290300370300200320042903003703b0012002200a6a22712903002111200220066a22722903002112200220076a2273290300211c200220086a2274290300213220022903002133202c200220096a2275290300370300202f20323703002035201c370300206e201237030020702011370300200420333703002075202b2903003703002074202d29030037030020732030290300370300207220362903003703002071206f290300370300200220032903b0013703002004200c6a2104200220106a2102202a20566a222a0d000b0b202e0d010b202e216b2069206a460d0f0c100b206d20604b0d01206c20174b0d052052202e200c6c6a2176410021770c100b206c216d2069206a460d090c0a0b202e216b2069206a470d0b0c0a0b202441081023000b203c2017102d000b202e206c102d000b206c202e417f6a226b490d0d0b206c2017102e000b410021020c0a0b410121020c090b410021020c070b410121020c060b410221020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2069206a470d10410121020c140b206920396a22022069490d1620692039742204200220022004491b2202ad2020862211200b88a70d162011a722042054480d16024002402069450d00206820692057742004102122680d010c030b200410222268450d020b20022169410221020c130b2068206a2057746a2202206d3602042002206b360200206a20396a2278216a20782058490d02410121770c110b200441041023000b0240024020770e020001010b206c202e20566a226b490d130240206c206b6b226d2058490d002015202e200c6c6a22022903002015206b200c6c6a2204290300221c5a2002200a6a222a29030022122004200a6a222b29030022115a20122011511b0d0020034198036a20076a222d200420096a222c29030037030020034198036a20066a222f200420086a223029030037030020034198036a200a6a2235200420076a2236290300370300200320042903103703980320042002290300370300202b202a290300370300200420066a200220066a2903003703002036200220076a2903003703002030200220086a290300370300202c200220096a2903003703004101212a0240206d2057490d002004290360201c5a200420616a290300221220115a20122011511b0d004103212a2076212b02400340202b220220106a2002290300370300200220626a200220096a290300370300200220636a200220086a290300370300200220646a200220076a290300370300200220656a200220066a2903003703002002205a6a2002200a6a290300370300202a222c206d4f0d01202c20396a212a2002200c6a222b290300201c5a200220666a290300221220115a20122011511b450d000b0b202c20566a212a0b2002201c370300200220113703082004202a200c6c6a220220096a202d290300370300200220086a202f290300370300200220076a203529030037030020022003290398033703100b206b450d0c207620106a2176206b212e206d2067490d0a410021020c110b024002400240024020682078223020566a22782057746a2202280200450d00206820302057746a222c205c6a280200222b200228020422044d0d004102216a203041024d0d042068203020596a22022057746a280204222a2004202b6a4d0d014103216a203041034d0d04202c205d6a280200202a202b6a4d0d010c050b20302057490d01200228020421042068203020596a22022057746a280204212a0b202a2004490d010b2030205b6a21020b2030200220396a22704d0d03203020024d0d04206820022057746a2236280204227120362802006a2202206820702057746a226e280200226f490d05200220174b0d06203620556a21722015206f200c6c6a222f206e2802042235200c6c22046a212a2002200c6c216a024002400240024002402002206f6b222c20356b220220354f0d00204f202a2002200c6c22041084041a205020046a212b20352039480d0120022039480d012051206a6a216a202a21020340206a200220106a222a202b20106a222c202c290300202a29030054202b205a6a29030022112002205a6a29030022125420112012511b222d1b2204290300370300206a20096a200420096a290300370300206a20086a200420086a290300370300206a20076a200420076a290300370300206a20066a200420066a290300370300206a200a6a2004200a6a290300370300202b202c202d1b212b202f202a2002202d1b22024f0d04206a20106a216a205021042050202b490d000c050b0b204f202f20041084041a205020046a212b20352039480d01202c20354c0d012015206a6a212d20502104202f210203402002202a2004202a290300200429030054202a200a6a29030022112004200a6a29030022125420112012511b222c1b226a290300370300200220096a206a20096a290300370300200220086a206a20086a290300370300200220076a206a20076a290300370300200220066a206a20066a2903003703002002200a6a206a200a6a29030037030020042004200c6a202c1b21042002200c6a2102202a200c6a202a202c1b222a202d4f0d04202b20044b0d000c040b0b202a21020c010b202f21020b205021040b20022004202b20046b226a206a200c706b1084041a2072207120356a3602002036206f360200206e206e200a6a207020567320306a2057741085041a2078216a207820394b0d0a0b206b0d060c010b2030216a206b0d060b02402069450d00206810200b204e450d11204f10200c110b41e896c2002070203010b501000b41e896c2002002203010b501000b206f2002102d000b20022017102e000b410221020c090b410221020c080b410021770c030b410121770c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102d000b1024000b200320173602b801200320313602b401200320153602b00120034198036a41086a22024200370300200342003703980341ec83c200411320034198036a100220034190016a41086a20022903003703002003200329039803370390012003411036029c03200320034190016a36029803200341b0016a20034198036a10da0202402031450d00201510200b02402019450d00201310200b02402014450d00201810200b410021020240201ba7450d00201610200b0b41012107410121050b2001280200220a4102460d050c060b201a450d00200e10200b2003201e3602b8012003201f3602b4012003201d3602b00120034198036a41086a22024200370300200342003703980341dbc9c100411520034198036a100220034190016a41086a20022903003703002003200329039803370390012003411036029c03200320034190016a36029803200341b0016a20034198036a10db02201f450d00201d10200b410021020b410121070b410121052001280200220a4102470d010b2007450d01200141086a280200450d01200128020410200c010b200a4101470d002005450d00200141086a280200450d00200128020410200b2000200436020420002002360200200341c0036a24000b9286010f067f017e067f017e017f027e027f017e017f017e057f017e417f017e047f230041e0026b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a220541044b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e050005020301000b200141046a280200210620022d0001210720022d0000210520034188026a22082002411a6a29010037030020034180026a200241126a290100370300200341f0016a41086a2002410a6a2901003703002003200241026a2901003703f0012005450d09410121080c0a0b20022d000120022d0000720d02200141086a290300210920034198026a41086a22024200370300200342003703980241c4d3c200411a20034198026a1002200341f0016a41086a200229030037030020032003290398023703f00120032009370328200341f0016a4110200341286a410810030c500b200341186a200141196a290000370300200341106a200141116a290000370300200341086a200141096a2900003703002003200129000137030020022d0001210a20022d0000210b200341f0016a41186a220c2002411a6a290100370300200341f0016a41106a200241126a290100370300200341f0016a41086a2002410a6a2901003703002003200241026a2901003703f001200b450d034101210b0c040b20022d000120022d000072450d050b41fcc5c00021054128210220044101470d4f200141046a2802002201109201200110200c4f0b200141216a2d0000210d200341c0026a41186a200141196a290000370300200341c0026a41106a200141116a290000370300200341c0026a41086a200141096a290000370300200320012900013703c00220022d0001210a20022d0000210b200341f0016a41186a220c2002411a6a290100370300200341f0016a41106a200241126a290100370300200341f0016a41086a2002410a6a2901003703002003200241026a2901003703f001200b450d074101210b0c080b200341c4016a41026a20032d00f2013a0000200341a8016a41086a20034183026a290000370300200341a8016a410d6a220e200c290000370000200320032f01f0013b01c401200320032900fb013703a8014101210b200a41ff01714101470d0020032800f301210520032800f7012102200341f0016a41026a200341c4016a41026a2d00003a0000200341286a41086a200341a8016a41086a290300370300200341286a410d6a200e290000370000200320032f01c4013b01f001200320032903a8013703284100210b0c010b412a210241a4c6c00021050b200341246a41026a220a200341f0016a41026a2d00003a000020034198026a41086a220c200341286a41086a29030037030020034198026a41106a200341286a41106a290300370300200320032f01f0013b01242003200329032837039802200b0d342003419b016a200c290300370000200341a0016a200341a5026a290000370000200320032f01243b0188012003200236008f012003200536008b012003200329039802370093012003200a2d00003a008a0120034188016a108402450d07411c10222202450d22200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c1021220b450d23200b200329030037001c200b41346a200341186a290300370000200b412c6a200341106a290300370000200b41246a200341086a29030037000020034198026a41186a2202420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200b413c20034198026a1000200341f0016a41186a2002290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f00141202102200341f0016a412041c8d7c400410041001001210a200b1020200a417f460d0b200341286a20031083032003280230220f450d104100210220032902342210422088a7220b450d110240200b4101460d004100210203402002200b410176220a20026a220c200f200c4105746a20034188016a412010860441004a1b2102200b200a6b220b41014b0d000b0b200f20024105746a20034188016a4120108604220b450d16200b411f7620026a21020c110b200141086a290300210920034198026a41086a22024200370300200342003703980241eed5c200411b20034198026a1002200341f0016a41086a200229030037030020032003290398023703f00120032009370328200341f0016a4110200341286a410810030c480b200341c4016a41026a20032d00f2013a0000200341a8016a41086a20034183026a290000370300200341a8016a410d6a22112008290000370000200320032f01f0013b01c401200320032900fb013703a80141012108200741ff01714101470d0020032800f301210520032800f7012102200341f0016a41026a200341c4016a41026a2d00003a0000200341286a41086a200341a8016a41086a290300370300200341286a410d6a2011290000370000200320032f01c4013b01f001200320032903a801370328410021080c010b41a4c6c0002105412a21020b200341246a41026a2211200341f0016a41026a2d00003a000020034198026a41086a2207200341286a41086a29030037030020034198026a41106a200341286a41106a290300370300200320032f01f0013b0124200320032903283703980220080d442003419b016a2007290300370000200341a0016a20034198026a410d6a290000370000200320032f01243b0188012003200236008f012003200536008b01200320032903980237009301200320112d00003a008a0120074200370300200342003703980241cdc8c000410d20034198026a1002200341f0016a41086a200729030037030020032003290398023703f001420021120240200341f0016a411041c8d7c400410041001001417f460d0020034200370328200341f0016a4110200341286a41084100100141016a41084d0d1b200329032821120b20034198026a41086a22024200370300200342003703980241c4d3c200411a20034198026a1002200341f0016a41086a200229030037030020032003290398023703f001200341f0016a411041c8d7c400410041001001417f460d0520034200370328200341f0016a4110200341286a41084100100141016a41084d0d1b200329032821130c060b200341c4016a41026a20032d00f2013a0000200341a8016a41086a20034183026a290000370300200341a8016a410d6a2214200c290000370000200320032f01f0013b01c401200320032900fb013703a8014101210b200a41ff01714101470d0020032800f301210520032800f7012102200341f0016a41026a200341c4016a41026a2d00003a0000200341286a41086a200341a8016a41086a290300370300200341286a410d6a2014290000370000200320032f01c4013b01f001200320032903a8013703284100210b0c010b41a4c6c0002105412a21020b200341246a41026a220a200341f0016a41026a2d00003a000020034198026a41086a220c200341286a41086a29030037030020034198026a41106a200341286a41106a290300370300200320032f01f0013b01242003200329032837039802200b0d2d200341db016a200c290300370000200341c8016a41186a220b200341a5026a290000370000200320032f01243b01c801200320023600cf01200320053600cb0120032003290398023700d3012003200a2d00003a00ca01200341c8016a108402450d01200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200341d0006a200341c8016a41086a290300370300200341d8006a200341c8016a41106a290300370300200341e0006a200b290300370300200320032903c002370328200320032903c801370348411b10222202450d1d200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d1e2002200329032837001b200241336a200341286a41186a2903003700002002412b6a200341286a41106a290300370000200241236a200341286a41086a2903003700002002413b41f60010212202450d1f2002200341c8006a220b29000037003b200241d3006a200b41186a290000370000200241cb006a200b41106a290000370000200241c3006a200b41086a29000037000020034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200241db0020034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f0014102210b0240200341f0016a412041c8d7c400410041001001417f460d00200341003a009802200341f0016a412020034198026a41014100100141016a41014d0d2320032d009802210b0b20021020200b41ff01714102470d2c200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200320032903c002370328411c10222202450d24200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c10212202450d252002200329032837001c200241346a200341286a41186a2903003700002002412c6a200341286a41106a290300370000200241246a200341286a41086a2903003700004200210920034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a220c420037030020034200370398022002413c20034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f001200341f0016a412041c8d7c400410041001001417f460d0b2003422037028c012003200341f0016a3602880120034198026a20034188016a10382003280298022215450d26200329029c0221090c0c0b41a3d5c2002105412b210220044101460d420c430b41cbd4c2002105412e210220044101460d410c420b420321130b410821084200211620034198026a41086a22024200370300200342003703980241dbc9c100411520034198026a1002200341f0016a41086a200229030037030020032003290398023703f0010240200341f0016a411041c8d7c400410041001001417f460d002003421037029c022003200341f0016a36029802200341286a20034198026a10f30120032802282208450d17200329022c21160b201320127c211220082016422088a7221141286c6a2107200821020340200720026b419f014d0d02200220034188016a460d03200220034188016a4120108604450d03200241286a220520034188016a460d04200520034188016a4120108604450d04200241d0006a220520034188016a460d04200520034188016a4120108604450d04200241f8006a220520034188016a460d04200241a0016a2102200520034188016a41201086040d000c040b0b41ced5c200210520044101460d3e0c3f0b4102210520072002460d022008201141286c6a2107034020034188016a2002460d01200220034188016a4120108604450d012007200241286a2202470d000c030b0b200221050b200541206a29030020125621050b2005410247200571210202402016a7450d00200810200b024002402002450d0020034100360230200342013703282006200341286a109501200328022c2105200328023021072003280228210220034198026a41186a2208420037030020034198026a41106a2211420037030020034198026a41086a2217420037030020034200370398022002200720034198026a1000200341c0026a41186a22072008290300370300200341c0026a41106a22082011290300370300200341c0026a41086a2211201729030037030020032003290398023703c00202402005450d00200210200b200341286a41186a2007290300370300200341286a41106a2008290300370300200341286a41086a2011290300370300200320032903c002370328411810222202450d19200241106a41002900a0d142370000200241086a4100290098d14237000020024100290090d14237000020024118413810212202450d1a20022003290328370018200241306a200341286a41186a290300370000200241286a200341286a41106a290300370000200241206a200341286a41086a29030037000020034198026a41186a2205420037030020034198026a41106a2207420037030020034198026a41086a2208420037030020034200370398022002413820034198026a1000200341f0016a41186a2005290300370300200341f0016a41106a2007290300370300200341f0016a41086a200829030037030020032003290398023703f001200341f0016a412041c8d7c4004100410010012105200210202005417f460d0141fed3c2002105411f21020c3a0b41ded3c2002105412021020c390b200341286a200341c0026a108303024020032802302202450d0020032802342105200329032821134200211620034198026a41086a22074200370300200342003703980241cdc8c000410d20034198026a1002200341f0016a41086a200729030037030020032003290398023703f0010240200341f0016a411041c8d7c400410041001001417f460d002003420037039802200341f0016a411020034198026a41084100100141016a41084d0d1220032903980221160b02402005450d00200210200b201620135a0d00419dd4c2002105411221020c390b4108210820034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f00141002107200341f0016a411041c8d7c400410041001001417f460d072003421037029c022003200341f0016a36029802200341286a20034198026a10f10120032802282208450d1e2003200329022c2216370204200320083602002016422088a721072016a721020c080b410021024101210f420021100b200341286a41186a20034188016a41186a290300370300200341286a41106a20034188016a41106a290300370300200341286a41086a20034188016a41086a290300370300200320032903880137032820022010422088a7220b4b0d18200b2010a7470d29200b41016a220a200b490d2c200b410174220c200a200a200c491bad22104205862218422088a70d2c2018a7220a4100480d2c200b450d02200f200b410574200a1021220f450d030c290b410121150b2002102020034198026a41186a220a200341c8016a41186a29030037030020034198026a41106a220c200341c8016a41106a29030037030020034198026a41086a2205200341c8016a41086a290300370300200320032903c8013703980202402009422088221ea7220b2009a7470d00200b41016a2202200b490d2b201ea7221f4101742214200220022014491bad221e4205862210422088a70d2b2010a722024100480d2b200b450d062015201f410574200210212215450d070c1e0b2009211e0c1e0b200a1022220f0d260b200a41011023000b41f9d4c2002105412a21022010a7450d1d200f102020044101460d330c340b2003410036020820034208370300410021020b20034198026a41186a2205200341c0026a41186a29030037030020034198026a41106a2211200341c0026a41106a29030037030020034198026a41086a2217200341c0026a41086a290300370300200320032903c0023703980220022007470d17200741016a22022007490d2520074101742226200220022026491b2202ad42287e2216422088a70d252016a722264100480d252007450d022008200741286c202610212208450d030c160b2002102222150d170b200241011023000b2026102222080d130b202641081023000b2003413c6a41013602002003410336029c02200341eca1c400360298022003420137022c200341f4a1c400360228200320034198026a360238200341286a418cd6c2001048000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411c41011023000b413c41011023000b411b41011023000b413b41011023000b41f60041011023000b411841011023000b413841011023000b419a88c00041331039000b41c0b8c400102f000b411c41011023000b413c41011023000b419a88c00041331039000b419a88c00041331039000b20032002360204200320083602000b2008200741286c6a220220123703002002200329039802370308200241206a2005290300370300200241186a2011290300370300200241106a2017290300370300200341086a200741016a22113602000240201141144b0d004102212b20114102490d0d4128212c2008201141286c6a212d417f212e4120212f41182130411021314108213241032133415821344178213541702136416821374160213841012139410121020c0c0b024002402011410176223bad42287e2209422088a70d002009a72202417f4c0d0041082114024002402002450d0020021022223c450d03203c213d0c010b4108213c4108213d0b4158213e200841586a213f41282140200841286a2141200841887f6a21424100214341042144417f2145410121464203211e422021094103214741022148417d21494120210d411821204110211f417e214a4174214b4164214c41b07f214d4109214e4178214f417021504168215141602152410a215341042154410021554100215620112157410221020c0d0b1031000b200241081023000b2009422088a7210b0b2015200b4105746a2202200329039802370000200241186a200a290300370000200241106a200c290300370000200241086a2005290300370000411c10222202450d06200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c1021220e450d07200e200329032837001c200e41346a200341286a41186a290300370000200e412c6a200341286a41106a290300370000200e41246a200341286a41086a29030037000020034198026a41186a2202420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200e413c20034198026a1000200341f0016a41186a2002290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f001200341003602a00220034201370398022003200b41016a22023602880120034188016a20034198026a103e024002402002450d00200b41057441206a2114410020034198026a41086a280200220b6b210c200328029802211f200328029c02210520152102034002402005200c6a411f4b0d00200b41206a220a200b490d0f20054101742220200a200a2020491b220a4100480d0f024002402005450d00201f2005200a1021221f0d010c080b200a1022221f450d070b200a21050b201f200b6a220a2002290000370000200a41186a200241186a290000370000200a41106a200241106a290000370000200a41086a200241086a290000370000200c41606a210c200b41206a210b200241206a2102201441606a22140d000b200341a0026a200b3602002003200536029c022003201f360298020c010b200341a0026a280200210b200328029c022105200328029802211f0b200341f0016a4120201f200b100302402005450d00201f10200b200e1020201ea7450d00201510200b200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200341d0006a200341c8016a41086a290300370300200341d8006a200341c8016a41106a290300370300200341e0006a200341c8016a41186a290300370300200320032903c002370328200320032903c8013703482003200d3a008801411b10222202450d02200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d032002200329032837001b200241336a200341286a41186a2903003700002002412b6a200341286a41106a290300370000200241236a200341286a41086a2903003700002002413b41f60010212202450d042002200341c8006a220b29000037003b200241d3006a200b41186a290000370000200241cb006a200b41106a290000370000200241c3006a200b41086a29000037000020034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a220c42003703002003420037039802200241db0020034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a200c29030037030020032003290398023703f001200341f0016a412020034188016a4101100320021020410021050b20044101470d160c150b200a41011023000b411b41011023000b413b41011023000b41f60041011023000b411c41011023000b413c41011023000b200f20024105746a220a41206a200a200b20026b4105741085041a200a41186a200341286a41186a290300370000200a41106a200341286a41106a290300370000200a41086a200341286a41086a290300370000200a200329032837000020034198026a41086a22024200370300200342003703980241cdc8c000410d20034198026a1002200341f0016a41086a220a200229030037030020032003290398023703f001420021180240024002400240200341f0016a411041c8d7c400410041001001417f460d0020034200370328200341f0016a4110200341286a41084100100141016a41084d0d01200329032821180b20024200370300200342003703980241eed5c200411b20034198026a1002200a200229030037030020032003290398023703f00102400240200341f0016a411041c8d7c400410041001001417f460d0020034200370328200341f0016a4110200341286a41084100100141016a41084d0d03200329032821164101210a411c210c411c10222202450d010c040b42e80721164101210a411c210c411c102222020d030b200c200a1023000b419a88c00041331039000b419a88c00041331039000b200241186a41002800c0d142360000200241106a41002900b8d142370000200241086a41002900b0d142370000200241002900a8d14237000002400240024002402002200c413c10212219450d002019200329030037001c201941346a200341186a2903003700002019412c6a200341106a290300370000201941246a200341086a29030037000020034198026a41186a2202420037030020034198026a41106a220c420037030020034198026a41086a2205420037030020034200370398022019413c20034198026a1000200341f0016a41186a2002290300370300200341f0016a41106a200c290300370300200341f0016a41086a200529030037030020032003290398023703f0012003410036023020034201370328410810222202450d012002201620187c37000020034288808080800137022c200320023602282003200b200a6a22023602980220034198026a200341286a103e0240024002402002450d00200b41057441206a210e4100200341286a41086a280200220b6b210c20032802282115200328022c2105200f2102034002402005200c6a411f4b0d00200b41206a220a200b490d0b2005410174221a200a200a201a491b220a4100480d0b024002402005450d0020152005200a102122150d010c060b200a10222215450d050b200a21050b2015200b6a220a2002290000370000200a41186a200241186a290000370000200a41106a200241106a290000370000200a41086a200241086a290000370000200c41606a210c200b41206a210b200241206a2102200e41606a220e0d000b200341306a200b3602002003200536022c200320153602280c010b200341306a280200210b200328022c2105200328022821150b2010a72102200341f0016a41202015200b100302402005450d00201510200b2019102002402002450d00200f10200b4108211920034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f0014100211b0240024002400240200341f0016a411041c8d7c400410041001001417f460d002003421037029c022003200341f0016a36029802200341286a20034198026a10f10120032802282219450d07200328022c211b4128210c200341306a280200220e41286c22050d010c020b4100210e4128210c410041286c2205450d010b200341286a41086a21024100210a0340200341286a41206a2019200a6a220b41206a290300370300200341286a41186a200b41186a290300370300200341286a41106a200b41106a2903003703002002200b41086a2903003703002003200b290300370328200341c0026a41186a200241186a290000370300200341c0026a41106a200241106a290000370300200341c0026a41086a200241086a290000370300200320022900003703c002200341c0026a200341201086040d022005200a200c6a220a470d000b0b4100211c20034100360230200342083703284108211d201b450d11201910200c110b200341c8016a41206a2202200341286a41206a290300370300200341c8016a41186a220c200341286a41186a290300370300200341c8016a41106a2205200341286a41106a290300370300200341c8016a41086a2215200341286a41086a290300370300200320032903283703c80120034198026a41206a221a200229030037030020034198026a41186a2202200c29030037030020034198026a41106a220c200529030037030020034198026a41086a22052015290300370300200320032903c80137039802200341f0016a41206a2215201a290300370300200341f0016a41186a221a2002290300370300200341f0016a41106a2202200c290300370300200341f0016a41086a220c200529030037030020032003290398023703f00141281022221d450d04201d20032903f001370300201d41206a2015290300370300201d41186a201a290300370300201d41106a2002290300370300201d41086a200c2903003703000240200e41286c41586a200a460d00200b41286a21214128211a2019200e41286c6a220f41586a212241082115200341286a41086a210b410121234120210e4118210c4110210a422821184220211041002124410121254101211c410021020c060b410121254101211c0c0f0b200a41011023000b413c41011023000b410841011023000b419a88c00041331039000b412841081023000b02400340024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2021210202400340200341286a200e6a22052002200e6a290300370300200341286a200c6a22172002200c6a290300370300200341286a200a6a22262002200a6a290300370300200b200220156a29030037030020032002290300370328200341f0016a200c6a200b200c6a290000370300200341f0016a200a6a200b200a6a290000370300200341f0016a20156a200b20156a2900003703002003200b2900003703f001200341f0016a2003200e1086040d01200f2002201a6a2202470d000c1f0b0b200341c8016a200e6a22212005290300370300200341c8016a200c6a22272017290300370300200341c8016a200a6a22282026290300370300200341c8016a20156a2229200b290300370300200320032903283703c80120034198026a200e6a222a202129030037030020034198026a200c6a2221202729030037030020034198026a200a6a2227202829030037030020034198026a20156a22282029290300370300200320032903c801370398022005202a2903003703002017202129030037030020262027290300370300200b202829030037030020032003290398023703280240201c2025470d00202520236a221c2025490d1620252023742221201c201c2021491b221cad20187e2216201088a70d162016a722212024480d1602402025450d00201d2025201a6c20211021221d0d010c080b20211022221d450d070b2002201a6a2121201d2025201a6c6a222720032903283703002027200e6a20052903003703002027200c6a20172903003703002027200a6a2026290300370300202720156a200b290300370300202520236a212520222002470d070c1d0b201120072202202e6a2207490d010240201120076b2217202b490d0020082002202c6c6a220229030020082007202c6c6a220529030022165a0d0020034198026a20306a22292005202f6a222629030037030020034198026a20316a222a200520306a222729030037030020034198026a20326a223a200520316a2228290300370300200320052903083703980220052002290300370300200520326a200220326a2903003703002028200220316a2903003703002027200220306a29030037030020262002202f6a29030037030041012126024020172033490d00200529035020165a0d0041032126202d2127024003402027220220346a2002290300370300200220356a2002202f6a290300370300200220366a200220306a290300370300200220376a200220316a290300370300200220386a200220326a2903003703002026222820174f0d01202820396a21262002202c6a22272903002016540d000b0b2028202e6a21260b2002201637030020052026202c6c6a22022003290398023703082002202f6a2029290300370300200220306a202a290300370300200220316a203a2903003703000b202d20346a212d20070d070c130b205721584100215741012159205820456a2229450d0702400240024002400240024002402008202920406c6a2903002008205820406c22276a204d6a29030022165a0d00204220276a2102034020292046460d02202920456a21292016200229030022125421052002203e6a21022012211620050d000c030b0b2058204a6a2126204220276a21054100215741002102034020262002460d05200220466a21022016200529030022125a21172005203e6a21052012211620170d000b200220466a2159205820026b20456a22290d030c020b410021290b20582029490d05205820114b0d070240205820296b22592046762217450d002008202920406c6a2102203f20276a21050340200341c8016a200d6a22262002200d6a2227290300370300200341c8016a20206a2228200220206a222a290300370300200341c8016a201f6a223a2002201f6a225a290300370300200341c8016a20146a225b200220146a225c290300370300200320022903003703c801200520146a225d29030021162005201f6a225e2903002112200520206a225f29030021132005290300216020272005200d6a2261290300370300202a2013370300205a2012370300205c20163703002002206037030020612026290300370300205f2028290300370300205e203a290300370300205d205b290300370300200520032903c801370300200220406a21022005203e6a2105201720456a22170d000b0b20290d010b2029215720552056460d0f0c100b2059204e4b0d01205820114b0d042041202920406c6a2162410021630c100b2058215920552056460d090c0a0b2029215720552056470d0b0c0a0b20072011102d000b20292058102d000b20582029417f6a2257490d0e0b20582011102e000b202141081023000b410021020c0a0b410121020c090b410021020c070b410121020c060b410221020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b20552056470d10410121020c140b205520466a22022055490d1720552046742205200220022005491b2202ad201e862216200988a70d172016a722052043480d17024002402055450d00205420552047742005102122540d010c030b200510222254450d020b20022155410221020c130b205420562047746a2202205936020420022057360200205620466a2264215620642048490d02410121630c110b200541041023000b0240024020630e020001010b2058202920456a2257490d130240205820576b22592048490d002008202920406c6a22022903002008205720406c6a220529030022165a0d0020034198026a20206a22282005200d6a221729030037030020034198026a201f6a222a200520206a222629030037030020034198026a20146a223a2005201f6a2227290300370300200320052903083703980220052002290300370300200520146a200220146a29030037030020272002201f6a2903003703002026200220206a29030037030020172002200d6a29030037030041012117024020592047490d00200529035020165a0d0041032117206221260240034020262202203e6a20022903003703002002204f6a2002200d6a290300370300200220506a200220206a290300370300200220516a2002201f6a290300370300200220526a200220146a2903003703002017222720594f0d01202720466a2117200220406a22262903002016540d000b0b202720456a21170b200220163703002005201720406c6a22022003290398023703082002200d6a2028290300370300200220206a202a2903003703002002201f6a203a2903003703000b2057450d0c2062203e6a21622057212920592053490d0a410021020c110b024002400240024020542064223a20456a22642047746a2202280200450d002054203a2047746a2227204b6a2802002226200228020422054d0d0041022156203a41024d0d042054203a20496a22022047746a2802042217200520266a4d0d0141032156203a41034d0d042027204c6a280200201720266a4d0d010c050b203a2047490d01200228020421052054203a20496a22022047746a28020421170b20172005490d010b203a204a6a21020b203a200220466a225e4d0d03203a20024d0d04205420022047746a225b280204225f205b2802006a22022054205e2047746a225c280200225d490d05200220114b0d06205b20446a21612008205d20406c6a222a205c280204225a20406c22056a2117200220406c2156024002400240024002402002205d6b2227205a6b2202205a4f0d00203c2017200220406c22051084041a203d20056a2126205a2046480d0120022046480d01203f20566a215620172102034020562002203e6a22172026203e6a2227202729030020172903005422281b22052903003703002056200d6a2005200d6a290300370300205620206a200520206a2903003703002056201f6a2005201f6a290300370300205620146a200520146a2903003703002026202720281b2126202a2017200220281b22024f0d042056203e6a2156203d2105203d2026490d000c050b0b203c202a20051084041a203d20056a2126205a2046480d012027205a4c0d01200820566a2128203d2105202a21020340200220172005201729030020052903005422271b22562903003703002002200d6a2056200d6a290300370300200220206a205620206a2903003703002002201f6a2056201f6a290300370300200220146a205620146a2903003703002005200520406a20271b2105200220406a2102201720406a201720271b221720284f0d04202620054b0d000c040b0b201721020c010b202a21020b203d21050b20022005202620056b225620562040706b1084041a2061205f205a6a360200205b205d360200205c205c20146a205e204573203a6a2047741085041a20642156206420464b0d0a0b20570d060c010b203a215620570d060b02402055450d00205410200b203b450d10203c10200c100b41e896c200205e203a10b501000b41e896c2002002203a10b501000b205d2002102d000b20022011102e000b410221020c090b410221020c080b410021630c030b410121630c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b20572058102d000b20034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f0012003200341f0016a3602282003411036022c2003200341286a10f201200341c8016a41186a200341c0026a41186a290300370300200341c8016a41106a200341c0026a41106a290300370300200341c8016a41086a200341c0026a41086a290300370300200320032903c0023703c801200341286a200641e0001084041a411810222202450d01200241106a41002900a0d142370000200241086a4100290098d14237000020024100290090d14237000020024118413810212202450d02200220032903c801370018200241306a200341c8016a41186a290300370000200241286a200341c8016a41106a290300370000200241206a200341c8016a41086a29030037000020034198026a41186a2201420037030020034198026a41106a220b420037030020034198026a41086a220a420037030020034200370398022002413820034198026a1000200341f0016a41186a2001290300370300200341f0016a41106a200b290300370300200341f0016a41086a200a29030037030020032003290398023703f001200341003602a0022003420137039802200341286a20034198026a109501200328029c022101200341f0016a4120200328029802220b20032802a002100302402001450d00200b10200b20021020200341286a109201200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200320032903c002370328412010222202450d032002200329038801370000200241186a20034188016a41186a290300370000200241106a20034188016a41106a290300370000200241086a20034188016a41086a290300370000411c10222201450d04200141186a41002800c7d442360000200141106a41002900bfd442370000200141086a41002900b7d442370000200141002900afd4423700002001411c413c10212201450d052001200329032837001c200141346a200341286a41186a2903003700002001412c6a200341286a41106a290300370000200141246a200341286a41086a29030037000020034198026a41186a220b420037030020034198026a41106a220a420037030020034198026a41086a2214420037030020034200370398022001413c20034198026a1000200341f0016a41186a200b290300370300200341f0016a41106a200a290300370300200341f0016a41086a201429030037030020032003290398023703f001200341003602a0022003420137039802200341013602c801200341c8016a20034198026a103e200328029802210b200328029c02220a20032802a002220c6b411f4b0d07200c41206a2205200c490d00200a410174221f20052005201f491b22054100480d0002400240200a450d00200b200a20051021220b450d010c080b20051022220b0d070b200541011023000b1024000b411841011023000b413841011023000b412041011023000b411c41011023000b413c41011023000b2005210a0b200b200c6a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a2900003700002014200c41206a220c3602002003200a36029c022003200b36029802200341f0016a4120200b200c10030240200a450d00200b10200b2001102020021020200341286a41186a200341c0026a41186a290300370300200341286a41106a200341c0026a41106a290300370300200341286a41086a200341c0026a41086a290300370300200341d0006a20034188016a41086a290300370300200341d8006a20034188016a41106a290300370300200341e0006a20034188016a41186a290300370300200320032903c0023703282003200329038801370348200341013a00c801024002400240411b10222202450d00200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d012002200329032837001b200241336a200341286a41186a2903003700002002412b6a200341286a41106a290300370000200241236a200341286a41086a2903003700002002413b41f60010212202450d022002200341286a41206a220129000037003b200241d3006a200141186a290000370000200241cb006a200141106a290000370000200241c3006a200141086a29000037000020034198026a41186a2201420037030020034198026a41106a220b420037030020034198026a41086a220a42003703002003420037039802200241db0020034198026a1000200341f0016a41186a2001290300370300200341f0016a41106a200b290300370300200341f0016a41086a200a29030037030020032003290398023703f001200341f0016a4120200341c8016a410110032002102002402003280204450d00200328020010200b20061020410021050c080b411b41011023000b413b41011023000b41f60041011023000b0240201b450d00201910200b200320253602302003201c36022c2003201d3602280b20034198026a41086a22024200370300200342003703980241f9d0c200411720034198026a1002200341f0016a41086a200229030037030020032003290398023703f0012003411036029c022003200341f0016a36029802200341286a20034198026a10f2010240201c450d00201d10200b200341286a41186a200341186a290300370300200341286a41106a200341106a290300370300200341286a41086a200341086a2903003703002003200329030037032802400240024002400240411c10222202450d00200241186a41002800c7d442360000200241106a41002900bfd442370000200241086a41002900b7d442370000200241002900afd4423700002002411c413c10212202450d012002200329032837001c200241346a200341286a41186a220b2903003700002002412c6a200341286a41106a220a290300370000200241246a200341286a41086a220c29030037000020034198026a41186a2205420037030020034198026a41106a2214420037030020034198026a41086a221f420037030020034200370398022002413c20034198026a1000200341f0016a41186a2005290300370300200341f0016a41106a2014290300370300200341f0016a41086a201f29030037030020032003290398023703f001200341f0016a4120100920021020200b200341186a290300370300200a200341106a290300370300200c200341086a29030037030020032003290300370328411810222202450d02200241106a41002900a0d142370000200241086a4100290098d14237000020024100290090d14237000020024118413810212202450d0320022003290328370018200241306a200341286a41186a290300370000200241286a200341286a41106a290300370000200241206a200341286a41086a2903003700004200210920034198026a41186a220a420037030020034198026a41106a220c420037030020034198026a41086a220b420037030020034200370398022002413820034198026a1000200341f0016a41186a200a290300370300200341f0016a41106a200c290300370300200341f0016a41086a220a200b29030037030020032003290398023703f001200341f0016a4120100920021020200b4200370300200342003703980241dbc9c100411520034198026a1002200a200b29030037030020032003290398023703f001024002400240024002400240200341f0016a411041c8d7c400410041001001417f460d002003421037029c022003200341f0016a36029802200341286a20034198026a10f30120032802282215450d0a200329022c2209422088a722020d010c020b410821154200422088a72202450d010b200241286c210c200341286a41206a210a2015210b0340200a200b290000370000200341286a41186a2205200341186a290300370300200341286a41106a2214200341106a290300370300200341286a41086a221f200341086a290300370300200a41086a2220200b41086a290000370000200a41106a220d200b41106a290000370000200a41186a220e200b41186a29000037000020032003290300370328411b10222202450d02200241176a4100280088ae42360000200241106a4100290081ae42370000200241086a41002900f9ad42370000200241002900f1ad423700002002411b413b10212202450d032002200329032837001b200241336a20052903003700002002412b6a2014290300370000200241236a201f2903003700002002413b41f60010212202450d04200b41286a210b2002200a29000037003b200241d3006a200e290000370000200241cb006a200d290000370000200241c3006a202029000037000020034198026a41186a2205420037030020034198026a41106a2214420037030020034198026a41086a221f42003703002003420037039802200241db0020034198026a1000200341f0016a41186a2005290300370300200341f0016a41106a2014290300370300200341f0016a41086a201f29030037030020032003290398023703f001200341f0016a4120100920021020200c41586a220c0d000b0b2009a7450d09201510200c090b411b41011023000b413b41011023000b41f60041011023000b411c41011023000b413c41011023000b411841011023000b413841011023000b419a88c00041331039000b2006109201200610200c020b4100210520044101470d010b200141046a2802002201109201200110200b2000200236020420002005360200200341e0026a24000bc98b0105037f027e047f017e087f23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410b4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c00070405020809060c030b01000b200141106a2903002106200141086a2903002107200141046a280200210420022d0001210820022d0000210520034188056a22092002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d1d410121090c1e0b20022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d0c410121040c0d0b200141046a280200210420022d000120022d000072450d0e20041092012004102020012d00002104410021090c070b200341e0006a41186a200141196a290000370300200341e0006a41106a200141116a290000370300200341e0006a41086a200141096a2900003703002003200129000137036020022d0001210920022d00002105200341f0046a41186a22042002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d0e410121040c0f0b200141046a280200210920012d0001210820022d0001210a20022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d10410121040c110b200141046a280200210a20012d0001210b20022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d12410121040c130b200341e8036a41186a200141196a290000370300200341e8036a41106a200141116a290000370300200341e8036a41086a200141096a290000370300200320012900013703e80320022d0001210920022d00002105200341f0046a41186a22042002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d14410121040c150b200141046a280200210820022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d19410121040c1a0b4101210920022d000120022d0000720d01200141046a28020010ee010c740b4101210920022d000120022d000072450d1a0b41fcc5c000210241282105200441ff017122044101460d0220044105470d772009450d77200141046a2201280200109201200128020010200c770b200141216a2d00002109200341206a41186a200141196a290000370300200341206a41106a200141116a290000370300200341206a41086a200141096a2900003703002003200129000137032020022d0001210820022d00002105200341f0046a41186a22042002411a6a290100370300200341f0046a41106a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d19410121040c1a0b20022d0001210920022d0000210520034188056a22042002411a6a29010037030020034180056a200241126a290100370300200341f0046a41086a2002410a6a2901003703002003200241026a2901003703f0042005450d1b410121040c1c0b200141046a2201280200109201200128020010200c740b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b412a210541a4c6c00021020b20034190016a41026a2209200341e8036a41026a2d00003a0000200341a8036a41086a220820034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d302003418b026a200829030037000020034190026a200341a8036a410d6a290000370000200320032f0190013b01f801200320053600ff01200320023600fb01200320032903a80337008302200320092d00003a00fa01411510222202450d3d2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d3e200220032903f8013700152002412d6a200341f8016a41186a290300370000200241256a200341f8016a41106a2903003700002002411d6a200341f8016a41086a290300370000200341b0016a41186a22054200370300200341b0016a41106a22044200370300200341b0016a41086a22094200370300200342003703b00120024135200341b0016a1000200341f0046a41186a2005290300370300200341f0046a41106a2004290300370300200341f0046a41086a2009290300370300200320032903b0013703f004200341f0046a412041c8d7c4004100410010012105200210202005417f460d21411510222202450d4b2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d4c200220032903f8013700152002412d6a200341f8016a41186a290300370000200241256a200341f8016a41106a2903003700002002411d6a200341f8016a41086a2903003700004200210c200341b0016a41186a22054200370300200341b0016a41106a22044200370300200341b0016a41086a22094200370300200342003703b00120024135200341b0016a1000200341f0046a41186a2005290300370300200341f0046a41106a2004290300370300200341f0046a41086a2009290300370300200320032903b0013703f00420034198026a200341f0046a1059024020032d00b902220941024622050d00200341f0046a412010090b200341a8036a41086a2208200341c2026a290100370300200341a8036a41106a200341ca026a290100370300200341a8036a41186a200341d2026a29010037030020034188036a41086a220a200341e3026a29000037030020034188036a41106a200341eb026a29000037030020034188036a41186a200341f3026a290000370300200320032901ba023703a8032003200341db026a29000037038803200341da026a2d0000210420033000b80221062002102020050d6b200341e0006a41186a200341a8036a41186a290300370300200341e0006a41106a200341a8036a41106a290300370300200341e0006a41086a2008290300370300200341c8036a41086a200a290300370300200341c8036a41106a20034188036a41106a290300370300200341c8036a41186a20034188036a41186a290300370300200320032903a80337036020032003290388033703c803410021020240200441ff01714101470d00411510222202450d5e2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d5f200220032903c8033700152002412d6a200341e0036a290300370000200241256a200341d8036a2903003700002002411d6a200341c8036a41086a2903003700000b20094101470d2a411510222205450d5f2005410d6a41002900ceef40370000200541086a41002900c9ef40370000200541002900c1ef4037000020054115413510212205450d60200520032903603700152005412d6a200341e0006a41186a290300370000200541256a200341e0006a41106a2903003700002005411d6a200341e0006a41086a290300370000200341b0016a41186a22084200370300200341b0016a41106a220a4200370300200341b0016a41086a220b4200370300200342003703b00120054135200341b0016a1000200341f0046a41186a220d2008290300370300200341f0046a41106a220e200a290300370300200341f0046a41086a200b290300370300200320032903b0013703f00420034198026a200341f0046a105920032d00b9024102460d61200341e8036a20034198026a41c2001084041a200341e8036a41c2006a20043a0000200341ab046a20032903c803370000200341b3046a200341c8036a41086a290300370000200341bb046a200341c8036a41106a290300370000200341c3046a200341c8036a41186a29030037000020084200370300200a4200370300200341b0016a41086a22044200370300200342003703b00120054135200341b0016a1000200d2008290300370300200e200a290300370300200341f0046a41086a2004290300370300200320032903b0013703f004200341003602a0022003420137039802412010222204450d62200420032903e803370000200441086a200341e8036a41086a290300370000200441106a200341e8036a41106a290300370000200441186a200341e8036a41186a290300370000200342a0808080800437029c0220032004360298022004412041c00010212204450d632004200341e8036a41206a2d00003a0020200342c0808080900437029c02200320043602980220034189046a20034198026a10b702200328029c022104200341f0046a41202003280298022208200341a0026a280200100302402004450d00200810200b200510204101210b2002450d340c680b200141086a290300210720012d0001210220034198026a41086a22054200370300200342003703980241cdc8c000410d20034198026a1002200341b0016a41086a200529030037030020032003290398023703b001420021060240200341b0016a411041c8d7c400410041001001417f460d002003420037039802200341b0016a411020034198026a41084100100141016a41084d0d3a20032903980221060b20034198026a41086a22054200370300200342003703980241f9edc000411620034198026a1002200341b0016a41086a200529030037030020032003290398023703b001200341b0016a411041c8d7c400410041001001417f460d232003420037039802200341b0016a411020034198026a41084100100141016a41084d0d3a200329039802210c0c240b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01b001200320032903d00437039802410021040c010b412a210541a4c6c00021020b200341f8016a41026a2209200341b0016a41026a2d00003a0000200341c8036a41086a220820034198026a41086a290300370300200341c8036a41106a20034198026a41106a290300370300200320032f01b0013b01f80120032003290398023703c80320040d2c200341fb036a200829030037000020034180046a200341c8036a410d6a290000370000200320032f01f8013b01e803200320053600ef03200320023600eb03200320032903c8033700f303200320092d00003a00ea0320034198026a200341e0006a10b2024101210420032d0098024101470d1820034192016a20032d009b023a0000200341a8036a41086a200341ac026a290200370300200341a8036a410d6a200341b1026a290000370000200320032f0099023b0190012003200341a4026a2902003703a80320034198026a41086a280200210541002104200328029c0221020c190b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220b2004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200a41ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200b290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a220a200341e8036a41026a2d00003a0000200341a8036a41086a220b20034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d29200341c0006a41026a2204200a2d00003a000020034188036a41086a220a200b29030037030020034188036a410d6a220b200341a8036a410d6a290000370000200320032f0190013b0140200320032903a80337038803200341ab026a200a290300370000200341b0026a200b2900003700002003200536009f022003200236009b02200320042d00003a009a02200320032f01403b01980220032003290388033700a302200341106a20034198026a2009200810b80220032802142105200328021021020c290b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a2209200341e8036a41026a2d00003a0000200341a8036a41086a220820034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d26200341fb036a200829030037000020034180046a200341a8036a410d6a290000370000200320032f0190013b01e803200320053600ef03200320023600eb03200320032903a8033700f303200320092d00003a00ea0320034198026a200341e8036a10b2024101210420032d0098024101470d14200341c2006a20032d009b023a0000200341b0016a41086a200341ac026a290200370300200341b0016a410d6a200341b1026a290000370000200320032f0099023b01402003200341a4026a2902003703b00120034198026a41086a280200210541002104200328029c0221020c150b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01b001200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a2209200341b0016a41026a2d00003a0000200341a8036a41086a220820034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01b0013b01900120032003290398023703a80320040d23200341c0006a41026a20092d00003a000020034188036a41086a200829030037030020034188036a410d6a200341a8036a410d6a290000370000200320032f0190013b0140200320032903a80337038803410f10222204450d32200441076a410029008def4037000020044100290086ef403700002004410f412f10212204450d33200420032903e80337000f200441276a200341e8036a41186a220b2903003700002004411f6a200341e8036a41106a220d290300370000200441176a200341e8036a41086a220e290300370000200341b0016a41186a22094200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b0012004412f200341b0016a1000200341f0046a41186a2009290300370300200341f0046a41106a2008290300370300200341f0046a41086a200a290300370300200320032903b0013703f004200341f0046a412041c8d7c4004100410010012109200410202009417f460d1641c1bfc1002102410f21050c230b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220a2009290000370000200320032f01f0043b01ec04200320032900fb043703d00441012109200841ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200a290000370000200320032f01ec043b01b001200320032903d00437039802410021090c010b41a4c6c0002102412a21050b20034190016a41026a220a200341b0016a41026a2d00003a0000200341a8036a41086a220b20034198026a41086a2208290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01b0013b01900120032003290398023703a80320090d0b200341fb036a200b290300370000200341e8036a41186a200341b5036a290000370000200320032f0190013b01e803200320053600ef03200320023600eb03200320032903a8033700f3032003200a2d00003a00ea0320084200370300200342003703980241abbec100411820034198026a1002200341b0016a41086a200829030037030020032003290398023703b001200341b0016a411041c8d7c400410041001001417f460d0a200342003703a0022003420037039802200341b0016a411020034198026a4110410010012202417f460d2c2002410f4d0d2c200329039802200756200341a0026a290300220c200656200c2006511b450d0a41c3bec1002102410d21050c0b0b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220a2004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341b0016a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200a290000370000200320032f01ec043b01b001200320032903d00437039802410021040c010b41a4c6c0002102412a21050b20034190016a41026a2209200341b0016a41026a2d00003a0000200341a8036a41086a220a20034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01b0013b01900120032003290398023703a80320040d1d200341fb036a200a290300370000200341e8036a41186a200341b5036a290000370000200320032f0190013b01e803200320053600ef03200320023600eb03200320032903a8033700f303200320092d00003a00ea0320034198026a200810e30120032802a802220a450d0f200341b4026a280200210b20034198026a41186a280200210220032802ac022104200341086a200341e8036a200329029c022206422086200335029802842207200341a4026a350200422086200642208884220610b0012003280208450d1441a7bfc1002102411a21052004450d1d200a10200c1d0b200141046a2802002102200341e8036a200141086a290300220610ef01024020032802f003220520024d0d00024020032802e803200241e8006c6a2202280200410f460d0020021092010b2002410f360200200241046a20034198026a41e4001084041a0b411710222202450d342002410f6a410029009c9141370000200241086a410029009591413700002002410029008d914137000020024117412e10212202450d3520022006370017200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b0012002411f200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f0042003412036029c022003200341f0046a36029802200341e8036a20034198026a10f0012002102020032802e803210402402005450d00200541e8006c210520042102034002402002280200410f460d0020021092010b200241e8006a2102200541987f6a22050d000b0b20032802ec03450d58200410200c580b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a220a2004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200841ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a200a290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b412a210541a4c6c00021020b20034190016a41026a2208200341e8036a41026a2d00003a0000200341a8036a41086a220a20034198026a41086a290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d192003418b026a200a290300370000200341f8016a41186a2204200341a8036a410d6a290000370000200320032f0190013b01f801200320053600ff01200320023600fb01200320032903a80337008302200320082d00003a00fa0120034188036a41186a200429030037030020034188036a41106a200341f8016a41106a29030037030020034188036a41086a200341f8016a41086a290300370300200320032903f80137038803200341e0006a41186a200341206a41186a290300370300200341e0006a41106a200341206a41106a290300370300200341e0006a41086a200341206a41086a290300370300200320093a00800120032003290320370360411510222202450d2a2002410d6a41002900ceef40370000200241086a41002900c9ef40370000200241002900c1ef4037000020024115413510212202450d2b20022003290388033700152002412d6a20034188036a41186a290300370000200241256a20034188036a41106a2903003700002002411d6a20034188036a41086a290300370000200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b00120024135200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f004200341e8036a200341f0046a105920032d00890422084102470d092004420037030020094200370300200341b0016a41086a22084200370300200342003703b00141b791c100411d200341b0016a100020034198026a41186a200429030037030020034198026a41106a200929030037030020034198026a41086a2008290300370300200320032903b0013703980220034198026a412041c8d7c400410041001001417f460d1220034188056a420037030020034180056a4200370300200341f0046a41086a4200370300200342003703f00420034198026a4120200341f0046a4120410010012204417f460d362004411f4d0d36200341ec046a41026a220420032d00f2043a0000200341d0046a41086a220920034183056a290000370300200341d0046a410d6a220820034188056a290000370000200320032f01f0043b01ec04200320032900fb043703d00420032800f304210a20032800f704210b200341ac016a41026a220d20042d00003a000020034190016a41086a220e200929030037030020034190016a410d6a220f2008290000370000200320032f01ec043b01ac01200320032903d004370390012004200d2d00003a00002009200e2903003703002008200f290000370000200320032f01ac013b01ec0420032003290390013703d004411510222204450d3a2004410d6a41002900ceef40370000200441086a41002900c9ef40370000200441002900c1ef4037000020044115413510212204450d3b200420032f01ec043b00152004200b36001c2004200a360018200420032903d004370020200441176a200341ec046a41026a2d00003a0000200441286a200341d0046a41086a2903003700002004412d6a200341dd046a290000370000200341b0016a41186a22094200370300200341b0016a41106a22084200370300200341b0016a41086a220d4200370300200342003703b00120044135200341b0016a1000200341f0046a41186a220e2009290300370300200341f0046a41106a220f2008290300370300200341f0046a41086a2210200d290300370300200320032903b0013703f00420034198026a200341f0046a105920032d00b9024102460d3c200e20034198026a41186a290300370300200f20034198026a41106a290300370300201020034198026a41086a29030037030020032003290398023703f00420032d00b8022111200341b0016a200341b9026a41c2001084041a200341a8036a41186a2212200e290300370300200341a8036a41106a2213200f290300370300200341a8036a41086a22142010290300370300200320032903f0043703a80320034198026a200341b0016a41c2001084041a200341c8036a41186a2012290300370300200341c8036a41106a2013290300370300200341c8036a41086a2014290300370300200320032903a8033703c80320032d00b90221122009420037030020084200370300200d4200370300200342003703b00120044135200341b0016a1000200e2009290300370300200f20082903003703002010200d290300370300200320032903b0013703f004412010222209450d3d200920032903c803370000200941186a200341c8036a41186a290300370000200941106a200341c8036a41106a290300370000200941086a200341c8036a41086a2903003700002009412041c00010212209450d3e200941013a0021200920113a0020200941c00041800110212209450d3f20092003290388033700222009413a6a20034188036a41186a290300370000200941326a20034188036a41106a2903003700002009412a6a20034188036a41086a290300370000200341ba026a410020124101461b2208450d15200941c2006a41013a0000200941db006a200841186a290000370000200941d3006a200841106a290000370000200941cb006a200841086a2900003700002009200829000037004341e30021080c160b200341ec046a41026a20032d00f2043a0000200341d0046a41086a20034183056a290000370300200341d0046a410d6a22082004290000370000200320032f01f0043b01ec04200320032900fb043703d00441012104200941ff01714101470d0020032800f304210220032800f7042105200341e8036a41026a200341ec046a41026a2d00003a000020034198026a41086a200341d0046a41086a29030037030020034198026a410d6a2008290000370000200320032f01ec043b01e803200320032903d00437039802410021040c010b412a210541a4c6c00021020b20034190016a41026a2209200341e8036a41026a22082d00003a0000200341a8036a41086a220a20034198026a41086a220b290300370300200341a8036a41106a20034198026a41106a290300370300200320032f01e8033b01900120032003290398023703a80320040d16200341c0006a41026a220420092d00003a000020034188036a41086a2209200a29030037030020034188036a410d6a220a200341a8036a410d6a290000370000200320032f0190013b0140200320032903a80337038803200820042d00003a0000200b200929030037030020034198026a410d6a200a290000370000200320032f01403b01e803200320032903880337039802410f10222204450d29200441076a410029008def4037000020044100290086ef403700002004410f412f10212204450d2a200420032f01e8033b000f2004200536001620042002360012200420032903980237001a200441116a200341ea036a2d00003a0000200441226a20034198026a41086a290300370000200441276a200341a5026a290000370000200341b0016a41186a22024200370300200341b0016a41106a22054200370300200341b0016a41086a22094200370300200342003703b0012004412f200341b0016a1000200341f0046a41186a2002290300370300200341f0046a41106a2005290300370300200341f0046a41086a2009290300370300200320032903b0013703f004200341f0046a412010092004102041012109410121080c4d0b2003200341e8036a2007200610b0012003280200450d0b41d0bec1002102411a21050b200410920120041020410021084101210920012d000022044101470d540c530b410b2105418887c20021020b200341c0006a41026a220920034190016a41026a2d00003a0000200341b0016a41086a2208200341a8036a41086a290300370300200341b0016a41106a200341a8036a41106a290300370300200320032f0190013b0140200320032903a8033703b00120040d12200341ab026a200829030037000020034198026a41186a2204200341bd016a290000370000200320032f01403b0198022003200536009f022003200236009b02200320032903b0013700a302200320092d00003a009a0220034198026a200341e8036a4120108604450d0a41d0bfc1002102410b21050c120b410b2105418887c20021020b200341f8016a41026a2209200341c0006a41026a2d00003a0000200341c8036a41086a2208200341b0016a41086a290300370300200341c8036a41106a200341b0016a41106a290300370300200320032f01403b01f801200320032903b0013703c80320040d10200341e0006a41026a220420092d00003a000020034188036a41086a2209200829030037030020034188036a410d6a2208200341c8036a410d6a290000370000200320032f01f8013b0160200320032903c80337038803200341ab026a2009290300370000200341b0026a20082900003700002003200536009f022003200236009b02200320042d00003a009a02200320032f01603b01980220032003290388033700a302200341186a20034198026a200a200b10b802200328021c2105200328021821020c100b200341c0006a41186a200341a2046a290100370300200341c0006a41106a2003419a046a290100370300200341c0006a41086a20034192046a290100370300200341c8036a41026a200341ad046a2d00003a0000200341f0046a41086a200341be046a290100370300200341fd046a200341c3046a2900003700002003200329018a043703402003200341ab046a2f00003b01c8032003200341b6046a2901003703f004200341b2046a280100210b200341ae046a280100210a200341aa046a2d000021040c0e0b41dbbfc1002102410d21050c0e0b4183bfc1002102412421050c0d0b20034198026a41186a200b29030037030020034198026a41106a200d29030037030020034198026a41086a200e290300370300200320032903e80337039802200341c8036a41026a200341c0006a41026a2d00003a0000200341e0006a41086a20034188036a41086a290300370300200341e0006a410d6a20034188036a410d6a290000370000200320032f01403b01c8032003200329038803370360410f10222204450d2a200441076a410029008def4037000020044100290086ef403700002004410f412f10212209450d2b200920032903980237000f200941276a20034198026a41186a2903003700002009411f6a20034198026a41106a290300370000200941176a20034198026a41086a290300370000200341b0016a41186a22044200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b0012009412f200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2008290300370300200341f0046a41086a200a290300370300200320032903b0013703f004412010222204450d2c200420032f01c8033b000020042005360007200420023600032004200329036037000b200441026a200341c8036a41026a2d00003a0000200441136a200341e0006a41086a290300370000200441186a200341ed006a290000370000200341f0046a412020044120100320041020200910200c480b42e807210c0b20034198026a200441e0001084041a200341e8036a200c20067c20034198026a2002200710e601200341f0036a280200210520032802ec03210220032802e803210a20041020410121084100210920024100200a4101461b210220012d000022044101470d4a0c490b20034198026a41086a22024200370300200342003703980241eabec100411920034198026a1002200341b0016a41086a200229030037030020032003290398023703b001410021090240200341b0016a411041c8d7c400410041001001417f460d002003410036029802200341b0016a411020034198026a41044100100141016a41044d0d2120032802980221090b20034198026a41086a22054200370300200342003703980241eabec100411920034198026a1002200341b0016a41086a2208200529030037030020032003290398023703b0012003200941016a36029802200341b0016a411020034198026a41041003412010222202450d31200220032903e803370000200341ac026a428180808010370200200241186a200341e8036a41186a290300370000200241106a200341e8036a41106a290300370000200241086a200341e8036a41086a2903003700002003200737039802200320023602a802200320063703a002200920034198026a10b90220054200370300200342003703980241a490c100411520034198026a10022008200529030037030020032003290398023703b00141002102200341b0016a411041c8d7c400410041001001417f460d0a200342103702642003200341b0016a36026020034198026a200341e0006a10e2012003280298022208450d35200341a0026a2802002102200328029c02210a0c0b0b200341c0006a41186a2209200341e8036a41186a290300370300200341c0006a41106a220d200341e8036a41106a290300370300200341c0006a41086a220e200341e8036a41086a290300370300200320032903e80337034020042002470d03200441016a22052004490d222004410174220f20052005200f491b220fad420586220c422088a70d22200ca722054100480d222004450d0f200a200441057420051021220a0d100c3c0b2004200341e0006a41186a29030037030020034198026a41106a200341e0006a41106a29030037030020034198026a41086a200341e0006a41086a2903003703002003200329036037039802410f10222205450d3041002102200541076a410029008def4037000020054100290086ef403700002005410f412f10212205450d31200520032903980237000f200541276a20034198026a41186a2903003700002005411f6a20034198026a41106a290300370000200541176a20034198026a41086a290300370000200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b0012005412f200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f004200341f0046a41201009200510200c440b200341b0016a41186a22044200370300200341b0016a41106a2209420037030020084200370300200342003703b00141b791c100411d200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a2008290300370300200320032903b0013703f004412010222204450d312004200329038803370000200441186a20034188036a41186a290300370000200441106a20034188036a41106a290300370000200441086a20034188036a41086a290300370000200341f0046a412020044120100320041020410021040c040b200341b0016a41186a22054200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b00141b791c100411d200341b0016a1000200341f0046a41186a2005290300370300200341f0046a41106a2008290300370300200341f0046a41086a200a290300370300200320032903b0013703f004200441ff01714101470d08412010222205450d3a200520032903c803370000200541186a200341c8036a41186a290300370000200541106a200341c8036a41106a290300370000200541086a200341c8036a41086a290300370000200341f0046a412020054120100320051020410021054100210b20020d3d0c090b2004210f0c0c0b200941c2006a41003a000041c30021080b200341f0046a41202009200810032009102020041020200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b00141b791c100411d200341b0016a1000200341f0046a41186a2004290300370300200341f0046a41106a2009290300370300200341f0046a41086a22092008290300370300200320032903b0013703f004412010222204450d292004200329038803370000200441186a20034188036a41186a290300370000200441106a20034188036a41106a290300370000200441086a20034188036a41086a290300370000200341f0046a412020044120100320041020200341c8036a41026a200341ec046a41026a2d00003a00002009200341d0046a41086a290300370300200341f0046a410d6a200341d0046a410d6a290000370000200320032f01ec043b01c803200320032903d0043703f004410121040b410021080b200341bd026a20043a0000200341c5026a200b360000200341c1026a200a36000020034198026a410d6a200341c0006a41086a290300370000200341ad026a200341c0006a41106a290300370000200341b5026a200341c0006a41186a290300370000200341be026a20032f01c8033b0100200341c0026a200341ca036a2d00003a0000200341c9026a20032903f004370000200341d1026a200341f0046a41086a290300370000200341d6026a200341f0046a410d6a290000370000200320083a009c022003200329034037009d022003200341e0006a36029802200341b0016a41186a22044200370300200341b0016a41106a22094200370300200341b0016a41086a22084200370300200342003703b00120024135200341b0016a1000200341e8036a41186a2004290300370300200341e8036a41106a2009290300370300200341e8036a41086a2008290300370300200320032903b0013703e803200341003602b801200342013703b001412010222204450d1520042003290360370000200441086a200341e0006a41086a290300370000200441106a200341e0006a41106a290300370000200441186a200341e0006a41186a290300370000200342a080808080043702b401200320043602b0012004412041c00010212204450d162004200341e0006a41206a2d00003a0020200342c080808090043702b401200320043602b00120034198026a410472200341b0016a10b70220032802b4012104200341e8036a412020032802b0012209200341b0016a41086a280200100302402004450d00200910200b20021020200342e4cab5fbb6ccdcb0e3003703880120034188016a200341f8016a427f10ed0120034198026a41086a41073a0000200341a1026a20032903f801370000200341a9026a200341f8016a41086a290300370000200341b1026a200341f8016a41106a290300370000200341b9026a200341f8016a41186a290300370000200341c1026a2003290320370000200341c9026a200341206a41086a290300370000200341d1026a200341206a41106a290300370000200341d9026a200341206a41186a290300370000200341053a00980220034198026a103d410021020b410121094101210820012d000022044101460d3e0c3f0b410821084100210a0b20034198026a200410b602200341c0006a41186a220b200341e8036a41186a290300370300200341c0006a41106a220d200341e8036a41106a290300370300200341c0006a41086a220e200341e8036a41086a290300370300200320032903e803370340200a2002470d33200241016a22052002490d172002410174220a20052005200a491b220aad4288017e220c422088a70d17200ca722054100480d172002450d02200820024188016c200510212208450d030c330b200341f0046a41201009410021054100210b20020d340b41002104200b20054572450d340c350b2005102222080d300b200541081023000b20051022220a450d2c0b200a20024105746a22052003290340370000200541186a2009290300370000200541106a200d290300370000200541086a200e2903003700004101210920034198026a41186a200241016a360200200341ac026a200f360200200320063703a00220032007370398022003200b3602b4022003200a3602a802200820034198026a10b902410021020c350b200341ac026a4101360200200341033602ec03200341eca1c4003602e8032003420137029c02200341f4a1c400360298022003200341e8036a3602a80220034198026a41e8bfc1001048000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411541011023000b413541011023000b410f41011023000b412f41011023000b411541011023000b413541011023000b410f41011023000b412f41011023000b412041011023000b41c00041011023000b419a88c00041331039000b411741011023000b412e41011023000b1024000b411541011023000b413541011023000b419a88c00041331039000b410f41011023000b412f41011023000b412041011023000b411541011023000b413541011023000b41b3a0c400419f011039000b412041011023000b41c00041011023000b41800141011023000b412041011023000b412041011023000b410f41011023000b412f41011023000b412041011023000b419a88c00041331039000b411541011023000b413541011023000b411541011023000b413541011023000b4189eec30041d3001039000b412041011023000b41c00041011023000b200541011023000b412041011023000b200820024188016c220f6a20034198026a41e00010840422052009360260200541fc006a200b290300370200200541f4006a200d290300370200200541ec006a200e290300370200200520032903403702642003200241016a22023602682003200a3602642003200836026020034198026a41086a22054200370300200342003703980241a490c100411520034198026a1002200341b0016a41086a200529030037030020032003290398023703b0012003411036029c022003200341b0016a36029802200341e0006a20034198026a10e40102402002450d00200f4188016a2105200821020340200210920120024188016a2102200541f87e6a22050d000b0b0240200a450d00200810200b200341b0026a2006370300200341a8026a2007370300200341a4026a200936020041002108200341a0026a41003a0000200341053a00980220034198026a103d200410920120041020410121090b4100210220012d000022044101470d080c070b200341b0016a41186a22044200370300200341b0016a41106a22084200370300200341b0016a41086a220a4200370300200342003703b00120024135200341b0016a1000200341f0046a41186a220d2004290300370300200341f0046a41106a220e2008290300370300200341f0046a41086a220f200a290300370300200320032903b0013703f00420034198026a200341f0046a105920032d00b9024102460d0b200341e8036a20034198026a41e3001084041a2003418a046a200329036037010020034192046a200341e0006a41086a2903003701002003419a046a200341e0006a41106a290300370100200341a2046a200341e0006a41186a290300370100200320093a0089042004420037030020084200370300200a4200370300200342003703b00120024135200341b0016a1000200d2004290300370300200e2008290300370300200f200a290300370300200320032903b0013703f004200341003602a0022003420137039802412010222204450d0c200420032903e803370000200441086a200341e8036a41086a290300370000200441106a200341e8036a41106a290300370000200441186a200341e8036a41186a290300370000200342a0808080800437029c0220032004360298022004412041c00010212204450d0d2004200341e8036a41206a2d00003a0020200342c0808080900437029c02200320043602980220034189046a20034198026a10b702200328029c022104200341f0046a4120200328029802220920034198026a41086a280200100302402004450d00200910200b2002102041012104200b200545720d010b200510200b02402002452004720d00200210200b2006210c0b4200210620034198026a41086a22024200370300200342003703980241cc90c100411520034198026a1002200341b0016a41086a200229030037030020032003290398023703b001420021070240200341b0016a411041c8d7c400410041001001417f460d002003420037039802200341b0016a411020034198026a41084100100141016a41084d0d0720032903980221070b20034198026a41086a22024200370300200342003703980241cdc8c000410d20034198026a1002200341b0016a41086a200229030037030020032003290398023703b0010240200341b0016a411041c8d7c400410041001001417f460d002003420037039802200341b0016a411020034198026a41084100100141016a41084d0d0820032903980221060b200342e4cab5fbb6ccdcb0e300370340200341c0006a200341f8016a427f427f200c20077e20067c410210b302200241083a0000200341a1026a20032903f801370000200341a9026a200341f8016a41086a290300370000200341b1026a20034188026a290300370000200341b9026a20034190026a290300370000200341053a00980220034198026a103d0b410021020b410121090b4101210820012d000022044101470d010b2008450d01200141046a2201280200109201200128020010200c010b20044105470d002009450d00200141046a2201280200109201200128020010200b200020053602042000200236020020034190056a24000f0b419a88c00041331039000b419a88c00041331039000b4189eec30041d3001039000b412041011023000b41c00041011023000b91e70109037f027e067f047e017f027e047f017e117f23004180056b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410e4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0f00090607030a0c080f050d02040b01000b200141306a2903002106200141286a290300210720012d00012108200341a8026a41026a200141076a2d00003a0000200341c8006a41086a200141186a290200370300200341c8006a410d6a2001411d6a2900003700002003200141056a2f00003b01a8022003200141106a290200370348200141046a2d00002109200141086a280200210a2001410c6a280200210b20022d0001210c20022d00002105200341c8036a41186a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d1c410121040c1d0b200141086a2802002109200141046a280200210820022d000120022d000072450d0e4100210a2009450d0c2008102020012d000021040c0c0b4101210a20022d000120022d0000720d0b200141046a2802002102200341e8036a41086a22054200370300200342003703e803418f9bc4004116200341e8036a100220034190016a41086a2005290300370300200320032903e80337039001200320023602e80320034190016a4110200341e8036a410410030c8a010b200141106a2903002106200141086a2903002107200141186a280200210d20022d0001210a20022d00002105200341c8036a41186a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d0d410121040c0e0b4101210a20022d000120022d0000720d0920012d00012104200341e8036a41086a22054200370300200342003703e80341f4edc3004115200341e8036a100220034190016a41086a220a2005290300370300200320032903e803370390014100210220034190016a411041c8d7c40041001003200320043a00d80120054200370300200342003703e80341a3a8c2004119200341e8036a1002200a2005290300370300200320032903e803370390014101210a20034190016a4110200341d8016a410110034101210c20012d00002204410f4d0da3010ca4010b4101210a20022d000120022d0000720d08200141086a2903002106200341e8036a41086a22024200370300200342003703e80341f59ac400411a200341e8036a100220034190016a41086a2002290300370300200320032903e80337039001200320063703e80320034190016a4110200341e8036a410810030c87010b200141106a2903002106200141086a290300210e20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d0d410121040c0e0b20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d0f410121040c100b20012d0001210d20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d11410121040c120b200141106a2903002106200141086a290300210720022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d16410121040c170b2001410c6a280200210a200141086a280200210b200141046a280200210d20022d0001210c20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d18410121040c190b4101210a20022d000120022d0000720d02200141046a2802002102200341e8036a41086a22054200370300200342003703e803418cedc3004119200341e8036a100220034190016a41086a2005290300370300200320032903e80337039001200320023602e80320034190016a4110200341e8036a410410030c81010b20022d0001210a20022d00002105200341e0036a22042002411a6a290100370300200341d8036a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d19410121040c1a0b4101210a20022d000120022d000072450d1b0b41fcc5c000210241282105200441ff01712204410f4b0d23410120047441beff01710d9b0120044106460d242004410f470d23200a450d9b01200141086a280200450d9b01200141046a28020010200c9b010b200341246a41026a200141076a2d00003a0000200341286a41086a200141186a290200370300200341286a410d6a2001411d6a2900003700002003200141056a2f00003b01242003200141106a290200370328200141046a2d00002109200141086a280200210d2001410c6a280200210b20022d0001210a20022d00002105200341c8036a41186a22042002411a6a290100370300200341c8036a41106a200241126a290100370300200341c8036a41086a2002410a6a2901003703002003200241026a2901003703c8032005450d1a410121040c1b0b2001410c6a2802002102200341e8036a41086a22054200370300200342003703e80341e5ecc3004115200341e8036a100220034190016a41086a2005290300370300200320032903e80337039001200341003602f003200342013703e803200320023602d801200341d8016a200341e8036a103e2002450d262002410574210c200341e8036a41086a280200210520032802e803210d20032802ec03210a2008210203400240024002400240200a20056b41204f0d00200541206a22042005490d9401200a410174220b20042004200b491b220b4100480d9401200a450d01200d200a200b1021220d0d020c490b200541206a21040c020b200b1022220d450d470b200b210a0b200d20056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102200c41606a220c0d000b200341f0036a20043602002003200a3602ec032003200d3602e8030c270b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d8401200341bb036a200c290300370000200341a8036a41186a200341e5046a290000370000200320032f01443b01a803200320053600af03200320023600ab03200320032903d8043700b3032003200a2d00003a00aa03200341e8036a200341a8036a10b1012003280288042202450d1b200341d8046a41086a2204200341e8036a41346a290200370300200341d8046a41106a220a200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a2902003703002003200341e8036a412c6a2902003703d804200341b4046a280200210b200341e8036a41286a2802002109200341e8036a410c6a350200210f200341e8036a41186a290300210e20032802e803210820032902ec03211020032903f8032111200328028c04210520034190016a41186a2212200c29030037030020034190016a41106a220c200a29030037030020034190016a41086a220a2004290300370300200320032903d80437039001200341d8016a41186a200e370300200341d8016a410c6a200f3e0200200341d8016a41286a2009360200200341fc016a2005360200200341d8016a41346a200a290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a2012290300370200200320113703e801200320103702dc01200320023602f801200320083602d8012003200b3602a402200320032903900137028402200d410a4d0d2202402005450d00200210200b4198a0c4002102411b21050c84010b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d8101200341db006a200c290300370000200341c8006a41186a200341e5046a290000370000200320032f01443b01482003200536004f2003200236004b200320032903d8043700532003200a2d00003a004a200341e8036a200341c8006a10b1012003280288042204450d18200341d8046a41086a220a200341e8036a41346a290200370300200341d8046a41106a2205200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a290200370300200320034194046a2902003703d804200341b4046a280200210d200341e8036a41286a280200210b200341e8036a410c6a3502002110200341e8036a41186a290300210720032802e803210920032902ec03211120032903f803210f200328028c04210220034190016a41186a2208200c29030037030020034190016a41106a220c200529030037030020034190016a41086a2205200a290300370300200320032903d80437039001200341d8016a41186a2007370300200341d8016a410c6a20103e0200200341d8016a41286a200b360200200341fc016a2002360200200341d8016a41346a2005290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a20082903003702002003200f3703e801200320113702dc01200320043602f801200320093602d8012003200d3602a402200320032903900137028402200f200e200f200e54200720065420072006511b22041b220e2007200620041b220684500d6b200341d8016a41106a200f200e7d370300200341f0016a200720067d200f200e54ad7d370300200341e8036a41086a22024200370300200342003703e80341a5eec000411b200341e8036a100220052002290300370300200320032903e80337039001024020034190016a411041c8d7c400410041001001417f460d00200342003703f003200342003703e80320034190016a4110200341e8036a4110410010012202417f460d472002410f4d0d47200341e8016a2202290300220f20032903e8035a200341f0016a22052903002207200341f0036a29030022105a20072010511b0d002005420037030020024200370300200720067c200f200e7c220e200f54ad7c21060b200341e8036a41086a22024200370300200342003703e80341e39ac4004112200341e8036a100220034190016a41086a22052002290300370300200320032903e8033703900142002107024020034190016a411041c8d7c400410041001001417f460d00200342003703e80320034190016a4110200341e8036a41084100100141016a41084d0d4120032903e80321070b20024200370300200342003703e8034181a0c4004117200341e8036a100220052002290300370300200320032903e8033703900120034190016a411041c8d7c400410041001001417f460d29200342003703e80320034190016a4110200341e8036a41084100100141016a41084d0d4120032903e803210f0c2a0b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf03210520034190016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b019001200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341c4006a41026a220a20034190016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f0190013b0144200320032903e8033703d80420040d7e200341eb016a200c290300370000200341d8016a41186a200341e5046a290000370000200320032f01443b01d801200320053600df01200320023600db01200320032903d8043700e3012003200a2d00003a00da01200341e8036a200341d8016a10b101200328028804220c450d15200341d8046a41086a22022003419c046a290200370300200341d8046a41106a2205200341a4046a290200370300200341d8046a41186a2204200341ac046a290200370300200320034194046a2902003703d804200341e8036a41186a290300211320034190046a280200210d200341f4036a350200210620032903f8032114200328028c04210920033502e803210f20032902ec03210720034188036a41186a200429030037030020034188036a41106a200529030037030020034188036a41086a2002290300370300200320032903d8043703880342002110200341e8036a41086a22024200370300200342003703e80341e39ac4004112200341e8036a100220034190016a41086a2002290300370300200320032903e80337039001024020034190016a411041c8d7c400410041001001417f460d00200342003703e80320034190016a4110200341e8036a41084100100141016a41084d0d3d20032903e80321100b200642208620074220888421062007422086200f8421070240200d41186c2202450d00200c20026a210a200241686a2105200c21020340200241086a290300210e2002290300210f2010200241106a2903002211540d2342002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22041b21064200200f20041b2107200541686a2105200241186a2202200a470d000b0b410821044100210d2009450d23200c10204100210b0c2d0b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d7b200341a3016a200c29030037000020034190016a41186a200341d8046a410d6a290000370000200320032f01443b01900120032005360097012003200236009301200320032903d80437009b012003200a2d00003a009201200341e8036a20034190016a10b1012003280288042205450d12200341d8046a41086a22022003419c046a290200370300200341d8046a41106a2204200341a4046a290200370300200341d8046a41186a220a200341ac046a290200370300200320034194046a2902003703d804200328028c04210c200341d8016a41186a200a290300370300200341d8016a41106a2004290300370300200341d8016a41086a2002290300370300200320032903d8043703d801410d10222202450d3e200241056a41002900fe9d44370000200241002900f99d443700002002410d412d10212202450d3f200220032903d80137000d200241256a200341d8016a41186a2903003700002002411d6a200341d8016a41106a290300370000200241156a200341d8016a41086a290300370000200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220b4200370300200342003703d8042002412d200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200b290300370300200320032903d8043703c803200341203602ec032003200341c8036a3602e803200d200341e8036a10ac0320021020200c450d70200510200c700b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200c41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200341c8026a410d6a290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341e8026a41026a220c200341d8016a41026a2d00003a000020034188036a41086a220d200341e8036a41086a29030037030020034188036a41106a200341e8036a41106a290300370300200320032f01d8013b01e802200320032903e8033703880320040d78200341a3016a200d290300370000200341a8016a20034195036a290000370000200320032f01e8023b01900120032005360097012003200236009301200320032903880337009b012003200c2d00003a009201410e10222202450d39200241066a41002900a3cf433700002002410029009dcf433700002002410e412e10212202450d3a200220032903900137000e200241266a20034190016a41186a2903003700002002411e6a20034190016a41106a290300370000200241166a20034190016a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220c4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a2204200c290300370300200320032903d8043703c803200341c8036a412041c8d7c4004100410010012105200210202005417f460d1541d29fc4002102411421050c780b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf03210520034190016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b019001200320032903c8023703e803410021040c010b41a4c6c0002102412a21050b200341c8006a41026a220a20034190016a41026a2d00003a0000200341d8016a41086a220c200341e8036a41086a290300370300200341d8016a41106a200341e8036a41106a290300370300200320032f0190013b0148200320032903e8033703d80120040d75200341bb036a200c290300370000200341c0036a200341d8016a410d6a290000370000200320032f01483b01a803200320053600af03200320023600ab03200320032903d8013700b3032003200a2d00003a00aa03200341e8036a200341a8036a10f8024101210420032d00e8034101470d0a200341c6006a20032d00eb033a0000200341d8046a41086a200341fc036a290200370300200341d8046a410d6a20034181046a290000370000200320032f00e9033b01442003200341f4036a2902003703d804200341e8036a41086a28020021054100210420032802ec0321020c0b0b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a22092004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200c41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a2009290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220c200341d8016a41026a2d00003a0000200341d8046a41086a2209200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d7f200341db006a2009290300370000200341c8006a41186a200341e5046a290000370000200320032f01443b01482003200536004f2003200236004b200320032903d8043700532003200c2d00003a004a200341e8036a200341c8006a10b1012003280288042209450d0e200341d8046a41086a2202200341e8036a41346a290200370300200341d8046a41106a2205200341e8036a413c6a290200370300200341d8046a41186a2204200341e8036a41c4006a2902003703002003200341e8036a412c6a2902003703d804200341b4046a280200210c200341e8036a41286a2802002108200341e8036a410c6a3502002106200341e8036a41186a290300210720032802e803211520032902ec03210f20032903f803210e200328028c04211220034190016a41186a2216200429030037030020034190016a41106a2204200529030037030020034190016a41086a22052002290300370300200320032903d80437039001200341d8016a41186a2007370300200341d8016a410c6a20063e0200200341d8016a41286a2008360200200341d8016a41246a2012360200200341d8016a41346a2005290300370200200341d8016a413c6a2004290300370200200341d8016a41c4006a20162903003702002003200e3703e8012003200f3702dc01200320093602f801200320153602d8012003200c3602a402200320032903900137028402200a450d14200d200a41246c22026a21172002450d1820034188036a41026a2202200d41036a2d00003a0000200341e8036a41086a220c200d41146a290000370300200341e8036a410d6a2208200d41196a2900003700002003200d2f00013b0188032003200d29000c3703e803200d41246a2104200d2d000022154102460d19200d2800082118200d2800042105200341c8046a41026a20022d00003a0000200341c8036a41086a200c290300370300200341c8036a410d6a2008290000370000200320032f0188033b01c804200320032903e8033703c80320154101470d24200341d8046a2005410676103720032802d804210c20032802e0042005413f7122024d0d26200341fc046a41026a200c20024105746a220241026a2d00003a0000200228000321052002280007211820022f00002108200341b5036a200241186a290000370000200341b0036a200241136a290000370300200320083b01fc042003200229000b3703a8034101210220032802dc04450d740c730b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a220c2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf032105200341d8016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200c290000370000200320032f01c8043b01d801200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c4006a41026a220a200341d8016a41026a2d00003a0000200341d8046a41086a220c200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80420040d6f200341db006a200c290300370000200341c8006a41186a200341e5046a290000370000200320032f01443b01482003200536004f2003200236004b200320032903d8043700532003200a2d00003a004a200341e8036a200341c8006a10b1012003280288042202450d06200341d8046a41086a2204200341e8036a41346a290200370300200341d8046a41106a220a200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a2902003703002003200341e8036a412c6a2902003703d804200341b4046a280200210d200341e8036a41286a280200210b200341e8036a410c6a3502002106200341e8036a41186a290300210720032802e803210920032902ec03210f20032903f803210e200328028c04210520034190016a41186a2208200c29030037030020034190016a41106a220c200a29030037030020034190016a41086a220a2004290300370300200320032903d80437039001200341d8016a41186a2007370300200341d8016a410c6a20063e0200200341d8016a41286a200b360200200341fc016a2005360200200341d8016a41346a200a290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a20082903003702002003200e3703e8012003200f3702dc01200320023602f801200320093602d8012003200d3602a402200320032903900137028402200341d8016a412c6a220410b401200410a4022005450d64200210200c640b200141086a2903002106200341e8036a41086a22024200370300200342003703e8034181a0c4004117200341e8036a100220034190016a41086a2002290300370300200320032903e80337039001200320063703e80320034190016a4110200341e8036a410810030c630b200341c8046a41026a20032d00ca033a0000200341c8026a41086a200341db036a290000370300200341c8026a410d6a2004290000370000200320032f01c8033b01c804200320032900d3033703c80241012104200a41ff01714101470d0020032800cb03210220032800cf03210520034190016a41026a200341c8046a41026a2d00003a0000200341e8036a41086a200341c8026a41086a290300370300200341e8036a410d6a200341c8026a410d6a290000370000200320032f01c8043b019001200320032903c8023703e803410021040c010b412a210541a4c6c00021020b200341c8006a41026a220a20034190016a41026a2d00003a0000200341d8016a41086a220c200341e8036a41086a290300370300200341d8016a41106a200341e8036a41106a290300370300200320032f0190013b0148200320032903e8033703d80120040d6b200341bb026a200c290300370000200341c0026a200341d8016a410d6a290000370000200320032f01483b01a802200320053600af02200320023600ab02200320032903d8013700b3022003200a2d00003a00aa02200341e8036a200341a8026a10f8024101210420032d00e8034101470d03200341ea026a20032d00eb033a000020034188036a41086a200341fc036a29020037030020034188036a410d6a20034181046a290000370000200320032f00e9033b01e8022003200341f4036a29020037038803200341e8036a41086a28020021054100210420032802ec0321020c040b410b210541e69fc40021020b200341e8026a41026a220a200341c4006a41026a2d00003a000020034188036a41086a220c200341d8046a41086a29030037030020034188036a41106a200341d8046a41106a290300370300200320032f01443b01e802200320032903d8043703880320040d69200341db006a200c290300370000200341c8006a41186a20034195036a290000370000200320032f01e8023b01482003200536004f2003200236004b20032003290388033700532003200a2d00003a004a200341e8036a200341c8006a10b1012003280288042205450d00200341d8046a41086a2204200341e8036a41346a290200370300200341d8046a41106a220a200341e8036a413c6a290200370300200341d8046a41186a220c200341e8036a41c4006a290200370300200320034194046a2902003703d804200341b4046a280200210d200341e8036a41286a280200210b200341e8036a410c6a350200210f200341e8036a41186a290300211020032802e803210920032902ec03210e20032903f8032111200328028c04210220034190016a41186a2208200c29030037030020034190016a41106a220c200a29030037030020034190016a41086a220a2004290300370300200320032903d80437039001200341d8016a41186a2010370300200341d8016a410c6a200f3e0200200341d8016a41286a200b360200200341fc016a22042002360200200341d8016a41346a200a290300370200200341d8016a413c6a200c290300370200200341d8016a41c4006a2008290300370200200320113703e8012003200e3702dc01200320053602f801200320093602d8012003200d3602a402200320032903900137028402200341106a200341a8036a10c40102402003290310220f20032903d80122137d2214200f56200341106a41086a290300220e200341d8016a41086a29030022197d200f201354ad7d220f200e56200f200e511b0d00200341d8016a41106a200720142014200756200f200656200f2006511b22021b220720117c220e370300200341f0016a2006200f20021b220620107c200e200754ad7c3703002003200720137c220f3703d8012003200620197c200f200754ad7c3703e001200341c8006a200341d8016a10bc03200428020021020b2002450d5e200341f8016a28020010200c5e0b41f19fc4002102411021050c680b410b210541e69fc40021020b200341c8006a41026a220a200341e8026a41026a2d00003a0000200341d8016a41086a220c20034188036a41086a290300370300200341d8016a41106a20034188036a41106a290300370300200320032f01e8023b014820032003290388033703d80120040d66200341db026a200c290300370000200341e0026a200341d8016a410d6a290000370000200320032f01483b01c802200320053600cf02200320023600cb02200320032903d8013700d3022003200a2d00003a00ca02200341c8046a41026a200341246a41026a2d00003a0000200341c8036a41086a200341286a41086a290300370300200341c8036a410d6a2202200341286a410d6a290000370000200320032f01243b01c804200320032903283703c803200941ff01714101470d07200341e8036a200d410676103720032802e803210520032802f003200d413f7122024d0d10200341fc046a41026a200520024105746a220241026a2d00003a00002002280003210d2002280007210b20022f00002104200341b5036a200241186a290000370000200341b0036a200241136a290000370300200320043b01fc042003200229000b3703a8034101210220032802ec03450d560c550b200141086a280200450d77200141046a28020010200c770b200141086a280200450d76200141046a28020010200c760b4110210541f19fc40021024100210c4101210a200b0d710c720b200341c8046a41026a2202200341a8026a41026a2d00003a00002004200341c8006a41086a290300370300200341c8036a410d6a2205200341c8006a410d6a290000370000200320032f01a8023b01c804200320032903483703c803200941ff01714101470d06200341e8036a200a410676103720032802e803210520032802f003200a413f7122024d0d0e200341fc046a41026a200520024105746a220241026a2d00003a00002002280003210a2002280007210b20022f00002104200341b5036a200241186a290000370000200341b0036a200241136a290000370300200320043b01fc042003200229000b3703a8034101210220032802ec03450d4e0c4d0b200341d8016a412c6a220510a402200320063703f002200320073703e8022003200d3602f802411210222202450d27200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d28200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d80420024132200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c803200341c8036a412041c8d7c400410041001001417f460d0c20034220370294012003200341c8036a36029001200341e8036a20034190016a10820320032d008004220a4102460d2b200341a0036a20034199046a29000037030020034198036a20034191046a29000037030020034188036a41086a20034189046a290000370300200341c4006a41026a200341a4046a2d00003a0000200341286a41086a200341b5046a290000370300200341356a200341ba046a2900003700002003200329008104370388032003200341a2046a2f01003b01442003200341ad046a290000370328200341a1046a2d0000210d200341a5046a280000210b200341a9046a28000021090c420b200341f0036a280200210420032802ec03210a20032802e803210d0b20034190016a4110200d200410030240200a450d00200d10200b4101210c02402009450d00200810200b4100210a0c660b200341fc046a41026a200341c8046a41026a2d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a2002290000370000200320032f01c8043b01fc04200320032903c8033703a8030c4f0b41d2a1c400210241172105410121042012450d690c680b411810222204450d252004200f370300200420113703102004200e3703082005450d09200241186a2105200c200d41186c6a41686a21124101210d4101210b03402005210202400340200241086a290300210e2002290300210f2010200241106a2903002211540d0142002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22051b21064200200f20051b2107200241186a2202200a470d000c0d0b0b0240200b200d470d00200d41016a2205200d490d66200d410174220b20052005200b491b220bad42187e2219422088a70d662019a722054100480d660240200d450d002004200d41186c2005102122040d010c270b200510222204450d260b200241186a21052004200d41186c6a2208200e3703082008200f37030020082011370310200d41016a210d20122002470d000c0b0b0b200341fc046a41026a20022d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a2005290000370000200320032f01c8043b01fc04200320032903c8033703a8030c480b4100210b0c090b201721040b4100210c4101210241002115410021054100450d5c0c5d0b420c210f0b024020034180026a2802002202200341fc016a280200470d00200241016a22052002490d5f20024101742204200520052004491b2204ad42187e2210422088a70d5f2010a7220a4100480d5f2002450d07200341f8016a280200200241186c200a10212205450d080c3f0b200341f8016a28020021050c3f0b4100210220032802ec030d440c450b20044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d80441dceec300411a200341d8046a1000200341e8036a41186a2004290300370300200341e8036a41106a200a290300370300200341e8036a41086a200c290300370300200320032903d8043703e803200341e8036a412041c8d7c400410041001001417f460d07200341e0036a4200370300200341c8036a41106a4200370300200341c8036a41086a4200370300200342003703c803200341e8036a4120200341c8036a4120410010012204417f460d1f2004411f4d0d1f200341c8046a41026a220420032d00ca033a0000200341c8026a41086a220a200341db036a290000370300200341c8026a410d6a220c200341e0036a290000370000200320032f01c8033b01c804200320032900d3033703c80220032800cb03210b20032800cf032109200341fc046a41026a220d20042d00003a0000200341a8026a41086a2208200a290300370300200341a8026a410d6a2212200c290000370000200320032f01c8043b01fc04200320032903c8023703a8022004200d2d00003a0000200a2008290300370300200c2012290000370000200320032f01fc043b01c804200320032903a8023703c802411210222204450d20200441106a41002f00cdcf433b0000200441086a41002900c5cf43370000200441002900bdcf4337000020044112413210212204450d21200420032f01c8043b0012200420093600192004200b360015200420032903c80237001d200441146a200341c8046a41026a2d00003a0000200441256a200341c8026a41086a2903003700002004412a6a200341d5026a290000370000200341d8046a41186a220a4200370300200341d8046a41106a220c4200370300200341d8046a41086a220d4200370300200342003703d80420044132200341d8046a1000200341c8036a41186a200a290300370300200341c8036a41106a200c290300370300200341c8036a41086a200d290300370300200320032903d8043703c803200341c8036a412041c8d7c400410041001001417f460d222003422037024c2003200341c8036a360248200341e8036a200341c8006a10820320032d008004220a4102460d23200341e8036a41086a290300210620032802f803210c20032903e803210720034190016a20034181046a41c7001084041a200341c8006a20034190016a41c1001084041a2003200a3a00e803200341e8036a410172200341c8006a41c1001084041a200341ac016a2003418a046a410020032d0089044101461b36020020032006370398012003200737039001200320053602a8012003200c3602a001200341d8046a41186a220a4200370300200341d8046a41106a220c4200370300200341d8046a41086a220d4200370300200342003703d80420044132200341d8046a1000200341c8036a41186a200a290300370300200341c8036a41106a200c290300370300200341c8036a41086a200d290300370300200320032903d8043703c803200341003602502003420137034820034190016a41106a200341c8006a103e200320034190016a3602d804200341d8046a200341c8006a109801200328024c210a2003280250210c20032802a8012212450d09200a200c470d0a200c41016a220a200c490d5c200c410174220d200a200a200d491b220a4100480d5c200c450d0c2003280248200c200a1021220d450d0d0c270b4100210220032802ec030d3e0c3f0b4101210d4101210b0b2009450d00200c10200b200341e8036a41186a201337030020034190046a200d3602002003418c046a2202200b360200200341ac046a20034188036a41186a290300370200200341a4046a20034198036a2903003702002003419c046a20034190036a290300370200200320143703f803200320073703e8032003200329038803370294042003200436028804200320063703f003200341d8016a200341e8036a10bc032002280200450d4520034188046a28020010200c450b200a102222050d370b200a41081023000b200341fc046a41026a200341c8046a41026a2d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a200341c8036a410d6a290000370000200320032f01c8043b01fc04200320032903c8033703a8030c500b200341d8046a41186a22044200370300200a4200370300200c4200370300200342003703d80441dceec300411a200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c803412010222204450d1c20042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c8036a4120200441201003200410204100210d0c2c0b4100210220032802dc040d4c0c4d0b200a200c470d01200c41016a220a200c490d52200c410174220d200a200a200d491b220a4100480d52200c450d042003280248200c200a1021220d450d050c1b0b2003280248210d0c1d0b2003280248210d0c1a0b200a1022220d0d1a0b200a41011023000b200a1022220d0d160b200a41011023000b200341fc036a4101360200200341033602dc01200341eca1c4003602d801200342013702ec03200341f4a1c4003602e8032003200341d8016a3602f803200341e8036a41fca1c4001048000b200b41011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410e41011023000b412e41011023000b410d41011023000b412d41011023000b419a88c00041331039000b411241011023000b413241011023000b200541081023000b411841081023000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b41b3a0c400419f011039000b419a88c00041331039000b412041011023000b2003200a36024c2003200d3602480b200341d0006a200c41016a2208360200200d200c6a41003a0000200341ac016a280200220c0d020c030b2003200a36024c2003200d3602480b200341c8006a41086a2215200c41016a360200200d200c6a41013a000002400240024002400240200328024c22082015280200220c6b411f4b0d00200c41206a220a200c490d3820084101742216200a200a2016491b220a4100480d382008450d01200d2008200a1021220d450d020c030b2008210a0c030b200a1022220d0d010b200a41011023000b2003200a36024c2003200d3602480b2015200c41206a2208360200200d200c6a220c41086a201241086a290000370000200c41106a201241106a290000370000200c41186a201241186a290000370000200c2012290000370000200341ac016a280200220c450d010b200a2008470d08200a41016a2212200a490d32200a4101742215201220122015491b22124100480d32200a450d01200d200a20121021220d450d020c070b200a2008470d05200a41016a220c200a490d31200a4101742212200c200c2012491b220c4100480d31200a450d02200d200a200c1021220d450d030c040b20121022220d0d050b201241011023000b200c1022220d0d010b200c41011023000b2003200c36024c2003200d3602480b200341d0006a220a200841016a360200200d20086a41003a0000200a2802002112200328024c210d2003280248210a0c020b2003201236024c2003200d3602480b200341d0006a220a200841016a360200200d20086a41013a000002400240024002400240200328024c220d200a28020022086b41204f0d00200841206a220a2008490d2e200d4101742212200a200a2012491b22124100480d2e200d450d012003280248200d20121021220a450d020c030b2003280248210a0c030b20121022220a0d010b201241011023000b2003201236024c2003200a3602482012210d0b200341c8006a41086a200841206a2212360200200a20086a220841086a200c41086a290000370000200841106a200c41106a290000370000200841186a200c41186a2900003700002008200c2900003700000b200341c8036a4120200a201210030240200d450d00200a10200b20041020200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d80441dceec300411a200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c803412010222204450d0220042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c8036a412020044120100320041020200341c4006a41026a200341c8046a41026a2d00003a0000200341286a41086a200341c8026a41086a290300370300200341286a410d6a200341c8026a410d6a290000370000200320032f01c8043b0144200320032903c8023703284101210d0b4100210a0b200341e8036a41186a20034188036a41186a290300370300200341e8036a41106a20034188036a41106a290300370300200341e8036a41086a20034188036a41086a290300370300200341c8026a41026a200341c4006a41026a2d00003a000020034190016a41086a200341286a41086a29030037030020034190016a410d6a200341286a410d6a29000037000020032003290388033703e803200320032f01443b01c8022003200329032837039001200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220c4200370300200342003703d80420024132200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200c290300370300200320032903d8043703c8032003410036025020034201370348200341e8026a41106a200341c8006a103e2003200341e8026a3602d804200341d8046a200341c8006a109801200328024c2105200328025021040240024002400240024002400240200a4101470d0020052004470d01200441016a22052004490d2d2004410174220a20052005200a491b22054100480d2d2004450d032003280248200420051021220a450d040c0a0b20052004470d01200441016a22052004490d2c2004410174220a20052005200a491b22054100480d2c2004450d042003280248200420051021220a450d050c070b2003280248210a0c090b2003280248210a0c060b20051022220a0d060b200541011023000b20051022220a0d020b200541011023000b412041011023000b2003200536024c2003200a3602480b200341d0006a200441016a220c360200200a20046a41003a00000c020b2003200536024c2003200a3602480b200341c8006a41086a2208200441016a360200200a20046a41013a000002400240024002400240200328024c220c200828020022046b411f4b0d00200441206a22052004490d26200c4101742212200520052012491b22054100480d26200c450d01200a200c20051021220a450d020c030b200c21050c030b20051022220a0d010b200541011023000b2003200536024c2003200a3602480b2008200441206a220c360200200a20046a220441086a200341e8036a41086a290300370000200441106a200341e8036a41106a290300370000200441186a200341e8036a41186a290300370000200420032903e8033700000b0240024002400240024002400240024002400240200d41ff01714101470d002005200c470d08200541016a22042005490d2a2005410174220d20042004200d491b22044100480d2a2005450d01200a200520041021220a450d020c070b2005200c470d05200541016a22042005490d292005410174220d20042004200d491b22044100480d292005450d02200a200520041021220a450d030c040b20041022220a0d050b200441011023000b20041022220a0d010b200441011023000b2003200436024c2003200a3602480b200341d0006a2205200c41016a360200200a200c6a41003a00002005280200210c200328024c210a200328024821040c020b2003200436024c2003200a3602480b200341d0006a2205200c41016a360200200a200c6a41013a000002400240024002400240200328024c220a200528020022056b41204f0d00200541206a22042005490d26200a410174220c20042004200c491b220c4100480d26200a450d012003280248200a200c10212204450d020c030b200328024821040c030b200c102222040d010b200c41011023000b2003200c36024c20032004360248200c210a0b200341c8006a41086a200541206a220c360200200341c8026a41026a2d0000210d20032f01c8022108200420056a220520093600072005200b360003200541026a200d3a0000200520083b0000200541186a2003419d016a290000370000200541136a20034190016a41086a290300370000200520032903900137000b0b200341c8036a41202004200c10030240200a450d00200410200b20021020200341fc016a280200450d0d200341f8016a28020010200c0d0b200341fc016a2004360200200341f8016a200536020020034180026a28020021020b2005200241186c6a220220063703082002200e3703002002200f20077c37031020034180026a2202200228020041016a360200200341c8006a200341d8016a10bc03200341fc016a28020021020b2002450d0a200341f8016a28020010200c0a0b200510200b20020d00410121024195a9c000210a4115210b0c010b200341c8036a41026a200341fc046a41026a2d00003a0000200341e8036a41086a200341a8036a41086a290300370300200341e8036a410d6a200341a8036a410d6a290000370000200320032f01fc043b01c803200320032903a8033703e803410021020b200341c4006a41026a2205200341c8036a41026a2d00003a0000200341d8046a41086a2204200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01c8033b0144200320032903e8033703d80402402002450d00200b2105200a21020c120b200341eb016a2004290300370000200341f0016a200341e5046a290000370000200320032f01443b01d8012003200b3600df012003200a3600db01200320032903d8043700e301200320052d00003a00da010240024002400240024002400240410e10222202450d00200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d01200220032903d80137000e200241266a200341d8016a41186a220c2903003700002002411e6a200341d8016a41106a220d290300370000200241166a200341d8016a41086a220b290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803200341c8036a412041c8d7c4004100410010012105200210202005417f470d0b200341e8036a41186a200c290300370300200341e8036a41106a200d290300370300200341e8036a41086a200b290300370300200320032903d8013703e803410e10222202450d02200241066a41002900a3cf433700002002410029009dcf433700002002410e412e10212202450d03200220032903900137000e200241266a20034190016a41186a2903003700002002411e6a20034190016a41106a290300370000200241166a20034190016a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803412010222205450d04200520032903e803370000200541186a200341e8036a41186a290300370000200541106a200341e8036a41106a290300370000200541086a200341e8036a41086a290300370000200341c8036a41202005412010032005102020021020410d10222202450d05200241056a41002900fe9d44370000200241002900f99d443700002002410d412d10212202450d06200220032903900137000d200241256a20034190016a41186a22052903003700002002411d6a20034190016a41106a2204290300370000200241156a20034190016a41086a220a290300370000200341d8046a41186a220c4200370300200341d8046a41106a220d4200370300200341d8046a41086a220b4200370300200342003703d8042002412d200341d8046a1000200341c8036a41186a200c290300370300200341c8036a41106a200d290300370300200341c8036a41086a200b290300370300200320032903d8043703c803200341203602ec032003200341c8036a3602e8032008200341e8036a10ac0320021020200320034190016a10c401200341086a290300210f2003290300210e20034190046a4100360200200341e8036a41186a200f2006200e200754200f200654200f2006511b22021b2206370300200341ac046a2005290300370200200341a4046a20042903003702002003419c046a200a29030037020020034208370388042003200e200720021b22073703f803200320063703f003200320073703e803200320032903900137029404200341d8016a200341e8036a10bc032003418c046a280200450d0d200341e8036a41206a28020010200c0d0b410e41011023000b412e41011023000b410e41011023000b412e41011023000b412041011023000b410d41011023000b412d41011023000b200510200b20020d00410121024195a9c000210d4115210b0c010b200341d8016a41026a200341fc046a41026a2d00003a0000200341e8036a41086a200341a8036a41086a290300370300200341e8036a410d6a200341a8036a410d6a290000370000200320032f01fc043b01d801200320032903a8033703e803410021020b200341c4006a41026a2205200341d8016a41026a2d00003a0000200341d8046a41086a2204200341e8036a41086a290300370300200341d8046a41106a200341e8036a41106a290300370300200320032f01d8013b0144200320032903e8033703d80402402002450d004101210a4101210c200b2105200d210220012d00002204410f4d0d1e0c1f0b200341fb026a200429030037000020034180036a200341e5046a290000370000200320032f01443b01e8022003200b3600ef022003200d3600eb02200320032903d8043700f302200320052d00003a00ea02410e10222202450d03200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d04200220032903e80237000e200241266a200341e8026a41186a2903003700002002411e6a200341e8026a41106a290300370000200241166a200341e8026a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803200341c8036a412041c8d7c4004100410010012105200210202005417f470d00200341e8026a200341c8026a4120108604450d02410e10222202450d05200241066a41002900a3cf433700002002410029009dcf433700002002410e412e10212202450d06200220032903a80237000e200241266a200341a8026a41186a2903003700002002411e6a200341a8026a41106a290300370000200241166a200341a8026a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803412010222205450d07200520032903e802370000200541186a200341e8026a41186a290300370000200541106a200341e8026a41106a290300370000200541086a200341e8026a41086a290300370000200341c8036a41202005412010032005102020021020410e10222202450d0841002105200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d09200220032903c80237000e200241266a200341c8026a41186a2903003700002002411e6a200341c8026a41106a290300370000200241166a200341c8026a41086a290300370000200341d8046a41186a22044200370300200341d8046a41106a220a4200370300200341d8046a41086a220c4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2004290300370300200341c8036a41106a200a290300370300200341c8036a41086a200c290300370300200320032903d8043703c8030240200341c8036a412041c8d7c400410041001001417f460d00200342203702cc042003200341c8036a3602c804200341e8036a200341c8046a10b1032003280288042205450d0b200341d8046a41186a200341e8036a41186a290300370300200341d8046a41106a200341e8036a41106a290300370300200341d8046a41086a200341e8036a41086a290300370300200341d8016a41086a20034194046a290200370300200341d8016a41106a2003419c046a290200370300200341d8016a41186a200341a4046a290200370300200341d8016a41206a200341ac046a29020037030020034180026a200341b4046a280200360200200320032903e8033703d8042003200329028c043703d801200341c8036a412010090b200341a8036a41186a2004290300370300200341a8036a41106a200a290300370300200341a8036a41086a200c29030037030020034190016a41086a200341d8016a41086a29030037030020034190016a41106a200341d8016a41106a29030037030020034190016a41186a200341d8016a41186a29030037030020034190016a41206a200341d8016a41206a29030037030020034190016a41286a2204200341d8016a41286a280200360200200320032903d8043703a803200320032903d801370390012005450d0120034188036a41186a220a200341a8036a41186a29030037030020034188036a41106a220c200341a8036a41106a29030037030020034188036a41086a220d200341a8036a41086a290300370300200341c8006a41086a220b20034190016a41086a290300370300200341c8006a41106a220920034190016a41106a290300370300200341c8006a41186a220820034190016a41186a290300370300200341c8006a41206a221220034190016a41206a290300370300200341c8006a41286a22152004280200360200200320032903a80337038803200320032903900137034820021020200341e8036a41186a200a290300370300200341e8036a41106a200c290300370300200341e8036a41086a200d2903003703002003418c046a200329034837020020034194046a200b2903003702002003419c046a2009290300370200200341a4046a2008290300370200200341ac046a2012290300370200200341b4046a2015280200360200200320053602880420032003290388033703e803410e10222202450d0b200241066a41002900d5cf43370000200241002900cfcf433700002002410e412e10212202450d0c200220032903e80237000e200241266a200341e8026a41186a2903003700002002411e6a200341e8026a41106a290300370000200241166a200341e8026a41086a290300370000200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d8042002412e200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c803200341203602dc012003200341c8036a3602d801200341e8036a200341d8016a10ad03200210202003418c046a280200450d02200341e8036a41206a28020010200c020b41b99fc4002102411921050c0c0b200210200b410021024101210a4101210c0c190b410e41011023000b412e41011023000b410e41011023000b412e41011023000b412041011023000b410e41011023000b412e41011023000b419a88c00041331039000b410e41011023000b412e41011023000b4101210a4101210c20012d00002204410f4d0d0f0c100b200c10200b20020d004195a9c000210c4101210241002115410021054195a9c0000d020c010b200341e8026a41026a220c200341fc046a41026a2d00003a000020034190016a41086a2208200341a8036a41086a29030037030020034190016a410d6a2215200341a8036a410d6a290000370000200320032f01fc043b01e802200320032903a803370390010240024002400240412010222202450d00200220032f01e8023b00002002201836000720022005360003200220032903900137000b200241026a200c2d00003a0000200241136a2008290300370000200241186a20152900003700000240024020172004460d0020034188036a41026a2205200d41276a2d00003a0000200341e8036a41086a220c200d41386a290000370300200341e8036a410d6a2208200d413d6a2900003700002003200d2f00253b0188032003200d2900303703e803200d41c8006a2104200d41246a2d000022154102470d014100210c410121154101210541000d070c060b201721044100210c410121154101210541000d060c050b200d28002c211b200d2800282116200341c8046a41026a20052d00003a0000200341c8036a41086a200c290300370300200341c8036a410d6a2008290000370000200320032f0188033b01c804200320032903e8033703c8030240024020154101470d00200341d8046a2016410676103720032802d804210c20032802e0042016413f7122054d0d01200341fc046a41026a200c20054105746a220541026a2d00003a0000200528000321162005280007211b20052f00002108200341b5036a200541186a290000370000200341b0036a200541136a290000370300200320083b01fc042003200529000b3703a8034101210520032802dc04450d040c030b200341fc046a41026a200341c8046a41026a2d00003a0000200341a8036a41086a200341c8036a41086a290300370300200341a8036a410d6a200341c8036a410d6a290000370000200320032f01c8043b01fc04200320032903c8033703a8030c040b410021052018211b20032802dc040d010c020b412041011023000b200c10200b20050d004195a9c000210c41012115410121054195a9c0000d020c010b200341e8026a41026a221c200341fc046a41026a221d2d00003a000020034190016a41086a221e200341a8036a41086a221f29030037030020034190016a410d6a2220200341a8036a410d6a2221290000370000200320032f01fc043b01e802200320032903a80337039001200a41246c41b87f6a2122200341e3046a211a410221234120211841022115410021084101210502400240024002400340201a200329039001370000201a41086a201e290300370000201a410d6a20202900003700002003201b3600df04200320163600db04200320032f01e8023b01d8042003201c2d00003a00da0402402015417f6a2005470d002023201520152023491b2205ad4205862206422088a70d0a2006a7220c4100480d0a20022018200c10212202450d050b200220186a220c20032903d804370000200c41186a200341d8046a41186a290300370000200c41106a200341d8046a41106a290300370000200c41086a200341d8046a41086a2224290300370000200841f803460d02024020222008460d0020034188036a41026a2225200d20086a220c41cb006a2d00003a0000200341e8036a41086a2226200c41dc006a290000370300200341e8036a410d6a2227200c41e1006a2900003700002003200c41c9006a2f00003b0188032003200c41d4006a2900003703e803200c41c8006a2d000022284102460d02200c41d0006a2800002129200c41cc006a2800002116200341c8046a41026a222a20252d00003a0000200341c8036a41086a22252026290300370300200341c8036a410d6a22262027290000370000200320032f0188033b01c804200320032903e8033703c8030240024020284101470d00200341d8046a201641067610372016413f7121254100212620032802d80421270240202428020020254d0d00201d202720254105746a222541026a2d00003a0000202528000321162025280007211b20252f000021262021202541186a290000370000201f202541136a290000370300200320263b01fc042003202529000b3703a803410121260b024020032802dc04450d00202710200b20260d010c060b201d202a2d00003a0000201f202529030037030020212026290000370000200320032f01c8043b01fc04200320032903c8033703a8032029211b0b200441246a2104201c201d2d00003a0000201e201f29030037030020202021290000370000200320032f01fc043b01e802200320032903a80337039001202341026a2123201841206a2118201541016a2115200841246a21080c010b0b201721044100210c41000d050c040b200c41ec006a21040b4100210c41000d030c020b200c41ec006a21044195a9c000210c4195a9c0000d020c010b200c41011023000b410021160c010b4101211602402005450d00200210200b200c2102411521050b200341d8016a412c6a2108200d200a41246c6a210c02400340200c2004460d0120042d0000210a200441246a2104200a4102470d000b0b0240200b450d00200d10200b02402016450d004100210420120d050c060b200810b401200320153602b002200320053602ac02200320023602a802024002400240024002400240024002400240024002400240411210222202450d00200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf4337000020024112413210212212450d01201220082900003700122012412a6a200841186a290000370000201241226a200841106a2900003700002012411a6a200841086a290000370000200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80420124132200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c8030240200341c8036a412041c8d7c400410041001001417f460d0020034220370294012003200341c8036a36029001200341e8036a20034190016a10d90220032d00f40322024102460d0320034188036a41086a200341fd036a29000037030020034198036a20034185046a290000370300200341a0036a2003418d046a290000370300200341c4006a41026a20034198046a2d00003a0000200320032900f50337038803200320034196046a2f01003b014420034195046a2d0000210520034199046a28000021152003419d046a280000211620032802ec03210420032802e803210a200341356a200341ae046a290000370000200341286a41086a200341a9046a2900003703002003200341a1046a2900003703282004450d0c200a10200c0c0b20024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80441c29bc400411a200341d8046a1000200341e8036a41186a2002290300370300200341e8036a41106a2005290300370300200341e8036a41086a2004290300370300200320032903d8043703e8030240024002400240200341e8036a412041c8d7c400410041001001417f460d00200341e0036a4200370300200341c8036a41106a4200370300200341c8036a41086a4200370300200342003703c803200341e8036a4120200341c8036a4120410010012202417f460d072002411f4d0d07200341c8046a41026a220220032d00ca033a0000200341c8026a41086a2205200341db036a290000370300200341c8026a410d6a2204200341e0036a290000370000200320032f01c8033b01c804200320032900d3033703c80220032800cb03211520032800cf032116200341fc046a41026a220a20022d00003a0000200341e8026a41086a22022005290300370300200341e8026a410d6a22052004290000370000200320032f01c8043b01fc04200320032903c8023703e802200341c8026a41026a200a2d00003a0000200341a8036a41086a2002290300370300200341a8036a410d6a2005290000370000200320032f01fc043b01c802200320032903e8023703a803411210222202450d08200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf4337000020024112413210212209450d09200920032f01c8023b00122009201636001920092015360015200920032903a80337001d200941146a200341c8026a41026a2d00003a0000200941256a200341a8036a41086a2903003700002009412a6a200341b5036a290000370000200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80420094132200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c803200341c8036a412041c8d7c400410041001001417f460d0a200342203702dc042003200341c8036a3602d804200341e8036a200341d8046a10d90220032d00f40322054102460d0b20032802ec03211720032802e803211820032802f003210220034190016a200341f5036a41c3001084041a200320053a00e803200341e8036a41017220034190016a41c1001084041a20032d008904211a200341d8046a41186a22054200370300200341d8046a41106a22044200370300200341d8046a41086a220a4200370300200342003703d80420094132200341d8046a1000200341c8036a41186a2005290300370300200341c8036a41106a2004290300370300200341c8036a41086a200a290300370300200320032903d8043703c80320034201370390012003410036029801200320023602d804200341d8046a20034190016a103e20032802980121052002450d012002410574210b410020056b2104200328029401210a2018210203400240024002400240200a20046a41204f0d00200541206a220c2005490d16200a410174220d200c200c200d491b220d4100480d16200a450d01200328029001200a200d1021220c0d020c080b200328029001210c0c020b200d1022220c450d060b2003200d360294012003200c36029001200d210a0b20034190016a41086a200541206a220d360200200c20056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a2104200d2105200241206a2102200b41606a220b0d000c030b0b200341d8046a41186a220242003703002005420037030020044200370300200342003703d80441c29bc400411a200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c803412010222202450d0b20022008290000370000200241186a200841186a290000370000200241106a200841106a290000370000200241086a200841086a290000370000200341c8036a41202002412010032002102041002105410021020c0e0b2005210d0b024002400240200328029401200d470d00200d41016a2202200d490d11200d4101742205200220022005491b22054100480d11200d450d01200328029001200d200510212202450d020c0d0b20032802900121020c0d0b2005102222020d0b0b200541011023000b200d41011023000b411241011023000b413241011023000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b41b3a0c400419f011039000b419a88c00041331039000b412041011023000b200320053602940120032002360290010b20034190016a41086a220a200d41016a3602002002200d6a41013a000002400240024002400240200328029401220c200a28020022046b411f4b0d00200441206a22052004490d07200c410174220d20052005200d491b22054100480d07200c450d012002200c200510212202450d020c030b200c21050c030b2005102222020d010b200541011023000b200320053602940120032002360290010b200a200441206a220d360200200220046a220a41086a200841086a290000370000200a41106a200841106a290000370000200a41186a200841186a290000370000200a20082900003700000240024002400240024002400240024002400240024002402003418a046a4100201a4101461b220a450d002005200d470d01200541016a220c2005490d0e2005410174220b200c200c200b491b220c4100480d0e2005450d0320022005200c10212202450d040c090b2005200d470d01200541016a220a2005490d0d2005410174220c200a200a200c491b220b4100480d0d2005450d0420022005200b10212202450d050c060b2005210c0c080b2005210b0c050b200c102222020d050b200c41011023000b200b102222020d010b200b41011023000b2003200b3602940120032002360290010b20034198016a200441216a22043602002002200d6a41003a00000c020b2003200c3602940120032002360290010b20034190016a41086a221a200441216a22053602002002200d6a41013a000002400240024002400240200c20056b411f4b0d00200541206a220d2005490d08200c410174220b200d200d200b491b220b4100480d08200c450d012002200c200b10212202450d020c030b200c210b0c030b200b102222020d010b200b41011023000b2003200b3602940120032002360290010b201a200441c1006a2204360200200220056a220541086a200a41086a290000370000200541106a200a41106a290000370000200541186a200a41186a2900003700002005200a2900003700000b200341c8036a41202002200410030240200b450d00200210200b02402017450d00201810200b20091020200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80441c29bc400411a200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c803412010222202450d0420022008290000370000200241186a200841186a290000370000200241106a200841106a290000370000200241086a200841086a290000370000200341c8036a412020024120100320021020200341c4006a41026a200341c8026a41026a2d00003a0000200341286a41086a200341a8036a41086a290300370300200341286a410d6a200341a8036a410d6a290000370000200320032f01c8023b0144200320032903a80337032841012105410021020b2003418d046a20053a00002003418e046a20032f01443b010020034195046a201636000020034191046a201536000020034199046a2003290328370000200341e8036a410d6a20034188036a41086a290300370000200341fd036a20034188036a41106a29030037000020034185046a20034188036a41186a29030037000020034190046a200341c6006a2d00003a0000200341a1046a200341286a41086a290300370000200341a6046a200341286a410d6a290000370000200320023a00ec0320032003290388033700ed032003200341a8026a3602e803200341d8046a41186a22024200370300200341d8046a41106a22054200370300200341d8046a41086a22044200370300200342003703d80420124132200341d8046a1000200341c8036a41186a2002290300370300200341c8036a41106a2005290300370300200341c8036a41086a2004290300370300200320032903d8043703c8032003410036029801200342013703900120032802a80221022003200341a8026a41086a28020022053602d804200341d8046a20034190016a103e02402005450d002005410574210d410020034190016a41086a28020022056b210a200328029001210b200328029401210c03400240200c200a6a411f4b0d00200541206a22042005490d04200c4101742209200420042009491b22044100480d0402400240200c450d00200b200c20041021220b0d010c070b20041022220b450d060b2004210c0b200b20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200a41606a210a200541206a2105200241206a2102200d41606a220d0d000b20034198016a20053602002003200c360294012003200b360290010b200341e8036a41047220034190016a10b7022003280294012102200341c8036a4120200328029001220520034190016a41086a280200100302402002450d00200510200b20121020024020032802ac02450d0020032802a80210200b0240200341fc016a280200450d00200341f8016a28020010200b4100210c4101210a0b4100210220012d00002204410f4d0d080c090b1024000b200441011023000b412041011023000b200910200b20040d004100210c4101210a20012d00002204410f4d0d030c040b4100210c4101210a200b450d010b200d102020012d00002204410f4d0d010c020b20012d00002204410f4b0d010b410120047441beff01710d01024020044106460d002004410f470d01200a450d02200141086a280200450d02200141046a28020010200c020b200c450d01200141086a280200450d01200141046a28020010200c010b200141086a280200450d00200141046a28020010200b200020053602042000200236020020034180056a24000bc60303027f017e097f230041106b2202240020022001108e0102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b1031000b200541041023000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100122052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d102122060d010c060b200d10222206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610200b200241106a24000f0b1024000b200d41041023000bd60904067f027e027f027e230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100122062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241e0006a41186a22062003290300370300200241e0006a41106a22032004290300370300200241e0006a41086a220420052903003703002002200229038001370360200241c0006a41186a22052006290300370300200241c0006a41106a22062003290300370300200241c0006a41086a2203200429030037030020022002290360370340200241186a2005290300370300200241106a2006290300370300200241086a20032903003703002002200229034037030020024200370388012002420037038001200141086a220341002001280200200141046a220428020020024180016a41102007100122062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d0120024180016a41086a22072903002108200229038001210920024180016a41186a220a420037030020024180016a41106a220b4200370300200742003703002002420037038001200141086a220541002001280200200428020020024180016a41202003100122062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241e0006a41186a2206200a290300370300200241e0006a41106a2204200b290300370300200241e0006a41086a220a20072903003703002002200229038001370360200241c0006a41186a22072006290300370300200241c0006a41106a22062004290300370300200241c0006a41086a2204200a29030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2006290300370300200241206a41086a20042903003703002002200229034037032020024200370388012002420037038001200541002001280200200141046a28020020024180016a41102003100122012001417f461b2201411020014110491b20052802006a3602002001410f4d0d0320024180016a41086a2201290300210c200229038001210d20024180016a41186a2206200241186a29030037030020024180016a41106a2203200241106a2903003703002001200241086a290300370300200241e0006a41086a2204200241206a41086a290300370300200241e0006a41106a2205200241206a41106a290300370300200241e0006a41186a2207200241206a41186a290300370300200220022903003703800120022002290320370360200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a200229038001370300200041306a2001290300370300200041386a2003290300370300200041c0006a2006290300370300200041c8006a2002290360370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000bce0304027f017e037f017e230041c0006b2204240002400240411810222205450d00200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1000200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041c8d7c400410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a200429032021060c010b4200210a0b2005102020012006200220062006200256200a200356200a2003511b22051b22027d200a2003200a20051b22037d2006200254ad7d10b6012000200337030820002002370300200441c0006a24000f0b419a88c00041331039000b411841011023000b413841011023000bb70202047f027e230041206b22022400200241106a41086a2203420037030020024200370310418feec0004116200241106a1002200241086a22042003290300370300200220022903103703000240024002402002411041c8d7c400410041001001417f460d00200242003703182002420037031020024110200241106a4110410010012205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b2003420037030020024200370310418feec0004116200241106a1002200420032903003703002002200229031037030020024200200620017d2007200054ad7d2201200720007d2200200756200120065620012006511b22031b37031820024200200020031b37031020024110200241106a41101003200241206a24000f0b419a88c00041331039000bff0304027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110a2022005290310200356200541186a290300220720045620072004511b0d010c020b2005200110a2022005290300200358200541086a290300220720045820072004511b0d010b41fee7c0002101412621060c010b200541206a200110a8020240024002400240024020052802282201450d0042002107200541c0006a41086a220642003703002005420037034041cdc8c000410d200541c0006a1002200541306a41086a2006290300370300200520052903403703300240200541306a411041c8d7c400410041001001417f460d0020054200370340200541306a4110200541c0006a41084100100141016a41084d0d03200529034021070b200141286c210620052802242108200528022022092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d030b200141286a2101200641586a22060d000b410021012008450d040c030b02402005280224450d00200528022010200b410021010c040b41a4e8c000210120080d010c020b419a88c00041331039000b200910200b413121060b2000200636020420002001360200200541d0006a24000ba52105017f017e017f017e067f230041f0016b2203240042002104200341206a41086a220542003703002003420037032041a5eec000411b200341206a1002200341d0016a41086a2005290300370300200320032903203703d0010240024002400240200341d0016a411041c8d7c400410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441142107411410222205450d010c030b42002106411421074114102222050d020b200741011023000b419a88c00041331039000b200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef403700000240024002400240024002400240024002400240024002400240024020052007413410212205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200320013703d001200320023703d801200341206a4120200341d0016a41101003200510202004200158200620025820062002511b0d0c411410222205450d02200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410a302200341086a41106a2903002101200329031021022003280208210a20051020410e10222205450d04200541066a41002900f6ef40370000200541002900f0ef403700002005410e412e10212205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010092005102002402002200184500d00200a450d00200341206a41086a2205420037030020034200370320418feec0004116200341206a1002200341d0016a41086a22072005290300370300200320032903203703d00102400240200341d0016a411041c8d7c400410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012208417f460d0b2008410f4d0d0b200341286a2903002106200329032021040c010b42002104420021060b2005420037030020034200370320418feec0004116200341206a100220072005290300370300200320032903203703d00120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b370320200341d0016a4110200341206a411010030b410e10222205450d06200541066a41002900a3cf433700002005410029009dcf433700002005410e412e10212205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1000200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a200929030037030020032003290390013703d00102400240200341d0016a412041c8d7c400410041001001417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341d0016a4120200341206a4120410010012207417f460d032007411f4d0d03200341b0016a41186a2207200341206a41186a290300370300200341b0016a41106a2208200341206a41106a290300370300200341b0016a41086a2209200341206a41086a290300370300200320032903203703b001200341d0016a4120100920051020200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a2009290300370300200320032903b0013703d001410e10222205450d0b200541066a41002900d5cf43370000200541002900cfcf433700002005410e412e10212205450d0c200520032903d00137000e200541266a200341d0016a41186a2903003700002005411e6a200341d0016a41106a290300370000200541166a200341d0016a41086a29030037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020410d2107410d10222205450d010c0d0b20051020410d2107410d102222050d0c0b200741011023000b413441011023000b419a88c00041331039000b411441011023000b413441011023000b410e41011023000b412e41011023000b410e41011023000b412e41011023000b419a88c00041331039000b410e41011023000b412e41011023000b200541056a41002900fe9d44370000200541002900f99d44370000024002400240024002400240024002400240024020052007412d10212205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412d20034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020411210222205450d01200541106a41002f008aed433b0000200541086a4100290082ed43370000200541002900faec4337000020054112413210212205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020200010b401200010a402200341206a200010c701024002400240024020032d002022054103714102460d0020050d01200341cc006a2802002105200341c8006a2802002207200341d0006a28020010152005450d0220071020411721074117102222050d030c070b20050d01200341cc006a280200450d01200341c8006a2802001020411721074117102222050d020c060b20050d00200341cc006a280200450d00200341c8006a28020010200b41172107411710222205450d040b2005410f6a41002900cfe342370000200541086a41002900c8e342370000200541002900c0e34237000020052007413710212205450d04200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413720034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020411210222205450d05200541106a41002f00efad423b0000200541086a41002900e7ad42370000200541002900dfad4237000020054112413210212205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100920051020411810222205450d07200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032002400240200341206a412041c8d7c400410041001001417f460d00200342003703d801200342003703d001200341206a4120200341d0016a4110410010012207417f460d012007410f4d0d01200341d8016a290300210220032903d001210141002107200510202001200284504101710d0d0c0b0b41012107200510204100410171450d0a0c0c0b419a88c00041331039000b412d41011023000b411241011023000b413241011023000b200741011023000b413741011023000b411241011023000b413241011023000b411841011023000b413841011023000b20070d010b200341f0016a24000f0b02400240411310222205450d002005410f6a410028008ec940360000200541086a4100290087c940370000200541002900ffc84037000020054113413310212205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100020034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100920051020200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a0020200341206a103d200341f0016a24000f0b411341011023000b413341011023000ba80704027f017e037f037e230041d0006b2204240002400240024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310024002400240200441106a412041c8d7c400410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d022007410f4d0d02200441386a290300210a200429033021060c010b4200210a0b200510200240024020062002542205200a200354200a2003511b450d0041debcc1002105411521010c010b200441086a20014104200620027d2206200a20037d2005ad7d220a10ae01024020042802082205450d00200428020c21010c010b411810222205450d05200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a2900003700004200210b200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054138200441306a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429033037031002400240200441106a412041c8d7c400410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d062007410f4d0d06200441386a290300210c2004290330210b0c010b4200210c0b200510202001200b20027c2202200c20037c2002200b54ad7c10b60120012006200a10af01410021050b2000200136020420002005360200200441d0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b411841011023000b413841011023000b8a0501077f230041b0016b22022400024002400240410e10222203450d00200341066a41002900d5cf43370000200341002900cfcf433700002003410e412e10212203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a22054200370300200242003703602003412e200241e0006a1000200241306a41186a2001290300370300200241306a41106a2004290300370300200241306a41086a20052903003703002002200229036037033002400240200241306a412041c8d7c400410041001001417f460d00200242203702542002200241306a360250200241e0006a200241d0006a10b1032002280280012201450d0420002002290360370300200041186a200241e0006a41186a290300370300200041106a200241e0006a41106a290300370300200041086a200241e0006a41086a290300370300200241086a2204200241e0006a412c6a290200370300200241106a2205200241e0006a41346a290200370300200241186a2206200241e0006a413c6a290200370300200241206a2207200241e0006a41c4006a290200370300200241286a2208200241e0006a41cc006a280200360200200220022902840137030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b20031020200241b0016a24000f0b410e41011023000b412e41011023000b419a88c00041331039000baa0906047f047e017f017e097f037e230041c0016b220224000240024002400240024002400240024002400240410f10222203450d00200341076a41002900fdee43370000200341002900f6ee433700002003410f412f10212204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a29000037000020024180016a41186a2201420037030020024180016a41106a2203420037030020024180016a41086a2205420037030020024200370380012004412f20024180016a1000200241d0006a41186a2001290300370300200241d0006a41106a2003290300370300200241d0006a41086a200529030037030020022002290380013703500240024002400240200241d0006a412041c8d7c400410041001001417f460d00200242203702742002200241d0006a360270200241386a200241f0006a108c012002290338a7450d0b200241386a41106a290300210620022903402107200241206a200241f0006a108c012002290320a7450d0b200241306a290300210820022903282109200241186a200241f0006a108e012002280218450d0b200228021c220aad42307e220b422088a70d03200ba72201417f4c0d032001450d0120011022220c450d06200a450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210c200a0d050b4100210f4200210b200c450d080c050b1031000b410f41011023000b412f41011023000b200141081023000b20024180016a41186a210320024180016a41106a21054200210b4100210d4100210e41002101200a210f0340200342003703002005420037030020024180016a41086a221042003703002002420037038001200241f0006a41086a22112011280200221141002002280270200228027420024180016a41202011100122112011417f461b2211412020114120491b6a3602002011411f4d0d03200241a0016a41186a22122003290300370300200241a0016a41106a22132005290300370300200241a0016a41086a2214201029030037030020022002290380013703a0012002200241f0006a108c012002290300a7450d03200141016a2111200241106a290300211520022903082116200320122903003703002005201329030037030020102014290300370300200220022903a0013703800102402001200f470d00200d20112011200d491b220fad42307e2217422088a70d062017a722124100480d0602402001450d00200c200e20121021220c0d010c080b20121022220c450d070b200c200e6a2201201537030820012016370300200141286a2003290300370300200141206a2005290300370300200141186a2010290300370300200141106a200229038001370300200b4280808080107c210b200d41026a210d200e41306a210e201121012011200a490d000b200c450d030b200020093703102000200637030820002007370300200041246a200b200fad843702002000200c360220200041186a20083703000b20041020200241c0016a24000f0b200f450d00200c10200b419a88c00041331039000b1024000b201241081023000bd30704027f017e037f057e230041c0006b2204240002400240024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054134200441206a1000200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041c8d7c400410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a2004290320210b0c010b4200210b4200210a0b200510202001200b2002200b200b200256200a200356200a2003511b22051b220c7d200a2003200a20051b220d7d200b200c54ad7d10af0102400240024002402002200c7d220b2003200d7d2002200c54ad7d220e84500d00411810222205450d08200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1000200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703002004412041c8d7c400410041001001417f460d01200442003703282004420037032020044120200441206a4110410010012207417f460d072007410f4d0d07200441286a2903002103200429032021020c020b4200210e0c020b420021030b2005102020012002200b20022002200b562003200e562003200e511b22051b220a7d2003200e200320051b22067d2002200a54ad7d10b601200e20067d200b200a54ad7d210e2006200d7c200a200c7c2202200a54ad7c2103200b200a7d21060b2000200637031020002002370300200041186a200e37030020002003370308200441c0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b411841011023000b413841011023000ba11501077f230041c0036b220124000240024002400240024002400240024002400240024002400240024002400240411210222202450d00200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e0026a41186a22004200370300200141e0026a41106a22034200370300200141e0026a41086a22044200370300200142003703e00220024132200141e0026a1000200141b0026a41186a2000290300370300200141b0026a41106a2003290300370300200141b0026a41086a2004290300370300200120012903e0023703b00202400240200141b0026a412041c8d7c400410041001001417f460d002001422037026c2001200141b0026a360268200141e0026a200141e8006a10820320012d00f80222034102460d0420014188016a41186a20014191036a29000037030020014188016a41106a20014189036a29000037030020014188016a41086a20014181036a290000370300200141e8016a41086a200141a2036a290100370300200141e8016a41106a200141aa036a290100370300200141e8016a41186a200141b2036a290100370300200120012900f9023703880120012001419a036a2901003703e80120014199036a2d00002104200141b0026a412010090c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002102020034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d00411210222202450d06200241106a41002f00cdcf433b0000200241086a41002900c5cf43370000200241002900bdcf4337000020024112413210212202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210222200450d09200041106a41002f00cdcf433b0000200041086a41002900c5cf43370000200041002900bdcf4337000020004112413210212200450d0a200020012903683700122000412a6a200141e8006a41186a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220004132200141e0026a1000200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041c8d7c400410041001001417f460d0b200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a10820320012d00f80222074102460d0c20014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001084041a200120073a00a00120014188016a41196a200141e8016a41c7001084041a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141c8006a41186a290300370100200141e0026a41186a220442003703002005420037030020064200370300200142003703e00220004132200141e0026a1000200141b0026a41186a2004290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a10ae03200010204101210420020d010c0e0b200141e0026a41186a22004200370300200141e0026a41106a22054200370300200141e0026a41086a22064200370300200142003703e00241dceec300411a200141e0026a1000200141b0026a41186a2000290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b0020240200441ff01714101470d00412010222200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a412020004120100320001020410021004100210420020d010c0e0b200141b0026a4120100941002100410021042002450d0d0b200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220024132200141e0026a1000200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041c8d7c400410041001001417f460d03200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a10820320012d00f8024102460d0420014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001084041a20014188016a41196a200141e8016a41c7001084042001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a200141e8006a41186a290300370000200120033a00a001200141e0026a41186a220342003703002005420037030020064200370300200142003703e00220024132200141e0026a1000200141b0026a41186a2003290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a10ae0320021020410121032004200045720d0e0c0d0b411241011023000b413241011023000b419a88c00041331039000b4189eec30041d3001039000b419a88c00041331039000b411241011023000b413241011023000b411241011023000b413241011023000b4189eec30041d3001039000b419a88c00041331039000b412041011023000b410021032004200045720d010b200010200b2002452003720d00200210200b200141c0036a24000b6c01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c200341b8d7c400360208200320033602282003200341046a3602202003200341206a360218200341086a20001048000bc10e05017f017e017f017e067f230041b0016b2203240042002104200341206a41086a220542003703002003420037032041a5eec000411b200341206a100220034190016a41086a20052903003703002003200329032037039001024002400240024020034190016a411041c8d7c400410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441182107411810222205450d010c030b42002106411821074118102222050d020b200741011023000b419a88c00041331039000b200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef40370000024002400240024002400240024002400240024020052007413810212205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032020032001370390012003200237039801200341206a412020034190016a41101003200510202004200158200620025820062002511b0d08411810222205450d02200541106a41002900b9ef40370000200541086a41002900b1ef40370000200541002900a9ef4037000020054118413810212205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810a302200341086a41106a290300210120032802082107200329031021022005102002402002200184500d002007450d00200341206a41086a2205420037030020034200370320418feec0004116200341206a100220034190016a41086a2207200529030037030020032003290320370390010240024020034190016a411041c8d7c400410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012208417f460d092008410f4d0d09200341286a2903002106200329032021040c010b42002104420021060b2005420037030020034200370320418feec0004116200341206a100220072005290300370300200320032903203703900120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b37032020034190016a4110200341206a411010030b411410222205450d04200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1000200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a200929030037030020032003290390013703200240200341206a412041c8d7c400410041001001417f460d0020034200370398012003420037039001200341206a412020034190016a4110410010012207417f460d022007410f4d0d0220034198016a2903002102200329039001210141002107200510202001200284504101710d0a0c080b41012107200510204100410171450d070c090b413841011023000b419a88c00041331039000b411841011023000b413841011023000b411441011023000b413441011023000b419a88c00041331039000b20070d010b200341b0016a24000f0b02400240411310222205450d002005410f6a410028008ec940360000200541086a4100290087c940370000200541002900ffc84037000020054113413310212205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100020034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100920051020200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a0020200341206a103d200341b0016a24000f0b411341011023000b413341011023000b9f0803037f017e077f0240024002400240024002400240024002400240024002402001280200417f6a220241064b0d0002400240024002400240024002400240024002400240024002400240024020020e0700040203010506000b2001410c6a2802002202417f4c0d17200128020421034101210102402002450d00200210222201450d100b20012003200210840421012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002202417f4c0d16200128020421012002450d052002102222030d06200241011023000b2001410c6a2802002202417f4c0d15200128020421012002450d062002102222030d07200241011023000b20004104360200200041086a200141086a2903003703000f0b200041023602000f0b2001410c6a2802002204ad42187e2205422088a70d122005a72203417f4c0d12200128020421022003450d05200310222206450d0b2004450d060c100b2001410c6a2802002207ad420c7e2205422088a70d112005a72202417f4c0d11200128020421032002450d06200210222204450d0b410c21092007450d070c0c0b410121030b20032001200210840421012000410c6a2002360200200041086a200236020020002001360204200041053602000f0b410121030b20032001200210840421012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210620040d0a0b410021080c0a0b41042104410c210920070d050b410021080c050b41d48cc000102f000b200241011023000b200341041023000b200241041023000b2003200720096c6a210c41002108200421020340200341086a2802002201417f4c0d052003280200210a024002402001450d0020011022220b0d010c040b4101210b0b200b200a2001108404210a200241086a2001360200200241046a20013602002002200a360200200220096a2102200841016a2108200320096a2203200c470d000b0b2000200436020420004107360200200020096a2008360200200041086a20073602000f0b200141011023000b2002200441186c6a210741002108200621010340200241086a2802002203417f4c0d0220022802002109024002402003450d0020031022220a0d010c050b4101210a0b200a20092003108404210a200241146a2802002209417f4c0d022002410c6a280200210b024002402009450d0020091022220c0d010c060b4101210c0b200c200b2009108404210b200141146a2009360200200141106a20093602002001410c6a200b360200200141086a2003360200200141046a20033602002001200a360200200141186a2101200841016a2108200241186a22022007470d000b0b20002006360204200041063602002000410c6a2008360200200041086a20043602000f0b1031000b200341011023000b200941011023000bc3d10105067f017e017f017e027f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410b4b0d0002400240024020030e0c0008050602090a070c040b01000b200141046a280200200141086a2802002203470d13200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d2720012802002003200510212204450d280c500b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1820012802002003200510212204450d190c4a0b200141046a2205280200200141086a22042802002203470d0b200341016a22062003490d5020034101742207200620062007491b22074100480d502003450d1920012802002003200710212206450d1a0c450b200141046a280200200141086a2802002203470d0b200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d1a20012802002003200510212204450d1b0c420b200141046a280200200141086a2802002203470d0b200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d1b20012802002003200510212204450d1c0c3f0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d1c20012802002003200510212204450d1d0c3c0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1d20012802002003200510212204450d1e0c390b200141046a280200200141086a2802002203470d0b200341016a22042003490d4620034101742205200420042005491b22054100480d462003450d1e20012802002003200510212204450d1f0c360b200141046a280200200141086a2802002203470d0c200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d2120012802002003200510212204450d220c330b200141046a280200200141086a2802002203470d0c200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d2220012802002003200510212204450d230c300b200141046a280200200141086a2802002203470d0c200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d2320012802002003200510212204450d240c2d0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4220034101742205200420042005491b22054100480d422003450d2420012802002003200510212204450d250c2a0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4120034101742205200420042005491b22054100480d412003450d2520012802002003200510212204450d260c270b200128020021040c3f0b200128020021060c3a0b200128020021040c370b200128020021040c340b200128020021040c310b200128020021040c2e0b200128020021040c2b0b200128020021040c3d0b200128020021040c270b200128020021040c240b200128020021040c210b200128020021040c1e0b200128020021040c1b0b2005102222040d310b200541011023000b2007102222060d2b0b200741011023000b2005102222040d270b200541011023000b2005102222040d230b200541011023000b2005102222040d1f0b200541011023000b2005102222040d1b0b200541011023000b2005102222040d170b200541011023000b2005102222040d280b200541011023000b2005102222040d110b200541011023000b2005102222040d0d0b200541011023000b2005102222040d090b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1d20034101742205200420042005491b22044100480d1d2003450d0120012802002003200410212205450d020c030b200128020021050c030b2004102222050d010b200441011023000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a2001103e2000450d142003200041286c6a2109200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000102122060d020c050b200128020021060c020b200010222206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002108024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000102122060d020c060b200128020021060c020b200010222206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20083700002009200341286a2203470d000c170b0b200041011023000b200041011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d1120012802002003200510212204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d3820034101742205200420042005491b22054100480d382003450d0a20012802002003200510212204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d0b20012802002003200510212204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d0c20012802002003200510212204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d3520034101742205200420042005491b22054100480d352003450d0f20012802002003200510212204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d3420034101742205200420042005491b22054100480d342003450d1020012802002003200510212204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005102222040d130b200541011023000b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d0f0b200541011023000b2005102222040d050b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2520044101742203200020002003491b22034100480d252004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2320044101742203200520052003491b22034100480d232004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2120044101742203200520052003491b22034100480d212004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1f20044101742203200520052003491b22034100480d1f2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001103e02400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d1d20004101742204200520052004491b22044100480d1d2000450d0120012802002000200410212200450d020c030b200128020021000c030b2004102222000d010b200441011023000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a200620031084041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000200041056a2104200141046a28020021062005280200210302400240024002400240024002400240024002400240200041046a2d00004101470d0020062003470d01200341016a22052003490d2420034101742206200520052006491b22064100480d242003450d0320012802002003200610212205450d040c090b20062003470d01200341016a22052003490d2320034101742206200520052006491b22064100480d232003450d0420012802002003200610212205450d050c060b200128020021050c080b200128020021050c050b2006102222050d050b200641011023000b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d2020054101742203200620062003491b22034100480d202005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41013a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1920054101742203200620062003491b22034100480d192005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d1920044101742203200520052003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2e20034101742205200420042005491b22054100480d2e2003450d0b20012802002003200510212204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d0620012802002003200510212204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0720012802002003200510212204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0a20012802002003200510212204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d090b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a2001103e0240024002402004450d0020044105742107200141046a21090340024002400240024020092802002206200528020022046b41204f0d00200441206a220b2004490d1f20064101742204200b200b2004491b22044100480d1f2006450d01200128020020062004102122060d020c060b200128020021060c020b200410222206450d040b2001200636020020092004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a2001103e2004450d1020044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22092004490d1e20054101742204200920092004491b22044100480d1e2005450d01200128020020052004102122050d020c060b200128020021050c020b200410222205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c110b0b200441011023000b200441011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034102460d00024020034101460d0020030d1d200141046a280200200141086a2802002203470d04200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0920012802002003200510212204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2520034101742205200420042005491b22054100480d252003450d0420012802002003200510212204450d050c0c0b200141046a28020020052802002203470d01200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0520012802002003200510212204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102222040d070b200541011023000b2005102222040d030b200541011023000b2005102222040d050b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a370000200041e8006a2903002108200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1e20044101742203200020002003491b22034100480d1e2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1a20044101742203200520052003491b22034100480d1a2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1a20044101742203200020002003491b22034100480d1a2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0f20012802002003200510212204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0820012802002003200510212204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0920012802002003200510212204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2820034101742205200420042005491b22054100480d282003450d0a20012802002003200510212204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0d20012802002003200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1920044101742203200520052003491b22034100480d192004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041256a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1720044101742203200520052003491b22034100480d172004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200636000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a200041c5006a2d00003a0000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0720012802002003200510212204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0420012802002003200510212204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0720012802002003200510212204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005102222040d070b200541011023000b2005102222040d070b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1a20044101742203200020002003491b22034100480d1a2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1620044101742203200020002003491b22034100480d162004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041086a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22002003490d1420044101742203200020002003491b22034100480d142004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2520034101742205200420042005491b22054100480d252003450d0f20012802002003200510212204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0820012802002003200510212204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0920012802002003200510212204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a20012802002003200510212204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0d20012802002003200510212204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102222040d0f0b200541011023000b2005102222040d0b0b200541011023000b2005102222040d070b200541011023000b2005102222040d0b0b200541011023000b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1320044101742203200020002003491b22034100480d132004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1120044101742203200020002003491b22034100480d112004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0d20044101742203200020002003491b22034100480d0d2004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d1620034101742200200420042000491b22004100480d162003450d0320012802002003200010212204450d040c090b20042003470d01200341016a22042003490d1520034101742200200420042000491b22004100480d152003450d0420012802002003200010212204450d050c060b200128020021040c080b200128020021040c050b2000102222040d050b200041011023000b2000102222040d010b200041011023000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341074b0d000240024002400240024002400240024020030e080005020301060704000b200528020020042802002203470d0c200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d1920012802002003200710212206450d1a0c330b200528020020042802002203470d07200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d1020012802002003200710212206450d110c300b200528020020042802002203470d07200341016a22062003490d3c20034101742207200620062007491b22074100480d3c2003450d1120012802002003200710212206450d120c2d0b200528020020042802002203470d07200341016a22062003490d3b20034101742207200620062007491b22074100480d3b2003450d1220012802002003200710212206450d130c2a0b200528020020042802002203470d07200341016a22062003490d3a20034101742207200620062007491b22074100480d3a2003450d1320012802002003200710212206450d140c270b200528020020042802002203470d08200341016a22062003490d3920034101742207200620062007491b22074100480d392003450d1620012802002003200710212206450d170c240b200528020020042802002203470d08200341016a22062003490d3820034101742207200620062007491b22074100480d382003450d1720012802002003200710212206450d180c210b200528020020042802002203470d08200341016a22062003490d3720034101742207200620062007491b22074100480d372003450d1820012802002003200710212206450d190c1e0b200528020020042802002203470d08200341016a22062003490d3620034101742207200620062007491b22074100480d362003450d1920012802002003200710212206450d1a0c1b0b200128020021060c290b200128020021060c260b200128020021060c230b200128020021060c200b200128020021060c270b200128020021060c1c0b200128020021060c190b200128020021060c160b200128020021060c130b2007102222060d1f0b200741011023000b2007102222060d1b0b200741011023000b2007102222060d170b200741011023000b2007102222060d130b200741011023000b2007102222060d190b200741011023000b2007102222060d0d0b200741011023000b2007102222060d090b200741011023000b2007102222060d050b200741011023000b2007102222060d010b200741011023000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1e20064101742203200920092003491b22034100480d1e2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002108200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1e20004101742203200520052003491b22034100480d1e2000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120083700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1c20064101742203200720072003491b22034100480d1c2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1c20054101742203200620062003491b22034100480d1c2005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1a20064101742203200920092003491b22034100480d1a2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1a20034101742206200520052006491b22064100480d1a2003450d0120012802002003200610212205450d020c030b200128020021050c030b2006102222050d010b200641011023000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41023a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1820064101742203200920092003491b22034100480d182006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d2420034101742205200020002005491b22054100480d242003450d0720012802002003200510212200450d080c0f0b200528020020042802002203470d01200341016a22002003490d2320034101742205200020002005491b22054100480d232003450d0420012802002003200510212200450d050c0c0b200528020020042802002203470d02200341016a22002003490d2220034101742205200020002005491b22054100480d222003450d0720012802002003200510212200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005102222000d070b200541011023000b2005102222000d070b200541011023000b2005102222000d010b200541011023000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0e0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1620054101742203200620062003491b22034100480d162005450d0120012802002005200310212205450d020c030b200128020021050c030b2003102222050d010b200341011023000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1420004101742203200520052003491b22034100480d142000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1220004101742203200520052003491b22034100480d122000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1020004101742203200520052003491b22034100480d102000450d0120012802002000200310212200450d020c030b200128020021000c030b2003102222000d010b200341011023000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d0e20064101742203200920092003491b22034100480d0e2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002108200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0e20064101742203200720072003491b22034100480d0e2006450d0120012802002006200310212206450d020c030b200128020021060c030b2003102222060d010b200341011023000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320083700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a2001103e2000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22092000490d0e20064101742200200920092000491b22004100480d0e2006450d01200128020020062000102122060d020c060b200128020021060c020b200010222206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b200041011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d0b20034101742205200020002005491b22054100480d0b2003450d0320012802002003200510212200450d040c090b20062003470d01200341016a22002003490d0a20034101742205200020002005491b22054100480d0a2003450d0420012802002003200510212200450d050c060b200128020021000c080b200128020021000c050b2005102222000d050b200541011023000b2005102222000d010b200541011023000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d0720034101742205200020002005491b22054100480d072003450d0120012802002003200510212200450d020c030b200128020021000c030b2005102222000d010b200541011023000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a0000024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d0320004101742203200520052003491b22034100480d032000450d0120012802002000200310212200450d020c040b200128020021000c040b2003102222000d020b200341011023000b1024000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d0120012802002003200510212204450d020c030b200128020021040c030b2005102222040d010b200541011023000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310212204450d020c030b200128020021040c030b2003102222040d010b200341011023000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310212204450d020c040b200128020021040c040b2003102222040d020b200341011023000b1024000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b9d8d0109057f037e027f027e017f017e077f027e047f230041d0096b22022400200241003a00f008200241f0086a200128020022032001280204220441004722051084041a02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00f0082204410e4b0d07024020040e0f000b0709040c0e0a10060f03050d02000b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8b01200141046a200620046b3602002001200520046a3602002006450dd10120022d00f008450d110cd1010b2000410f360200200241d0096a24000f0b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002006450d1220022d00f00822044101460d1120040d12200241f0086a200110b90120022802f008210420024190086a200241f0086a41047241dc001084041a2004410f460d12200241b0076a20024190086a41dc001084041a41e00010222201450d9e0120012004360200200141046a200241b0076a41dc001084041a2001410876210541012104420021070c1e0b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002006450dcd0120022d00f008450d0d0ccd010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b22033602002001200520046a22043602002006450d1a20022d00f00822054102460d1820054101460d1720050d1a200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b3602002001200420056a3602002003411f4d0d1a20024190086a41186a200241f0086a41186a29030037030020024190086a41106a200241f0086a41106a29030037030020024190086a41086a200241f0086a41086a290300370300200220022903f008370390082002290097082208422088a721012002419f086a290000210720022d00af08210420022900a7082109200228009308210520022f009108210620022d00900821032008a7210a4101210b0c190b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002006450d2120022d00f008220441044b0d21024020040e0500201e1f1d000b200241d8046a200110ba0120022903d804a7450d21200241e8046a290300210720022903e0042109200241f0086a200110bb0120022d00f00822044102460d212002418c096a2902002108200241fc086a290200210c20022f00f108210120022d00f308210520022902f408210d200220024184096a2902003703a0082002200c370398082002200d3703900820012005411074722101410121050c200b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b22033602002001200520046a22043602002006450d1120022d00f00822054101460d0f20050d11200241b0046a200110bc0120022802b004450d1120022802b4042105200241f0086a200110b90120022802f008210420024190086a200241f0086a41047241dc001084041a2004410f460d11200241b0076a20024190086a41dc001084041a41e00010222201450da10120012004360200200141046a200241b0076a41dc001084041a4101210441002103410021064100210e0c100b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8a01200141046a200620046b3602002001200520046a3602002000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b3602002001200520046a3602002006450d1120022d00f00822044101460d0f20040d11200241f0086a200110bb0120022d00f00822044102460d1120022d00f308210520022f00f10821062002418c096a290200210f20024184096a2902002107200241fc086a290200210920022902f4082108200241c0006a200110ba012002290340a7450d1120062005411074722101200241c0006a41106a290300210c2002290348210d200f422088a72105200fa72106410121030c100b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b3602002001200520046a3602002006450d5d20022d00f008220441094b0d5d024020040e0a00322f302d353631382e000b200241f0086a200110bd0120022802f0082204450d5d20022902f408210720024190036a200110bc012007a72105200228029003450d5c2002280294032101200541087621032004410876210a200742208821074101210b0c320b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a220a3602002006450d7920022d00f008220541064b0d7941022106024020050e0700c5012829272a2b000b200241106a200110bc012002280210450d7920022802142205417f4c0d8f012005450d63200510762204450da30120042001280200200141046a22032802002206200520062005491b22061084041a2003280200220a2006490da4012003200a20066b3602002001200128020020066a36020020062005470d640cc3010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d890141042103200141046a200620046b220a3602002001200520046a22103602002006450db70120022d00f0082205410e4b0db701024020050e0f004d4e724a51544f584c56494b5248000b200241f0086a200110bb0120022d00f00822044102460db70120022d00f308210b20022f00f108211120024184096a290200210f200241fc086a290200210920022902f40821082002418c096a290200210720024198016a200110ba01200229039801a7450db70120024198016a41106a290300210d20022903a001210c200141046a22032802002105200241003a00f008200241f0086a2001280200220a200541004722061084041a20052006490db0012003200520066b3602002001200a20066a3602002005450db70120022d00f008220641024b0db7012011200b41107472210e20022009370398082002200837039008200220073703a8082002200f3703a008200f422088a72111200fa7210b410121030c710b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a22043602002006450d7c20022d00f008220541044b0d7c024020050e0500221d1f1b000b200241003602f008200241f0086a20042003410420034104491b22051084041a200141046a220a200320056b22063602002001200420056a2204360200200341034d0d7c20022802f008210b200242003703f008200241f0086a20042006410820064108491b22051084041a200a200620056b22033602002001200420056a2204360200200641074d0d7c20022903f0082109200242003703f008200241f0086a20042003410820034108491b22051084041a200141046a220a200320056b22063602002001200420056a2204360200200341074d0d7c20022903f0082107200242003703f008200241f0086a20042006410820064108491b22051084041a200a200620056b22033602002001200420056a2204360200200641074d0d7c20022903f0082108200242003703f008200241f0086a20042003410820034108491b22051084041a200141046a220a200320056b22063602002001200420056a2204360200200341074d0d7c20022802f408210520022802f0082111200242003703f008200241f0086a20042006410820064108491b22031084041a200a200620036b220e3602002001200420036a2204360200200641074d0d7c20022802f408211220022802f0082113200242003703f008200241f0086a2004200e4108200e4108491b22061084041a200141046a220a200e20066b22033602002001200420066a2204360200200e41074d0d7c20022903f008210c200242003703f008200241f0086a20042003410820034108491b22061084041a200a200320066b220e3602002001200420066a2204360200200341074d0d7c20022903f008210d200242003703f008200241f0086a2004200e4108200e4108491b22061084041a200141046a220a200e20066b22033602002001200420066a2204360200200e41074d0d7c20022903f008210f200241003602f008200241f0086a20042003410420034104491b22061084041a200a200320066b220e3602002001200420066a2204360200200341034d0d7c20022802f0082106200241003602f008200241f0086a2004200e4104200e4104491b22031084041a200141046a200e20036b220a3602002001200420036a2204360200200e41034d0d7c20022802f0082110200241003a00f008200241f0086a2004200a41004722031084041a200a2003490db401200141046a200a20036b3602002001200420036a360200200a450d7c20022d00f00821012002200f3703e0062002200d3703d8062002200c3703d006200220123602cc06200220133602c80620114110762112201141807e712104410121140cbe010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a22053602002006450d5720022d00f0082206410b4b0d574109210e024020060e0c003d3e3b40413f45b8013c443a000b200241f0086a200110b90120022802f008210520024190086a200241f0086a41047241dc001084041a2005410f460d57200241b0076a20024190086a41dc001084041a41e00010222204450daa0120042005360200200441046a200241b0076a41dc001084041a200241c0026a200110ba0120022903c002a7450d56200241d0026a290300210920022903c8022207422088a721152007a721164101210e410021130c410b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b3602002001200520046a3602002006450dbe0120022d00f008450d030cbe010b200241003a00f008200241f0086a2005200641004722041084041a20062004490d8901200141046a200620046b22033602002001200520046a22043602002006450d2020022d00f008220541044b0d20024020050e0500201b1d19000b200241f0086a200110b90120022802f008210120024190086a200241f0086a41047241dc001084041a2001410f460d20200241b0076a20024190086a41dc001084041a41e00010222204450d990120042001360200200441046a200241b0076a41dc001084041a200228028407210a20022f018207210b20022d008107211120022d008007210520022903f806210920022903f006210820022903e8062107410121010cb9010b200241d0046a200110bc0120022802d004450dbf0120022802d4042204417f4c0d89012004450d34200410762206450d920120062001280200200141046a22032802002205200420052004491b22051084041a2003280200220a2005490d93012003200a20056b3602002001200128020020056a36020020052004470d350cbb010b2002200110572002290300a7450dbf012002290308210720004100360200200041086a2007370300200041106a200241f0086a41d0001084041a200241d0096a24000f0b200241c0046a2001105720022903c004a7450dba0120022903c80421072000410a360200200041086a2007370300200041106a200241f0086a41d0001084041a200241d0096a24000f0b200241f0086a200110bb014102210420022d00f00822014102470d0b0b2000410f360200200241d0096a24000f0b200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b3602002001200420056a3602002003411f4d0d0120022d00f008210420022f00f108210520022800f3082106200229008709210720022d008f09210320022900f708210920024190086a410f6a200241f0086a410f6a2900003700002002200937009708200241b0076a41086a20024190086a41086a290300370300200220033a00af08200220073700a708200241b0076a41186a20024190086a41186a290300370300200241b0076a41106a20024190086a41106a2903003703002002200636009308200220053b009108200220043a00900820022002290390083703b007200241b8046a200110bc0120022802b804450d0120022802bc042106200141046a22032802002104200241003a00f008200241f0086a2001280200220a200441004722051084041a20042005490d92012003200420056b3602002001200a20056a3602002004450d0120022d00f008210e20024190076a2201200241bf076a29000037030020024198076a2204200241c7076a290000370300200241a0076a2205200241cf076a2d00003a0000200220022800b3073600ab07200220022802b0073602a807200220022900b7073703880720052d000021032004290300210720012903002109200228028c072111200228028807210120022800ab07210520022f00a907210a20022d00a807210b410221040b200041003b01262000200e3a00252000200a3b00062000200b3a0005200020043a000420004109360200200041286a2006360200200041246a20033a00002000411c6a2007370200200041146a2009370200200041106a20113602002000410c6a2001360200200041086a20053602002000412c6a20022902f008370200200041346a200241f0086a41086a2902003702002000413c6a200241f0086a41106a290200370200200041c4006a20024188096a290200370200200041cc006a20024190096a290200370200200041d4006a200241f0086a41286a290200370200200041dc006a200241a0096a280200360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241f0086a200110bb0120022d00f00822044102460d0120022d00f308210520022f00f10821062002418c096a290200211720024184096a2902002107200241fc086a290200210920022902f4082108200241f0006a200110ba012002290370a7450d01200241f0006a41106a290300210c2002290378210d200241d8006a200110ba012002290358a7450d0120062005411074722101200241e8006a29030021182002290360210f2017422088a721052017a72106410221030b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2018370200200041c0006a200f370200200041386a200c370200200041306a200d3702002000412c6a2005360000200041286a2006360000200041206a2007370000200041186a2009370000200041106a20083700002000410c6a20043a0000200041086a2003360200200041d0006a20022903f008370300200041d8006a200241f0086a41086a290300370300200241d0096a24000f0b2000410f360200200241d0096a24000f0b20024188016a20011057200229038801a7450d022002290390012207422088a721012007a7210a4102210b0c010b200241003a00f008200241f0086a2004200341004722051084041a20032005490d7f200141046a200320056b3602002001200420056a3602002003450d0120022d00f00821034103210b410021010b200020063b000a200020033a000920004104360200200041286a20043a0000200041206a2009370200200041186a2007370200200041146a2001360200200041106a200a3602002000410c6a2005360200200041086a200b3a0000200041306a20022903f008370300200041386a200241f0086a41086a290300370300200041c0006a200241f0086a41106a290300370300200041c8006a200241f0086a41186a290300370300200041d0006a200241f0086a41206a290300370300200041d8006a200241f0086a41286a290300370300200241d0096a24000f0b2000410f360200200241d0096a24000f0b20022f00f10820022d00f30841107472210520024184096a29020021092002418c096a2902002107200241fc086a290200210820022902f408210c0b200020043602042000410e360200200041246a20073702002000411c6a2009370200200041146a20083702002000410c6a200c3702002000412c6a20022902f008370200200041086a2005410874200141ff017172360200200041346a200241f0086a41086a2902003702002000413c6a20024180096a290200370200200041c4006a20024188096a290200370200200041cc006a20024190096a290200370200200041d4006a20024198096a290200370200200041dc006a200241a0096a280200360200200241d0096a24000f0b200241c8056a200110bc0120022802c805450d0420022802cc052204410876210141052105420021080c030b200241b8056a200110bc0120022802b805450d0320022802bc052104200241a0056a200110ba0120022903a005a7450d03200241b0056a290300210720022903a805210920024190056a20011057200229039005a7450d03200229039805210820024188056a200110bc01200228028805450d03200228028c052101200241a0086a20073703002002200937039808200220013602900820044108762101410321050c020b200241c0056a200110bc0120022802c005450d0220022802c4052204410876210141042105420021080c010b200241f0046a200110ba0120022903f004a7450d0120024180056a2903002107200220022903f804370390082002200737039808410221050b200241f0086a41106a220620024190086a41106a290300220c370300200241f0086a41086a220320024190086a41086a290300220d370300200241b0076a41086a220a200d370300200241b0076a41106a220b200c3703002002200229039008220c3703b0072002200c3703f008200041386a2007370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410c360200200041286a2008370200200041106a20022903b007370200200041186a200a290300370200200041206a200b290300370200200041c0006a20022903f008370300200041c8006a2003290300370300200041d0006a2006290300370300200041d8006a200241f0086a41186a290300370300200241d0096a24000f0b200241f0086a41106a20024190086a41106a290300370300200241f0086a41086a20024190086a41086a29030037030020022002290390083703f0082000410f360200200241d0096a24000f0b20024190086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a20024190086a200420051084041a200141046a200320056b22063602002001200420056a22043602002003411f4d0d612002419f086a2900002107200229009708210920022d00af08211120022900a7082108200228009308210320022f009108210e20022d009008210a200241003a00f008200241f0086a2004200641004722051084041a20062005490d8201200141046a200620056b220b3602002001200420056a22053602002006450d614100210641002104024020022d00f0082210450d0020104101470d6220024190086a200b4120200b4120491b22046a41004100412020046b2004411f4b1b1083041a20024190086a200520041084041a200141046a200b20046b3602002001200520046a360200200b411f4d0d6220024190086a41016a2f0000210120024190086a41036a280000210420024190086a411f6a2d0000210520024190086a41176a290000210c20024190086a41076a290000210d20022d009008210b200241f0086a410f6a20024190086a410f6a290000370000200241f0086a41076a200d370000200241f0086a41176a200c370000200241f0086a411f6a20053a0000200241f0086a41036a2004360000200241f0086a41016a20013b000020024188076a41086a200241f7086a220141086a29000037030020024188076a41106a200141106a29000037030020024188076a41186a200141186a2d00003a00002002200b3a00f008200220043600ab07200220022800f0083602a807200220012900003703880741800221040b200241f7066a20024188076a41086a290300370000200241ff066a20024188076a41106a29030037000020024187076a20024188076a41186a2d00003a0000200220022800ab073600eb06200220022802a8073602e80620022002290388073700ef06200241c8066a41086a200241f6066a290100370300200241c8066a41106a200241fe066a290100370300200241c8066a41186a200241e8066a411e6a2f01003b0100200241c8066a411e6a200241f4086a2f01003b0100200220022901ee063703c806200220022801f0083601e20620022801ea06210520022f01e8062112410521140ca3010b200241a0046a2001105720022903a004a7450d0720022903a8042107410521010c040b200241f0086a200110bb0120022d00f00822054102460d5f20022d00f308210620022f00f10821032002418c096a290200210c20024184096a2902002108200241fc086a290200210720022902f408210920024180066a200110ba01200229038006a7450d5f20024180066a41106a290300210d200229038806210f200241f0056a2001105720022903f005a7450d5f20022903f8052118200241e8056a200110bc0120022802e805450d5f20022802ec052204417f4c0d702004450d5b20041076220b450d9301200b2001280200200141046a2211280200220a2004200a2004491b220a1084041a2011280200220e200a490d94012011200e200a6b36020020012001280200200a6a360200200a2004470d5c0ca0010b200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b3602002001200420056a3602002003411f4d0d0520024190086a41186a2201200241f0086a41186a29000037030020024190086a41106a2204200241f0086a41106a29000037030020024190086a41086a2205200241f0086a41086a290000370300200220022900f00837039008200241b0076a41106a2004290300370300200241b0076a41086a2005290300370300200241b0076a41186a20012903003703002002200229039008220c3703b007200241bf076a290000210820022900b707210720022f00b107210620022800b307210420022900c707210920022d00cf072105200ca72103410321010c9e010b200241b0066a200110ba0120022903b006a7450d5d200241c0066a290300210c20022903b806210d200241a0066a2001105720022903a006a7450d5d20022903a806210f200241a8086a4200370300200241a0086a420037030020024198086a4200370300200242003703900820024190086a20012802002206200141046a22032802002204412020044120491b22051084041a2003200420056b3602002001200620056a3602002004411f4d0d3c2002419f086a2900002109200229009708210820022d00af08210420022900a7082107200228009308210520022f009108210620022d00900821034101210a0c3d0b20024190046a20011057200229039004a7450d032002290398042107410421010b0c9b010b200241d8056a2001105720022903d805a7450d5a20022903e0052107200241d0056a200110bc0120022802d005450d5a20022802d4052204417f4c0d6b2004450d43200410762203450d870120032001280200200141046a22062802002205200420052004491b22051084041a2006280200220a2005490d88012006200a20056b3602002001200128020020056a36020020052004470d440c99010b200241f0086a2003412020034120491b22056a41004100412020056b2005411f4b1b1083041a200241f0086a200420051084041a200141046a200320056b220a3602002001200420056a220b3602002003411f4d0d0020024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a29000037030020024190086a41086a200241f0086a41086a290000370300200220022900f008370390082002419f086a2900002108200229009708210720022d00af08210520022900a7082109200228009308210420022f009108210620022d0090082103200241003a00f008200241f0086a200b200a41004722111084041a200a2011490d7b200141046a200a20116b3602002001200b20116a360200200a450d0020022d00f0082111410221010c99010b2000410f360200200241d0096a24000f0b200241206a200110bc012002280220450d5220022802242205417f4c0d682005450d38200510762204450d7e20042001280200200141046a22032802002206200520062005491b22061084041a2003280200220a2006490d7f2003200a20066b3602002001200128020020066a36020020062005470d390c95010b200241186a200110bc012002280218450d51200228021c2205417f4c0d672005450d39200510762204450d7f20042001280200200141046a22032802002206200520062005491b22061084041a2003280200220a2006490d80012003200a20066b3602002001200128020020066a36020020062005470d3a0c93010b200242003703f008200241f0086a200a2003410820034108491b22041084041a41042106200141046a200320046b3602002001200a20046a360200200341074d0d5020022903f00821070c9b010b200241386a200110bc012002280238450d4f200228023c2215ad42187e2207422088a70d652007a72205417f4c0d652005450d3b2005102222040d3c200541041023000b200241f0086a200110be0120022802f0082204450d4e20022902f4082107410721060c99010b200241c0036a200110bc0120022802c003450d3020022802c4032204410876210a4105210b0c090b20024180046a20011057200229038004a7450d2f200229038804220942208821072009a722054108762103410a210b0c0a0b200241b0036a200110bc0120022802b003450d2e20022802b4032104200241f0086a200110bb0120022d00f00822054102460d2e20022d00f308210320022f00f108210a2002418c096a290200210920024184096a2902002108200241fc086a290200210d20022902f4082107200241a8036a200110bc0120022802a803450d2e20022802ac032106200241a0036a200110bc0120022802a003450d2e200a200341107472210320022802a403210b200220083703a0082004410876210a200220093703a8082009422088a7211120022007370390082007422088a721012002200d3703980820022902a4082109200229029c082108200bad210c200da7210e4200210d4103210b0c0b0b200241b8036a200110bc0120022802b803450d2d20022802bc032204410876210a4104210b0c060b200241f0086a200110bb0120022d00f00822044102460d2c20022902f408220942208821074108210b2009a72205410876210320022f00f10820022d00f30841107472210a200241fc086a290200220c422088a7210e20024184096a29020021082002418c096a2902002109200ca721010c020b200241f0086a200110bd0120022802f0082204450d2b20022902f408210720024198036a200110bc012007a72105200228029803450d2a200228029c032101200541087621032004410876210a200742208821074102210b0b0b0c060b200241f0086a200110bb0120022d00f00822044102460d2820022d00f308210520022f00f10821062002418c096a290200210920024184096a2902002108200241fc086a290200210f20022902f4082118200241d0036a200110ba0120022903d003a7450d28200241d0036a41106a290300210d20022903d803210c200241c8036a200110bc0120022802c803450d282006200541107472210a20022802cc032111201842208821072018a722054108762103200f422088a7210e200fa721014106210b0c050b200241e8036a200110bc0120022802e803450d2720022802ec032204410876210a4107210b0b42002107410021030c020b200241f0036a2001105720022903f003a7450d2520022903f803220942208821072009a7220541087621034109210b0b0b0b20004107360200200041c0006a200d370200200041386a200c370200200041346a2006360200200041306a2011360200200041286a2009370200200041206a20083702002000411c6a200e360200200041186a2001360200200041086a200b360200200041c8006a20022903f0083703002000410c6a200a410874200441ff017172360200200041d0006a200241f0086a41086a290300370300200041d8006a200241f0086a41106a290300370300200041106a20074220862003ad42ffffff07834208862005ad42ff01838484370200200241d0096a24000f0b4101210641002004460d86010b2004450d8901200610200c89010b410c210e0c080b200241e8026a200110bc0120022802e802450d1c20022802ec022104200141046a22032802002105200241003a00900820024190086a2001280200220a200541004722061084041a20052006490d6b2003200520066b3602002001200a20066a3602002005450d1c20022d009008210a20022903f0082208422088a72115200241f8086a2903002109200228028c09211320022f018a09210b20022d008909211120022d008809211020022903800921072008a721164104210e0c7c0b200241f0086a2003412020034120491b22046a41004100412020046b2004411f4b1b1083041a200241f0086a200520041084041a200141046a200320046b3602002001200520046a3602002003411f4d0d1b20024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a29000037030020024190086a41086a200241f0086a41086a290000370300200220022900f008370390082002290097082208422088a721152002419f086a290000210920022d00af08211020022900a7082107200228009308210420022f009108211220022d009008210a2008a72116410a210e0c7b0b200241d8026a200110bc0120022802d802450d1a4102210e420021094100211520022802dc0221040c040b200241e0026a200110bc0120022802e002450d1920022802e4022104200141046a22032802002105200241003a00f008200241f0086a2001280200220a200541004722061084041a20052006490d692003200520066b3602002001200a20066a3602002005450d1920022d00f008210a4103210e42002109410021150c790b20024180036a20011057200229038003a7450d182002290388032107200241f8026a200110bc0120022802f802450d1820022802fc0221042007422088a721152007a721164107210e0c020b200241f0086a200110b90120022802f008210520024190086a200241f0086a41047241dc001084041a2005410f460d17200241b0076a20024190086a41dc001084041a41e00010222204450d6b20042005360200200441046a200241b0076a41dc001084041a200141046a220a2802002105200241003a00f008200241f0086a2001280200220b200541004722061084041a20052006490d6c200a200520066b22033602002001200b20066a22063602002005450d1620022d00f008220a41034f0d16200242003703f008200241f0086a20062003410820034108491b22051084041a200141046a200320056b3602002001200620056a360200200341074d0d1620022903f0082207422088a721152007a721164105210e0c770b200241f0026a200110bc0120022802f002450d164106210e420021094100211520022802f4022104410021160b0b0c740b200241f0086a2003412020034120491b22046a41004100412020046b2004411f4b1b1083041a200241f0086a200520041084041a200141046a200320046b22063602002001200520046a22043602002003411f4d0d1320024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a29000037030020024190086a41086a200241f0086a41086a290000370300200220022900f00837039008200229009708210720022d009008210a20022f009108210b200228009308210520022d00af08210320022900a7082109200241b0076a410f6a20024190086a410f6a290000220837000020024188076a41086a200837030020024188076a41106a200937030020024188076a41186a20033a0000200220053600b3072002200b3b00b1072002200a3a00b007200220073700b707200220033a00cf07200220093700c707200220053600ab072002200737038807200220022802b0073602a807200241003a00f008200241f0086a2004200641004722051084041a20062005490d69200141046a200620056b3602002001200420056a3602002006450d1320022d00f00821112002290388072208422088a7211520024190076a290300210920022d00a0072110200229039807210720022800ab07210420022f00a907211220022d00a807210a2008a72116410b210e0c730b200241f0086a2003412020034120491b22046a41004100412020046b2004411f4b1b1083041a200241f0086a200520041084041a200141046a200320046b3602002001200520046a3602002003411f4d0d1220024190086a41186a200241f0086a41186a29000037030020024190086a41106a200241f0086a41106a2900003703004108210e20024190086a41086a200241f0086a41086a290000370300200220022900f008370390082002290097082208422088a721152002419f086a290000210920022d00af08211020022900a7082107200228009308210420022f009108211220022d009008210a2008a721160c720b200241b8026a200110bc0120022802b802450d6f20022802bc022219ad2207421b88a70d462007420586a72205417f4c0d462005450d202005102222040d21200541011023000b200241a8026a200110bc0120022802a802450d6e20022802ac022204410876210e410c21030c090b200241f8016a200110bc0120022802f801450d6d20022802fc01210b200241e0016a200110ba0120022903e001a7450d6d200241f0016a290300210920022903e8012108410521034100210e0c260b200241003a00f008200241f0086a2010200a41004722041084041a200a2004490d55200141046a200a20046b3602002001201020046a360200200a450d6c20022d00f0082106410d21030c040b20024188026a20011057200229038802a7450d6b2002290390022108410a21030c0a0b200241b0016a200110ba0120022903b001a7450d6a200241c0016a290300210920022903b801210820024199076a290000210d200229009107210c200229008907210741022103410021114100210e0c220b200241c8016a200110ba0120022903c801a7450d69200241d8016a290300210920022903d0012108200241c8076a290300210d20022903c007210c20022903b807210720022802b407211120022802b007210b410321034100210e0c220b200241003a00f008200241f0086a2010200a41004722041084041a200a2004490d52200141046a200a20046b3602002001201020046a360200200a450d6820022d00f008220641034f0d68410821030b420021094100210e0c210b20024180026a200110bc01200228028002450d662002280284022212ad42247e2207422088a70d3d2007a72205417f4c0d3d2005450d192005102222040d1a200541041023000b200241b0026a200110bc0120022802b002450d6520022802b4022204410876210e410e21030b420021090c010b410721030b0c190b20024198026a20011057200229039802a7450d6120022903a0022108410b21030b4100210e0c160b200241f0086a200110bb0120022d00f00822044102460d5f20022f00f10820022d00f30841107472210e20024184096a290200220c422088a721112002418c096a2902002107200241fc086a290200210920022902f4082108200ca7210b4200210c410921034200210d0c180b2004109201200410200b2000410f360200200241d0096a24000f0b2005450d00200410200b2000410f360200200241d0096a24000f0b4100210a0b200241bf076a2009370000200220083700b707200220043a00cf07200220053600b307200220063b00b107200220033a00b007200220073700c707200a450d1f200241b8076a290300210920022802cc07210b20022903c007211820022903b007210820024198066a200110bc01200228029806450d1f200228029c062204417f4c0d302004450d1d200410762205450d5520052001280200200141046a22032802002206200420062004491b22061084041a2003280200220a2006490d562003200a20066b3602002001200128020020066a36020020062004470d1e0c5a0b4101210441002005460d5c0b20050d170c180b4101210441002005460d590b20050d150c160b4101210441002005460d5f0b20050d130c140b410421040b024002402015450d004200210741002111410021054100210a201521120340200241306a200110bc012002280230450d1320022802342203417f4c0d2b024002402003450d0020031076220e450d38200e2001280200200141046a220b2802002206200320062003491b22061084041a200b28020022102006490d39200b201020066b3602002001200128020020066a36020020062003460d010c140b4101210e41002003470d130b200241286a200110bc012002280228450d12200228022c2206417f4c0d2b024002402006450d00200610762210450d3420102001280200200141046a2213280200220b2006200b2006491b220b1084041a20132802002216200b490d3520132016200b6b36020020012001280200200b6a360200200b2006460d010c130b4101211041002006470d120b200a41016a210b0240200a2012470d002011200b200b2011491b2212ad42187e2209422088a70d2d2009a722134100480d2d0240200a450d00200420052013102122040d010c320b201310222204450d310b200420056a220a200e360200200a41146a2006360200200a41106a2006360200200a410c6a2010360200200a41046a2003ad220942208620098437020020074280808080107c2107201141026a2111200541186a2105200b210a200b2015490d000c020b0b41002112420021070b2004450d1220072012ad842107410621060c5d0b4101210341002004460d550b2004450d15200310200c150b410121040b024002402019450d00200241f0086a41186a210e200241f0086a41106a2110200241f0086a41086a2112200141046a211120024190086a410f6a211a20024190086a41176a211b420021074100210b4100210a410021032019211c0340200e42003703002010420037030020124200370300200242003703f008200241f0086a2001280200221320112802002205412020054120491b22061084041a2011200520066b3602002001201320066a3602002005411f4d0d0b200341016a210620024190086a41186a200e29030037030020024190086a41106a201029030037030020024190086a41086a2012290300370300200220022903f00837039008201a290000210920024190086a411f6a2d00002113201b2900002108200229009708210c200228009308211520022f009108211620022d009008211402402003201c470d00200b20062006200b491b221cad420586220d422088a70d29200da722054100480d2902402003450d002004200a2005102122040d010c2c0b200510222204450d2b0b2004200a6a220520143a00002005410f6a2009370000200541076a200c3700002005411f6a20133a0000200541176a2008370000200541036a2015360000200541016a20163b000020074280808080107c2107200b41026a210b200a41206a210a2006210320062019490d000c020b0b4100211c420021070b2004450d4d2007201cad8421082004410876210e410f21030c020b410421040b024002402012450d0042002107200241f0086a411c6a2113200241f0086a41146a2115200241f0086a410c6a21164100210a4100210341002105201221100340200241f0086a200110bb0120022d00f008220b4102460d0a200541016a210620022d00f308211120022f00f108210e20132902002109201529020021082016290200210c20022902f408210d024020052010470d00200a20062006200a491b2210ad42247e220f422088a70d27200fa722144100480d2702402005450d00200420032014102122040d010c2b0b201410222204450d2a0b200420036a2205200b3a0000200541036a200e201141107472220b4110763a0000200541016a200b3b00002005411c6a2009370000200541146a20083700002005410c6a200c370000200541046a200d37000020074280808080107c2107200a41026a210a200341246a21032006210520062012490d000c020b0b41002110420021070b2004450d4b20072010ad8421082004410876210e410621030b0b0b0b0b0b200020063a000920004105360200200041386a200d370000200041306a200c370000200041186a2009370000200041106a2008370000200041286a2007370000200041246a2011360000200041206a200b360000200041086a20033a0000200041c0006a20022903f0083703002000410c6a200e410874200441ff017172360000200041c8006a200241f0086a41086a290300370300200041d0006a200241f0086a41106a290300370300200041d8006a200241f0086a41186a290300370300200241d0096a24000f0b201c450d440c430b20100d420c430b2006450d00201010200b2003450d00200e10200b0240200a450d002004210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141186a2101200541686a22050d000b0b2012450d010b200410200b2000410f360200200241d0096a24000f0b4101210b41002004460d440b2004450d02200b10200c020b4101210541002004460d3c0b2004450d00200510200b20024190086a41186a200241c8066a41186a29030037030020024190086a41106a200241c8066a41106a29030037030020024190086a41086a200241c8066a41086a290300370300200220022903c806370390082000410f360200200241d0096a24000f0b20052004102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b20042006102d000b1031000b1024000b20052003102d000b200541011023000b201441041023000b201341041023000b41e00041081023000b200641011023000b200b2016102d000b200441011023000b2005200a102d000b200341011023000b20062010102d000b41e00041081023000b20052004102d000b41e00041081023000b20052006102d000b2011200a102d000b2004200a102d000b2004200a102d000b200541011023000b2006200a102d000b200541011023000b2006200a102d000b200541011023000b2006200a102d000b20062005102d000b20062005102d000b200441011023000b2005200a102d000b41e00041081023000b41e00041081023000b20062005102d000b20052006102d000b20062005102d000b200441011023000b200a200e102d000b200441011023000b2006200a102d000b2003200a102d000b200410200b2000410f360200200241d0096a24000f0b200241c8066a41106a200c37030020022007421888a73b018a0920022007421088a73a00890920022007420888a73a008809200220183703800920022009423888a73a00ff082002200d3703d0062002200842388820094208868422093700f70820022008421888a722033600f3082002200f3703e00620022008a7220a3b01f0082002200a4110763a00f20820022004ad22074220862007843703c8062002200b36028c09200b4118762111200a4180feff0771410876210e200229008709210820022900ff082107410421144100210441002106410021100c060b2000200b3b012a200020113a0029200020123b000a2000200a3a0009200041063602002000412c6a2013360200200041286a20103a0000200041206a2007370200200041186a2009370200200041146a2015360200200041106a20163602002000410c6a2004360200200041086a200e3a0000200041306a20022903f008370300200041386a200241f0086a41086a290300370300200041c0006a200241f0086a41106a290300370300200041c8006a200241f0086a41186a290300370300200041d0006a200241f0086a41206a290300370300200041d8006a200241f0086a41286a290300370300200241d0096a24000f0b2005ad22074220862007842107410321060c080b2005ad22074220862007842107410521060c070b200241c8066a41186a200241f0086a41186a290300370300200241c8066a41106a200241f0086a41106a290300370300200241c8066a41086a200241f0086a41086a290300370300200220022903f0083703c8062004ad22094220862009842109410221144100211241002104410021060c020b2000200b3b012a200020113a0029200020063b000a200020033a0009200041083602002000412c6a200a360200200041286a20053a0000200041206a2009370200200041186a2008370200200041146a20074220883e0200200041106a20073e02002000410c6a2004360200200041086a20013a0000200041306a20022903f008370300200041386a200241f0086a41086a290300370300200041c0006a200241f0086a41106a290300370300200041c8006a200241f0086a41186a290300370300200041d0006a200241f0086a41206a290300370300200041d8006a200241f0086a41286a290300370300200241d0096a24000f0b200241e0066a200d3703002002200f3703d8062002200b3602c80620022004ad220d422086200d843702cc06200ca722114110762112201141807e712104200320064110747241087420057221032018422088a72106200c422088a721052018a7210b410321140b20024190086a41186a200241c8066a41186a290300220c37030020024190086a41106a200241c8066a41106a290300220d37030020024190086a41086a200241c8066a41086a290300220f370300200241f0086a41086a2213200f370300200241f0086a41106a2215200d370300200241f0086a41186a2216200c370300200220022903c806220c3703f0082002200c370390082000412c6a2005360000200041286a201241107420044180fe037172201141ff017172360000200041206a2008370000200041186a2007370000200041106a20093700002000410c6a20033600002000200e3b000a2000200a3a0009200041086a20143a00002000410d360200200041306a20022903f008370000200041386a2013290300370000200041c0006a2015290300370000200041c8006a2016290300370000200041dc006a20013a0000200041d8006a2010360000200041d0006a2006ad422086200bad84370000200241d0096a24000f0b2006450d03200020063602042000410b360200200041086a2004ad2207422086200784370200200041106a200241f0086a41d0001084041a200241d0096a24000f0b2000410f360200200241d0096a24000f0b2005ad22074220862007842107410121060b20004101360200200041106a20073702002000410c6a2004360200200041086a2006360200200041186a200241f0086a41c8001084041a200241d0096a24000f0b2000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000bd00605057f017e017f027e037f230041306b22022400200241003a0018200241186a200128020022032001280204220441004722051084041a0240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d000240024020022d0018220341037122044102460d00024020044101460d0020040d022003410276ad21070c080b200241003a0018200241186a2005200641004722041084041a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d001841087420037241fcff0371410276ad21070c070b200241003a002e200241003b012c2002412c6a200520064103200641034922081b22041084041a200141046a200620046b3602002001200520046a36020020080d0120022f012c20022d002e41107472410874200372410276ad21070c060b0240024020034102762204410c460d00024020044104460d0020040d0220024100360218200241186a200520064104200641044922031b22041084041a200141046a200620046b3602002001200520046a36020020030d03200235021821070c080b4200210a20024200370318200241186a200520064108200641084922031b22041084041a200141046a200620046b3602002001200520046a36020020030d03200229031821070c070b4200210a2002420037032020024200370318200241186a200520064110200641104922031b22041084041a200141046a200620046b3602002001200520046a36020020030d02200241206a2903002109200229031821074201210a0c070b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0018200241186a2005200641004722041084041a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100184200200341037441f80071108904200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c070b0b4200210a0b0c040b20052004102d000b20042006102d000b20042006102d000b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b870801067f230041f0006b22022400200241003a0050200241d0006a200128020022032001280204220441004722051084041a02400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0020022d0050220441ef014b0d010c030b200041023a0000200241f0006a24000f0b02400240024002400240200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b22041084041a200141046a200620046b3602002001200520046a360200200641014d0d0420022f0150220441ef014b0d09200041023a0000200241f0006a24000f0b20024100360250200241d0006a20052006410420064104491b22041084041a200141046a200620046b3602002001200520046a360200200641034d0d04410121012002280250220441ffff034b0d09200041023a0000200241f0006a24000f0b200041023a0000200141046a20062006410420064104491b22006b3602002001200520006a360200200241f0006a24000f0b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b1083041a200241d0006a200520041084041a200141046a200620046b3602002001200520046a3602002006411f4d0d032002412c6a41026a200241d0006a41026a2d00003a0000200241186a200241df006a290000370300200241206a200241e7006a290000370300200241286a200241d0006a411f6a2d00003a0000200220022f00503b012c2002200229005737031020022800532104410121030c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2205200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402003450d002002410c6a41026a20012d00003a0000200241d0006a41086a2005290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c030b200041023a0000200241f0006a24000f0b20052004102d000b410121010b200020022f010c3b0001200020013a0000200041046a2004360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000bca0301077f230041106b22022400200241003a0003200241036a200128020022032001280204220441004722051084041a0240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d000240024020022d0003220341037122044102460d00024020044101460d0020040d0220034102762101410121040c050b200241003a000b2002410b6a2005200641004722041084041a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d000b4108742003724102762101410121040c040b41002104200241003a000e200241003b010c2002410c6a200520064103200641034922071b22081084041a200141046a200620086b3602002001200520086a36020020070d0320022f010c20022d000e411074724108742003724102762101410121040c030b200341034b0d004100210420024100360204200241046a200520064104200641044922081b22031084041a200141046a200620036b3602002001200520036a36020020080d0120022802042101410121040c020b410021040b0b2000200136020420002004360200200241106a24000f0b20052004102d000b20042006102d000b8303010a7f230041106b220224002002200110bc010240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d01200310222204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b1084041a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008102122040d010c090b200810222204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d00200410200b200241106a24000f0b200b2009102d000b1024000b200841011023000b1031000b200341011023000bdb0403027f017e0a7f230041106b22022400200241086a200110bc010240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d01200510222206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210d4100210a0c020b200541041023000b4100210741002108410021092003210a03402002200110bc0102400240024002402002280200450d0020022802042205417f4c0d08024002402005450d0020051076220b450d03200b2001280200200141046a220c280200220d2005200d2005491b220d1084041a200c280200220e200d490d04200c200e200d6b36020020012001280200200d6a360200200d2005470d010c050b4101210b41002005460d040b2005450d00200b10200b2000410036020002402009450d002006210503400240200541046a280200450d00200528020010200b2005410c6a2105200841746a22080d000b0b0240200a450d00200610200b200241106a24000f0b200541011023000b200d200e102d000b200941016a210d02402009200a470d002007200d200d2007491b220aad420c7e2204422088a70d032004a7220c4100480d0302402009450d0020062008200c102122060d010c050b200c10222206450d040b200620086a2209200b360200200941046a2005ad2204422086200484370200200741026a21072008410c6a2108200d2109200d2003490d000b0b2000200a36020420002006360200200041086a200d360200200241106a24000f0b1024000b200c41041023000b1031000bb00b03057f047e017f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012d00002203450d0020034101470d02200041003a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a29000037000020030d014101450d0f0c0e0b2002412b6a2001410c6a280000360000200041013a00002002200141046a29000037002320002002290020370001200041086a200241276a2900003700002003450d020b20034101460d0d20030d05200141086a280200450d0d200141046a2802001020200241c0006a24000f0b20034104470d0720022001410c6a28020022043602142002200141046a2802002205360210200241003a0020200241206a2005200441004722061084041a20042006490d052002200420066b22033602142002200520066a22063602102004450d0720022d002022044102460d0220044101460d0120040d07200241003a0020200241206a2006200341004722041084041a20032004490d082002200320046b22053602142002200620046a22063602102003450d0620022d00200d0641002103200241206a2005412020054120491b22046a41004100412020046b2004411f4b1b1083041a200241206a200620041084041a2002200520046b3602142002200620046a3602102005411f4d0d062002411c6a41026a2206200241206a41026a22052d00003a0000200220022f00203b011c20022800232104200229002f210720022900372108200231003f21092002290027210a200520062d000022063a00002002410c6a41026a20063a0000200220022f011c22063b010c200220063b0120200a422088a72106200aa721050c030b41000d0a0c0b0b200241003a0020200241206a2006200341004722041084041a20032004490d072002200320046b3602142002200620046a3602102003450d0520022d00200d05200241206a200241106a10c00120022802202204450d05200229022421072002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c2007422088a721062007a72105410121030c010b200241003a0020200241206a2006200341004722051084041a20032005490d072002200320056b22043602142002200620056a22063602102003450d040240024020022d002022034101460d0020030d0620024200370320200241206a20062004410820044108491b22031084041a2002200420036b3602142002200620036a360210200441074d0d0620022903202108200241206a200241106a10c10120022802202206450d0620022902242107410021050c010b20024200370320200241206a20062004410820044108491b22051084041a2002200420056b22033602142002200620056a2206360210200441074d0d052002290320210820024200370320200241206a20062003410820034108491b22041084041a2002200320046b3602142002200620046a360210200341074d0d0520022903202109200241206a200241106a10c10120022802202206450d0520022902242107410121050b410221032002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c0b200241206a41026a220b2002410c6a41026a2d00003a0000200220022f010c3b0120200020033a0000200041206a2009370000200041186a2008370000200041106a2007370000200041086a2006ad4220862005ad84370000200041046a2004360000200020022f01203b0001200041036a200b2d00003a00000b200141086a280200450d07200141046a28020010200c070b20062004102d000b200241206a41026a2002411c6a41026a2d00003a0000200220022f001c3b01200b41d0a3c000411e1039000b20042003102d000b20042003102d000b20052003102d000b200141086a280200450d00200141046a2802001020200241c0006a24000f0b200241c0006a24000bd80403027f017e0e7f230041d0006b22022400200241086a200110bc0102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210e0c030b1031000b200541011023000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a2802002205412020054120491b22101084041a200a200520106b3602002001200f20106a3602002005411f4d0d02200d41016a2105200241106a41186a22102007290300370300200241106a41106a220f2008290300370300200241106a41086a22112009290300370300200220022903303703100240200d200e470d00200b20052005200b491b220ead4205862204422088a70d042004a722124100480d040240200d450d002006200c2012102122060d010c060b201210222206450d050b2006200c6a220d2002290310370000200d41186a2010290300370000200d41106a200f290300370000200d41086a2011290300370000200b41026a210b200c41206a210c2005210d20052003490d000b0b2000200e36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200e450d00200610200b200241d0006a24000f0b1024000b201241011023000bd10504027f017e0f7f017e230041d0006b22022400200241086a200110bc010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b410021114100210e0c030b1031000b200541081023000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a28020022054120200541204922101b22111084041a200a200520116b22053602002001200f20116a221136020020100d01200241106a41186a22102007290300370300200241106a41106a22122008290300370300200241106a41086a221320092903003703002002200229033037031020024200370330200241306a20112005410820054108491b220f1084041a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903302104200720102903003703002008201229030037030020092013290300370300200220022903103703300240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005102122060d010c060b200510222206450d050b2006200c6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a2009290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d00200610200b200241d0006a24000f0b2000200e36020420002006360200200041086a2011360200200241d0006a24000f0b1024000b200541081023000b0a0041f0a2c000102f000b3802017f017e230041106b220324002003200210c401200329030021042000200341086a29030037030820002004370300200341106a24000b9a0304027f017e027f017e230041c0006b2202240002400240411410222203450d00200341106a41002800a5ef40360000200341086a410029009def4037000020034100290095ef4037000020034114413410212203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034134200241206a1000200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a2903002107200229032021040c010b420021070b200310202000200737030820002004370300200241c0006a24000f0b419a88c00041331039000b411441011023000b413441011023000bfb0101057f230041c0006b22052400024002402003450d002003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1000200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a100a210420052802202203417f460d012000200336020420002004360200200041086a2003360200200541c0006a24000f0b20004100360200200541c0006a24000f0b20004100360200200541c0006a24000b8c0201027f23004180016b220324002003200210c701024020032d000022024102470d00200041003a000020034180016a24000f0b200341e0006a200341386a290300370300200341e8006a200341c0006a290300370300200341f0006a200341c8006a290300370300200341f8006a200341d0006a2802003602002003200341306a29030037035802402002450d00200041003a000020034180016a24000f0b2003412c6a2802002102200341286a28020021042000200329025c370001200041013a0000200041196a200341f4006a290200370000200041116a200341ec006a290200370000200041096a200341e4006a29020037000002402002450d00200410200b20034180016a24000bed0c04077f047e027f047e230041f0006b220224000240024002400240411710222203450d002003410f6a41002900cfe342370000200341086a41002900c8e342370000200341002900c0e34237000020034117413710212203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241386a41186a22014200370300200241386a41106a22044200370300200241386a41086a220542003703002002420037033820034137200241386a1000200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033837030802400240024002400240024002400240200241086a412041c8d7c400410041001001417f460d002002422037022c2002200241086a360228200241003a0038200241086a4120200241386a410141001001210120022002280230200141016a41014b22016a22043602302001450d0720022d003822014101460d0120010d072002200241286a108e012002280200450d0720022802042201417f4c0d0a2001450d02200110762206450d0b200241306a22072001410020022802282204200228022c2205200620012007280200100122082008417f461b2208200820014b1b220820072802006a220736020020082001460d030c060b200041023a00000c040b42002109200241d0006a4200370300200241c8006a4200370300200241386a41086a42003703002002420037033841002105200241286a41086a22064100200241086a4120200241386a41202004100122012001417f461b2201412020014120491b20062802006a360200024002402001411f4d0d002002200228003b36006b20022002280238360268200241cf006a290000210a2002290047210b200229003f210c200231005721092002200228006b36006320022002280268360260410121050c010b0b2002200228006336003b200220022802603602382005450d052002200228003b36005b200220022802383602582002200228005b36006b2002200228025836026820022002413b6a28000036006320022002280038360260410121010c020b4101210620022802282204200228022c220541014100200241306a280200220710011a41002001470d030b20024200370338200241286a41086a220d410020042005200241386a41082007100122082008417f461b2208410820084108491b20076a2207360200200841074d0d022002290338210c200241d0006a4200370300200241c8006a4200370300200241386a41086a420037030020024200370338200d410020042005200241386a41202007100122082008417f461b2208412020084120491b20076a220e360200024002402008411f4d0d002002200228003b36006b20022002280238360268200241cf006a290000210f20022900472110200229003f211120022d005721072002200228006b36006320022002280268360260410121080c010b410021080b2002200228006336003b200220022802603602382008450d022002200228003b36005b200220022802383602582002420037034020024200370338200241286a41086a220d410020042005200241386a4110200e100122082008417f461b2208411020084110491b200e6a220e3602002008410f4d0d02200241386a41086a290300210a2002290338210b20024200370338200d410020042005200241386a4108200e100122042004417f461b2204410820044108491b200e6a360200200441074d0d022001ad22094220862009842112200229033821092002200228005b3600632002200228025836026020022002413b6a28000036006b20022002280038360268410021010b2002200228006b36003b20022002280268360238200220022802603602582002200228006336005b200041186a200a370000200041106a200b370000200041cb006a200f370000200041c3006a2010370000200020013a00002000412c6a2012370000200041286a2006360000200041206a2009370000200041086a200c370000200041d3006a20073a00002000413b6a201137000020002002280238360001200041046a200228003b360000200041346a2002280258360000200041376a200228005b3600000b20031020200241f0006a24000f0b2001450d00200610200b419a88c00041331039000b411741011023000b413741011023000b1031000b200141011023000baf0201047f230041c0006b2202240002400240411710222203450d002003410f6a41002900cfe342370000200341086a41002900c8e342370000200341002900c0e34237000020034117413710212203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041c8d7c400410041001001210120031020200241c0006a24002001417f470f0b411741011023000b413741011023000b870102017f037e230041e0006b22032400200341086a200210c7010240024020032d000822024102470d00420021040c010b2002410173ad2104200341206a2903002105200341186a290300210620020d00200341346a280200450d00200341306a28020010200b2000200637030820002004370300200041106a2005370300200341e0006a24000bf4220a067f017e187f067e067f027e027f027e047f017e230041d0046b22022400200241286a4200370300200242003703202002420037031820012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b200241206a2107200241306a411c6a20042f0106360200200241306a41186a4100360200200241306a41146a2004360200200220033602502002410036024020024200370338200220013602342002410036023020024198016a200241306a103302400240024020022903b80122084202520d00200241306a10540c010b200241cc016a210920024198016a412c6a210a20024198016a410472210b200241f5016a210c20024198016a41086a2103200241f8026a412c6a210d200241c8016a210e20024198016a41286a210f200241e0016a211020024198016a41c0006a2111200241d0016a211220024198016a41d0006a2113200241f0016a2114200241f4016a211520024198016a411c6a211620024198016a41146a2117200241c8036a41206a2218410f41e8e2c2006b41f0e2c2006a200241c8036a6b6a2119200241f8026a41246a211a200241e4016a211b200241ec016a211c0340200241f8006a41186a220420024198016a41186a221d290300370300200241f8006a41106a220120024198016a41106a221e290300370300200241f8006a41086a22052003290300370300200241d8006a41086a2206200c41086a290000370300200241d8006a41106a221f200c41106a290000370300200241d8006a41186a2220200c41186a29000037030020022002290398013703782002200c290000370358200e2903002121200f2903002122201029030021232011290300212420122903002125201329030021262014280200212720152d0000212820024198026a41186a2229200429030037030020024198026a41106a222a200129030037030020024198026a41086a220120052903003703002002200229037837039802200241b8026a41186a22042020290300370300200241b8026a41106a2205201f290300370300200241b8026a41086a221f2006290300370300200220022903583703b80202400240024002400240024020084201520d0020024198016a20024198026a2022202110cb01201d2d0000210620022002290318200241186a41086a2220290300200241186a41106a222b2903002002290398012003290300201e29030010cc01202b200241106a290300370300202020022903083703002002200229030037031820060d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020270d0020254201510d00202841ff01714101460d002026a721042026422088a72201450d01410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c030b0b20024198016a20024198026a10c70120022d00980122064103714102460d0220064101470d0320060d13200a280200450d13200f28020010202026a721042026422088a722010d140c150b200421010b20024198016a41206a4100360200201620042f0106360200201d410036020020172004360200201e4100360200200342003703002002200136029c01200241003602980120024198016a10420c150b2006450d014100212b202841ff01710d030c100b200241d8026a41086a2206200941086a290200370300200241d8026a41106a2220200941106a290200370300200241d8026a41186a222c200941186a290200370300200220092902003703d802201d290300212d201e290300212e200e280200212f200a280200213020024198016a41206a290300213120032903002132201c2802002133200f280200222b450d01202f417f4c0d0b202f450d03202f102222010d040c0c0b0240200a280200450d00200f28020010200b4100212b0b202841ff0171450d0d0b200241b0046a41186a222c2004290300370300200241b0046a41106a22342005290300370300200241b0046a41086a2235201f290300370300200220022903b8023703b00442002121200241c8036a41086a22064200370300200242003703c80341dcdac200411a200241c8036a100220032006290300370300200220022903c8033703980142002108024020024198016a411041c8d7c400410041001001417f460d00200242003703c80320024198016a4110200241c8036a41084100100141016a41084d0d0320022903c80321080b20064200370300200242003703c80341c5dac2004117200241c8036a100220032006290300370300200220022903c80337039801024020024198016a411041c8d7c400410041001001417f460d00200242003703c80320024198016a4110200241c8036a41084100100141016a41084d0d0420022903c80321210b20064200370300200242003703c80341c5dac2004117200241c8036a100220032006290300370300200220022903c80337039801200220213703c80320024198016a4110200241c8036a41081003412010222220450d052020200229039802370000202041186a2029290300370000202041106a202a290300370000202041086a20012903003700002020412041c00010212220450d062020202142017c370020201d4200370300201e42003703002003420037030020024200370398012020412820024198016a1000200241c8036a41186a201d290300370300200241c8036a41106a201e2903003703002006200329030037030020022002290398013703c803413710222201450d07200142bac6a1cbc68dd9aff300370000200142f4dec98bf6ac999de400370008200141e5cc85ab07360010200141ece8013b00142001413a3a0016200120022903c803370017200120022903d00337001f200120022802d803360027200120022f01dc033b002b200120022d00de033a002d200120022d00df033a002e200120022d00e0033a002f200120022d00e1033a0030200120022d00e2033a0031200120022d00e3033a0032200120022d00e4033a0033200120022d00e5033a0034200120022d00e6033a0035200120022d00e7033a0036202010204200212120064200370300200242003703c80341cdc8c000410d200241c8036a100220032006290300370300200220022903c80337039801024020024198016a411041c8d7c400410041001001417f460d00200242003703c80320024198016a4110200241c8036a41084100100141016a41084d0d0520022903c80321210b427f2122200241f8026a41106a427f370300200241f8026a41086a427f370300200241f8026a41286a201936020041372136201a4137360200200241f8026a41206a2001360200200d20022903b004370000200241f8026a41186a2021370300200d41086a2035290300370000200d41106a2034290300370000200d41186a202c290300370000200220083703f80220192120427f213720254201520d0b0c0a0b410121010b2001202b202f1084042129200241f8026a41106a202d370300200241f8026a41086a202e370300200241f8026a41286a202f360200201a202f360200200241f8026a41206a2029360200200241f8026a41186a2031370300200d20022903d802370200200d41086a2006290300370200200d41106a2020290300370200200d41186a202c290300370200200220323703f802202f2136202f212020312121202e2122202d21372032210820254201510d080c090b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b412041011023000b41c00041011023000b413741011023000b1031000b202f41011023000b200241f8026a41106a2023370300200241f8026a41086a202437030020242122202321370b0240202841ff0171450d00200d20022903b802370000200d41186a2004290300370000200d41106a2005290300370000200d41086a201f2903003700000b2026a72104024002402026422088a72205450d00410020056b2206211f20042105034020052802ec032105201f41016a221f0d000b0340200420042f01064102746a41ec036a2802002104200641016a22060d000c020b0b200421050b20042f0106210620182027360200200241c8036a411c6a2006360200200241c8036a41186a222c4100360200200241c8036a41146a2004360200200241c8036a41106a22344100360200200241c8036a41086a22354200370300200220053602cc03200241003602c80320024198016a200241c8036a103202402002280298014101470d000340200241f0036a41186a2206200b41186a290200370300200241f0036a41106a221f200b41106a290200370300200241f0036a41086a2227200b41086a2902003703002002200b2902003703f00320024198016a41246a2802002104200f2802002129200a280200210520024190046a41186a200629030037030020024190046a41106a201f29030037030020024190046a41086a2027290300370300200220022903f00337039004201d4200370300201e420037030020034200370300200242003703980120024190046a412020024198016a1000200241b0046a41186a221f201d290300370300200241b0046a41106a2227201e290300370300200241b0046a41086a2228200329030037030020022002290398013703b004200241003602980120012020200241b0046a412020024198016a100a212a02402002280298012206417f460d0020082006ad7d21082006450d00202a10200b024002402004450d00201d4200370300201e420037030020034200370300200242003703980120024190046a412020024198016a1000201f201d2903003703002027201e2903003703002028200329030037030020022002290398013703b00420012020200241b0046a412020042005100b20082005ad7c21082029450d01200410200c010b201d4200370300201e420037030020034200370300200242003703980120024190046a412020024198016a1000201f201d2903003703002027201e2903003703002028200329030037030020022002290398013703b00420012020200241b0046a4120100c0b20024198016a200241c8036a10322002280298014101460d000b200220083703f8020b200241c8036a1042202c200241d8026a41186a2903003703002034200241d8026a41106a2903003703002035200241d8026a41086a290300370300200220022903d8023703c8030240202b450d00201e202d3703002003202e370300200f202f36020020024198016a41246a203036020020024198016a41206a202b360200201d2031370300200a20022903c803370200201b2033360200200a41086a2035290300370200200a41106a2034290300370200200a41186a202c290300370200200220323703980141012104024002400240202f2020470d00024002402001202b460d00202b2001202f1086040d0220322008520d020c010b20322008520d010b200a200d41201086040d00202e202285202d2037858450450d002031202152210420300d010c020b2030450d010b202b10200b20044102460d0020040d002036450d05200110200c050b2003200241f8026a41d0001084041a200241003a00980120024198026a20024198016a10cd010c040b2026a721042026422088a72201450d010b410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c020b0b200421010b20024198016a41206a2027360200201620042f0106360200201d410036020020172004360200201e4100360200200342003703002002200136029c01200241003602980120024198016a10420b20024198016a200241306a103320024198016a41206a29030022084202520d000b20022903182108200241306a1054024020084200510d00200710ce01200241d0046a24000f0b200241206a290300200241286a2903008450450d010b200710cf01200241d0046a24000f0b41a8b7c000102f000ba30a03057f037e017f23004190016b2204240002400240024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441186a22064200370300200441106a22074200370300200441086a22084200370300200442003703002005413420041000200441f0006a41186a2006290300370300200441f0006a41106a2007290300370300200441f0006a41086a2008290300370300200420042903003703700240024002400240200441f0006a412041c8d7c400410041001001417f460d002004420037030820044200370300200441f0006a412020044110410010012206417f460d022006410f4d0d02200441086a29030021092004290300210a0c010b4200210a420021090b20051020200441086a220542003703002004420037030041a5eec000411b20041002200441f0006a41086a2005290300370300200420042903003703700240200441f0006a411041c8d7c400410041001001417f460d002004420037030820044200370300200441f0006a411020044110410010012205417f460d022005410f4d0d02200a2009844200520d002004290300200258200441086a290300220b200358200b2003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b200441086a220542003703002004420037030041a5eec000411b20041002200441f0006a41086a20052903003703002004200429030037037002400240200441f0006a411041c8d7c400410041001001417f460d002004420037030820044200370300200441f0006a411020044110410010012205417f460d062005410f4d0d062004290300200256200441086a290300220b200356200b2003511b450d0020012002200310af01410121010c010b411410222205450d06200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d07200520012900003700142005412c6a200141186a220c290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441186a22064200370300200441106a22074200370300200441086a22084200370300200442003703002005413420041000200441f0006a41186a2006290300370300200441f0006a41106a2007290300370300200441f0006a41086a200829030037030020042004290300370370200441f0006a412041c8d7c40041004100100121062005102002402006417f470d002001103a200441386a2003370300200441306a2002370300200441086a41003a0000200441096a2001290000370000200441116a200141086a290000370000200441196a200141106a290000370000200441216a200c290000370000200441023a00002004103d0b20012002200310af01410021010b20002002200a7d200a20027d200a2002582009200358200920035122051b22061b370308200020013a00182000200a200256200920035620051bad370300200041106a200320097d2002200a54ad7d200920037d200a200254ad7d20061b37030020044190016a24000f0b419a88c00041331039000b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b411441011023000b413441011023000b9e0a06037f027e017f017e027f017e230041c0006b220724002004a72108024002400240024002400240024002400240024002400240024002400240024020014201520d004101210920084101470d01427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210a427f200120081b210b4100210c4201210d200450450d060c070b4101210c20084101470d012002200556200320065620032006511b450d02200320067d2002200554ad7d210a200220057d210b4200210d4100210c41012109200150450d030c040b200741086a20042005200642012002200310cc01200741186a290300210a2007290310210b2007290308210d0c0a0b427f200320067c200220057c220b2002542208ad7c220a2008200a200354200a2003511b22081b210a427f200b20081b210b4200210d41002109200150450d010c020b200620037d2005200254ad7d210a200520027d210b4201210d4100210c410121092001500d010b200741306a41086a2208420037030020074200370330418feec0004116200741306a1002200741206a41086a220e20082903003703002007200729033037032002400240200741206a411041c8d7c400410041001001417f460d002007420037033820074200370330200741206a4110200741306a411041001001220f417f460d0a200f410f4d0d0a200741386a2903002101200729033021100c010b42002110420021010b2008420037030020074200370330418feec0004116200741306a1002200e20082903003703002007200729033037032020074200200120037d2010200254ad7d2203201020027d2202201056200320015620032001511b22081b37033820074200200220081b370330200741206a4110200741306a411010030b2004500d010b200c450d05200741306a41086a2208420037030020074200370330418feec0004116200741306a1002200741206a41086a220c200829030037030020072007290330370320200741206a411041c8d7c400410041001001417f460d012007420037033820074200370330200741206a4110200741306a4110410010012209417f460d072009410f4d0d07200741386a2903002103200729033021020c020b2009450d04200741306a41086a2208420037030020074200370330418feec0004116200741306a1002200741206a41086a220c200829030037030020072007290330370320200741206a411041c8d7c400410041001001417f460d022007420037033820074200370330200741206a4110200741306a4110410010012209417f460d072009410f4d0d07200741386a2903002103200729033021020c030b42002102420021030b2008420037030020074200370330418feec0004116200741306a1002200c20082903003703002007200729033037032020074200200320067d2002200554ad7d2204200220057d2205200256200420035620042003511b22081b37033820074200200520081b370330200741206a4110200741306a411010030c020b42002102420021030b2008420037030020074200370330418feec0004116200741306a1002200c2008290300370300200720072903303703202007427f200320067c200220057c22052002542208ad7c22022008200220035420022003511b22081b3703382007427f200520081b370330200741206a4110200741306a411010030b2000200b3703082000200d370300200041106a200a370300200741c0006a24000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bd00201047f230041c0006b2202240002400240411710222203450d002003410f6a41002900cfe342370000200341086a41002900c8e342370000200341002900c0e34237000020034117413710212203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1000200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10f20220031020024020012d00000d002001412c6a280200450d00200141286a28020010200b200241c0006a24000f0b411741011023000b413741011023000bc80202047f047e230041206b22012400200141106a41086a2202420037030020014200370310418feec0004116200141106a1002200141086a22032002290300370300200120012903103703000240024002402001411041c8d7c400410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b200041086a2903002107200029030021082002420037030020014200370310418feec0004116200141106a1002200320022903003703002001200129031037030020014200200520077d2006200854ad7d2207200620087d2208200656200720055620072005511b22021b37031820014200200820021b37031020014110200141106a41101003200141206a24000f0b419a88c00041331039000bc70202047f047e230041206b22012400200141106a41086a2202420037030020014200370310418feec0004116200141106a1002200141086a22032002290300370300200120012903103703000240024002402001411041c8d7c400410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b200041086a2903002107200029030021082002420037030020014200370310418feec0004116200141106a100220032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101003200141206a24000f0b419a88c00041331039000bde0202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120108604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a28020028021c110100200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b10d101000b7601017f230041c0006b220024002000411836020c200041bbb2c000360208200041346a4120360200200041246a41023602002000410336022c20004202370214200041b8d4c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8d4c4001048000bfa0401137f02400240200128020022054100480d00200541ffffffff07460d002001200541016a360200200141046a2106200141086a28020021070c010b10d101000b410021050340024002400240024002400240024002400240024020050e020001010b2006280200220841086a210920082f0106220a410574210b417f21050240024002400340200b450d01200541016a2105417f4101200220094120108604220c4100481b4100200c1b220c450d03200b41606a210b200941206a2109200c4101460d000b20070d010c040b200a21052007450d030b2007417f6a2107200820054102746a41880b6a2106410021050c0a0b200841e8026a200541e0006c6a2205450d01200541306a210d200541346a280200210e4108210f41052110417f21114102211241ec032113412021144100211541012116416021170c080b200d2802002208200f6a210920082f0106220d201074210b417f21050240024002400340200b450d01200520166a210520112016200420092014108604220c2015481b2015200c1b220c450d03200b20176a210b200920146a2109200c2016460d000b200e0d010c030b200d2105200e450d020b200e20116a210e200820052012746a20136a210d410121050c090b200841e8026a220b2005410c6c6a2216450d0020162802002209450d01200b2005410c6c6a2802082205417f4c0d062005450d022005102222160d03200541011023000b20002001280210200220032004200141146a28020028020c1103000c040b410021160c020b410121160b2016200920051084041a0b2000200536020420002016360200200041086a20053602000b20012001280200417f6a3602000f0b1031000b410121050c000b0ba90301097f230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120108604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b2007200441e0006c6a41e8026a2204450d00200341086a220a200441c5006a290000370300200341106a2208200441cd006a290000370300200341186a2207200441d5006a29000037030020032004413d6a29000037030020042d003c4101470d0020002003290300370001200041013a0000200041096a200a290300370000200041116a2008290300370000200041196a20072903003700000c010b200020012802102002200141146a280200280210110100200128020021050b20012005417f6a360200200341206a24000f0b10d101000ba40201087f0240200028020022024100480d00200241ffffffff07460d002000200241016a2203360200200041046a2102200041086a2802002104024003402002280200220541086a210620052f010622074105742108417f210202400240024003402008450d01200241016a2102417f410120012006412010860422094100481b410020091b2209450d03200841606a2108200641206a210620094101460d000b20040d010c040b200721022004450d030b2004417f6a2104200520024102746a41880b6a21020c010b0b2005200241e0006c6a41e8026a2202450d002002413c6a2d0000210220002003417f6a36020020024101460f0b20002802102001200041146a280200280218110400210220002000280200417f6a36020020020f0b10d101000bf80202097f037e230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120108604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d00200441186a290300220ca7450d00200441286a290300210d200441206a290300210e0c010b200341086a20012802102002200141146a280200280214110100200341186a290300210d200128020021052003290310210e2003290308210c0b20012005417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b10d101000bf71207057f017e1a7f047e017f017e097f230041b00d6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241b0026a200210330240024020022903d00222074202510d002000410c6a2108200041046a210920024190016a41146a210a20024190016a41206a2105200241b0026a41047221042002418d036a210b200241b0026a413d6a210c200241ad036a210d200241f8026a210e200241f0026a210f200241b0026a41306a2110200241b0026a41286a21112002418c036a2112200241e8026a211320024180036a211420024184036a211520024188036a2116200241b0026a413c6a2117200241e4026a2118200241c8016a411c6a21190340200241c8006a41086a2203200241b0026a41086a221a290300370300200241c8006a41106a221b200241b0026a41106a221c290300370300200241c8006a41186a221d200241b0026a41186a221e290300370300200241286a41086a221f200b41086a290000370300200241286a41106a2220200b41106a290000370300200241286a41186a2221200b41186a290000370300200220022903b0023703482002200b290000370328200e2903002122200f2903002123201029030021242011290300212520122d0000212620132903002127201428020021012015280200210620162802002128200241246a41026a2229200d41026a2d00003a00002002200d2f00003b0124200241f0006a41186a222a2021290300370300200241f0006a41106a222b2020290300370300200241f0006a41086a222c201f290300370300200241ec006a41026a222d20292d00003a000020022002290328370370200220022f01243b016c20024190016a41186a2220201d29030037030020024190016a41106a221d201b29030037030020024190016a41086a221f20032903003703002002200229034837039001024002402009280200221b4180e5c200460d00200041086a280200212e0c010b41880b1022221b450d034100212e201b41003b0106201b4100360200201b41086a200241b0026a41800b1084041a200041086a41003602002009201b3602000b024002400340201b2f0106222f4105742130417f212141002103024002400240034020302003460d01202141016a2121417f410120024190016a201b20036a41086a412010860422294100481b410020291b2229450d05200341206a210320294101460d000b202e0d010c020b202f2121202e450d010b202e417f6a212e201b20214102746a41880b6a280200211b0c010b0b200241c8016a41186a22032020290300370300200241c8016a41106a2220201d290300370300200241c8016a41086a2229201f29030037030020022002290390013703c801201d200836020020024190016a410c6a2021360200201f2009360200200a20022903c801370200200a41086a2029290300370200200a41106a2020290300370200200a41186a20032903003702002002201b36029401200241003602900120112022370300200241b0026a41206a2023370300201c2024370300201a2025370300201720263a0000201320283602002018200636020020102001360200201e2027370300200c2002290370370000200c41086a202c290300370000200c41106a202b290300370000200c41186a202a290300370000200b20022f016c3b0000200b41026a202d2d00003a0000200220073703b00220024190016a200241b0026a10411a0c010b201b41e8026a202141e0006c6a22212021290308202520075022031b37030820212021290300200720031b370300202141106a221b201b290300202420031b3703002020202a290300370300201d202b290300370300201f202c290300370300200220022903703703900120212d003c211b201e202141d5006a290000370300201c202141cd006a290000370300201a202141c5006a29000037030020022021413d6a22032900003703b00202400240202641ff01714101470d00200241c8016a41186a2020290300370300200241c8016a41106a201d290300370300200241c8016a41086a201f29030037030020022002290390013703c8014101211b0c010b200241c8016a41186a201e290300370300200241c8016a41106a201c290300370300200241c8016a41086a201a290300370300200220022903b0023703c8010b2021413c6a201b3a0000200341186a200241c8016a41186a2229290300370000200341106a200241c8016a41106a2230290300370000200341086a200241c8016a41086a222e290300370000200320022903c801370000202141286a2203202220032903002027a722031b37030020212023202129032020031b37032020212027202129031820031b370318024002402006450d002006211b20012103034020032802ec032103201b417f6a221b0d000b0340200120012f01064102746a41ec036a28020021012006417f6a22060d000c020b0b200121030b20012f01062106200241c8016a41206a20283602002019200636020020294100360200200241c8016a41146a200136020020304100360200202e4200370300200220033602cc01200241003602c801200241b0026a200241c8016a1032024020022802b0024101470d00202141306a211b034020024190016a41286a200441286a2802003602002005200441206a2902003703002020200441186a2201290200370300201d200441106a2206290200370300201f200441086a2203290200370300200220042902003703900120024180026a41186a200129000037030020024180026a41106a200629000037030020024180026a41086a20032900003703002002200429000037038002200241a0026a41086a200541086a280200360200200220052902003703a002200241f0016a201b20024180026a200241a0026a1044024020022802f001450d0020022802f4012201450d00200241f0016a41086a280200450d00200110200b200241b0026a200241c8016a103220022802b0024101460d000b0b200241c8016a10420b200241b0026a20021033200241b0026a41206a29030022074202520d000b0b200210542000200028020041016a360200200241b00d6a24000f0b41880b41081023000b10d701000b7601017f230041c0006b220024002000411036020c200041abb2c000360208200041346a4121360200200041246a41023602002000410336022c20004202370214200041b8d4c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8d4c4001048000b130020004102360204200041c0b8c0003602000b13002000410e360204200041abbac0003602000b130020004104360204200041bcbac0003602000b830701087f230041900c6b22042400024002400240024020002802000d002000417f360200200441d8006a41186a200141186a290000370300200441d8006a41106a200141106a290000370300200441d8006a41086a200141086a2900003703002004200129000037035802400240200028020422054180e5c200460d00200041086a28020021060c010b41880b10222205450d0241002106200541003b010620054100360200200541086a20044190016a41800b1084041a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f01062209410574210a41002101417f21080240024002400340200a2001460d01200841016a2108417f4101200441d8006a200520016a41086a4120108604220b4100481b4100200b1b220b450d05200141206a2101200b4101460d000b20060d010c020b200921082006450d010b2006417f6a2106200520084102746a41880b6a28020021050c010b0b200441186a200441d8006a41186a290300370300200441106a200441d8006a41106a290300370300200441086a200441d8006a41086a290300370300200420042903583703002000410c6a21014100210641000d010c040b2000410c6a21014101450d030b200441a8016a4200370300200441a4016a4180e5c200360200200441003602b001200441003602a001200442003703980120044180e5c2003602940120044100360290012005200841e0006c6a41e8026a210120044190016a10420c030b10d701000b41880b41081023000b200441f4006a200441086a290300370200200441fc006a200441106a29030037020020044184016a200441186a2903003702002004200136026820042008360264200420073602602004200536025c200420063602582004200429030037026c200441c4016a4200370200200441b0016a2004290348370300200441b8016a200441c8006a41086a290300370300200441cd016a2004290025370000200441d5016a200441256a41086a290000370000200441dd016a200441256a41106a290000370000200441e5016a200441256a41186a290000370000200441ec016a200441c4006a280000360000200442003703a801200442003703900120044180e5c2003602c001200441003a00cc01200441d8006a20044190016a104121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900c6a24000bef1004047f017e087f037e230041b0046b22022400200241106a200110bc010240024002400240024002400240024002402002280210450d00200241003a00880220024188026a200128020022032001280204220441004722051084041a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d008802220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b200241a8016a200110bb0102400240024020022d00a8014102460d00200241c8036a41206a200241a8016a41206a280200360200200241c8036a41186a200241a8016a41186a290300370300200241c8036a41106a200241a8016a41106a290300370300200241c8036a41086a200241a8016a41086a290300370300200220022903a8013703c80320024188026a41386a2207420037030020024188026a41306a2208420037030020024188026a41286a2209420037030020024188026a41206a220a420037030020024188026a41186a220b420037030020024188026a41106a220c420037030020024188026a41086a220d4200370300200242003703880220024188026a20012802002203200141046a220e280200220441c000200441c000491b22051084041a200e200420056b3602002001200320056a3602002004413f4d0d00200241f0036a41386a2007290300370300200241f0036a41306a2008290300370300200241f0036a41286a2009290300370300200241f0036a41206a200a290300370300200241f0036a41186a200b290300370300200241f0036a41106a200c290300370300200241f0036a41086a200d29030037030020022002290388023703f0032002200110572002280200450d002002290308210f200141046a220e2802002104200241003a00880220024188026a20012802002207200441004722051084041a20042005490d04200e200420056b22033602002001200720056a22053602002004450d002002310088022210500d01200241003a00880220024188026a2005200341004722041084041a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d00420121062002310088024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024180016a41206a200241c8036a41206a28020036020020024180016a41186a200241c8036a41186a29030037030020024180016a41106a200241c8036a41106a29030037030020024180016a41086a200241c8036a41086a290300370300200241e8026a41086a200241f0036a41086a290300370300200241e8026a41106a200241f0036a41106a290300370300200241e8026a41186a200241f0036a41186a290300370300200241e8026a41206a200241f0036a41206a290300370300200241e8026a41286a200241f0036a41286a290300370300200241e8026a41306a200241f0036a41306a290300370300200241e8026a41386a200241f0036a41386a290300370300200220022903c80337038001200220022903f0033703e8020c030b20052004102d000b20052004102d000b20042003102d000b200241a8016a41206a220420024180016a41206a280200360200200241a8016a41186a220520024180016a41186a290300370300200241a8016a41106a220320024180016a41106a290300370300200241a8016a41086a220e20024180016a41086a29030037030020024188026a41086a2207200241e8026a41086a29030037030020024188026a41106a2208200241e8026a41106a29030037030020024188026a41186a2209200241e8026a41186a29030037030020024188026a41206a220a200241e8026a41206a29030037030020024188026a41286a220b200241e8026a41286a29030037030020024188026a41306a220c200241e8026a41306a29030037030020024188026a41386a220d200241e8026a41386a29030037030020022002290380013703a801200220022903e80237038802024020064202520d0020004203370370200241b0046a24000f0b200241d8006a41206a2004280200360200200241d8006a41186a2005290300370300200241d8006a41106a2003290300370300200241d8006a41086a200e290300370300200241186a41086a2007290300370300200241186a41106a2008290300370300200241186a41186a2009290300370300200241186a41206a200a290300370300200241186a41286a200b290300370300200241186a41306a200c290300370300200241186a41386a200d290300370300200220022903a80137035820022002290388023703180b20024188026a200110b9012002280288022101200241e8026a20024188026a41047241dc001084041a02402001410f470d0020004203370370200241b0046a24000f0b200241a8016a200241e8026a41dc001084041a2000200f37030020002002290358370308200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a2802003602002000200229031837022c200041346a200241186a41086a2903003702002000413c6a200241186a41106a290300370200200041c4006a200241186a41186a290300370200200041cc006a200241186a41206a290300370200200041d4006a200241186a41286a290300370200200041dc006a200241c8006a290300370200200041e4006a200241d0006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241a8016a41dc001084041a200241b0046a24000ba40301057f230041c0006b2202240002400240411010222203450d00200341086a41002900f7c840370000200341002900efc84037000020034110412010212203450d0120032001370010200241206a41186a22044200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034118200241206a1000200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d002004420037030020054200370300200241286a42003703002002420037032020024120200241206a4120410010012204417f460d022004411f4d0d0220002002290320370000200041186a200241206a41186a290300370000200041106a200241206a41106a290300370000200041086a200241206a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031020200241c0006a24000f0b419a88c00041331039000b411041011023000b412041011023000bc5e50137037f017e037f017e047f027e047f037e167f027e027f017e027f027e0d7f027e067f027e0c7f047e017f037e017f037e187f027e017f017e0e7f017e067f017e227f017e017f017e017f017e017f027e027f017e027f027e037f027e027f027e0d7f017e067f017e017f017e067f230041a0096b2201240020014190056a41086a22024200370300200142003703900541f691c200411320014190056a1002200141f8036a41086a200229030037030020012001290390053703f80302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141f8036a411041c8d7c400410041001001417f460d00200141003a00a008200141f8036a4110200141a0086a41014100100141016a41014d0d0220012d00a0082102200141f8036a411010092002450d0020014190056a41086a22024200370300200142003703900541b68cc000411d20014190056a1002200141f8036a41086a200229030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a103820012802a0082203450d0420012902a4082104200141f8036a41101009410610222202450d05200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d06200241086a41002d00a293423a0000200241002f00a093423b0006024002402002410941c8d7c400410041001001417f460d00200141003602a0084101210520024109200141a0086a41044100100141016a41044d0d0420012802a00821062002102020064521072006450d012006ad4205862208422088a70d312008a722024100480d31200210222205450d0a4100210920052102034020014190056a2009109c01200241186a20014190056a41186a290000370000200241106a20014190056a41106a290000370000200241086a20014190056a41086a2900003700002002200129009005370000200241206a21022006200941016a2209470d000c020b0b200210204101210741002106410121050b2004a7210a02400240024020062004422088a7220b470d000240200b450d0020032005460d004100210c200521022003210903402002200941201086040d02200241206a2102200941206a2109200c41016a220c200b490d000b0b20070d0120051020200a0d020c030b200141ac086a2006360200200141a8086a2006360200200120053602a408200141013a00a008200141a0086a10df010b200a450d010b200310200b20014190056a41086a22024200370300200142003703900541d2cfc200411820014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f80342002104024002400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d0120012903a00821040b20024200370300200142003703900541b8adc200411520014190056a10022009200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d0320012903a00822084200520d0141eccfc200102f000b42e80721080b20014190056a41086a22024200370300200142003703900541a3a8c200411920014190056a1002200141f8036a41086a200229030037030020012001290390053703f803200020047d200882210d0240200141f8036a411041c8d7c400410041001001417f460d00200141003a00a008200141f8036a4110200141a0086a41014100100141016a41014d0d0920012d00a0082102200141f8036a41101009200241004721060c0b0b200d4200520d0b410121060c0a0b419a88c00041331039000b419a88c00041331039000b41a493c200102f000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410641011023000b410c41011023000b419a88c00041331039000b200241011023000b4200210e20014190056a41086a22024200370300200142003703900541da95c200410d20014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f803420021040240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d0f20012903a00821040b2002420037030020014200370390054184d0c200411420014190056a10022009200229030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d1020012903a008210e0b20014190056a41086a22024200370300200142003703900541a4adc200411420014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d1220012903a00842017c21080c010b420121080b200141a0086a41086a2008370300200141033a00a008200141a0086a103d20024200370300200142003703900541a4adc200411420014190056a10022009200229030037030020012001290390053703f803200120083703a008200141f8036a4110200141a0086a410810032002420037030020014200370390054184d0c200411420014190056a10022009200229030037030020012001290390053703f803200120043703a008200141f8036a4110200141a0086a41081003200141a8036a4198d0c200411910e00102400240024020012903a803a74101470d0020012903b003210820014190056a41086a22024200370300200142003703900541b8adc200411520014190056a1002200141f8036a41086a200229030037030020012001290390053703f803200120083703a008200141f8036a4110200141a0086a410810030c010b200d500d010b20014190056a41086a22024200370300200142003703900541cdc8c000410d20014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f803420021080240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d1320012903a00821080b20024200370300200142003703900541d2cfc200411820014190056a10022009200229030037030020012001290390053703f803200120083703a008200141f8036a4110200141a0086a410810030b2004200e7d200610e10120014190056a41086a22024200370300200142003703900541cdadc200411220014190056a1002200141f8036a41086a200229030037030020012001290390053703f8034100210302400240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a103820012802a008220f450d1f200141a8086a280200210320012802a40821100c010b4101210f410021100b200141003602a008200141a0086a109e01410610222202450d18200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d19200241086a41002d00a293423a0000200241002f00a093423b0006024002402002410941c8d7c400410041001001417f460d00200141003602a00820024109200141a0086a41044100100141016a41044d0d1720012802a008210520021020200520034d0d01200321090340410610222202450d0e200241046a41002f00b48c4022063b0000200241002800b08c40220c36000020024106410c10212202450d0f200241086a41002d00a293423a0000200241002f00a093423b000602402002410941c8d7c400410041001001417f460d00200141003602a00820024109200141a0086a41044100100141016a41044d0d0620012802a008210b200210200240200b20094d0d00410610222202450d1b200241046a20063b00002002200c36000020024106410c10212202450d1c200220093600062002410a1009200210200b2005200941016a2209470d010c030b200210202005200941016a2209470d000c020b0b200210200b410610222202450d1a200241046a41002f00b48c403b0000200241002800b08c4036000020024106410c10212202450d1b200241086a41002d00a293423a0000200241002f00a093423b0006200120033602a00820024109200141a0086a4104100320021020024020034105742203450d0041002106200f2109034020014198046a41186a220c200941186a29000037030020014198046a41106a220b200941106a29000037030020014198046a41086a2205200941086a2900003703002001200929000037039804411210222202450d07200241106a41002f00efad423b0000200241086a41002900e7ad42370000200241002900dfad4237000020024112413210212202450d0820022001290398043700122002412a6a200c290300370000200241226a200b2903003700002002411a6a200529030037000020014190056a41186a220c420037030020014190056a41106a220b420037030020014190056a41086a2205420037030020014200370390052002413220014190056a1000200141d8036a41186a200c290300370300200141d8036a41106a200b290300370300200141d8036a41086a200529030037030020012001290390053703d80302400240200141d8036a412041c8d7c400410041001001417f460d00200141f8036a41186a220a4200370300200141f8036a41106a22074200370300200141f8036a41086a22114200370300200142003703f803200141d8036a4120200141f8036a4120410010012212417f460d072012411f4d0d07200141b8036a41186a2212200a290300370300200141b8036a41106a220a2007290300370300200141b8036a41086a22072011290300370300200120012903f8033703b80320021020200141b0056a41186a2012290300370300200141b0056a41106a200a290300370300200141b0056a41086a2007290300370300200120012903b8033703b0054106102222020d010c0b0b20021020200141b0056a41186a4200370300200141b0056a41106a4200370300200141b0056a41086a4200370300200142003703b005410610222202450d0a0b200241046a41002f00b48c40220a3b0000200241002800b08c40220736000020024106410c10212202450d0a20022006360006024002402002410a41c8d7c400410041001001417f460d00200c4200370300200b42003703002005420037030020014200370390052002410a20014190056a4120410010012211417f460d082011411f4d0d08200141a0086a41186a200c290300370300200141a0086a41106a200b290300370300200141a0086a41086a200529030037030020012001290390053703a0080c010b200141a0086a41186a4200370300200141a0086a41106a4200370300200141a0086a41086a4200370300200142003703a0080b2002102002400240200141a0086a200141b0056a4120108604450d00200141003602b007200141b0076a109e01410610222202450d0d200241046a200a3b00002002200736000020024106410c10212202450d0e200241086a41002d00a293423a0000200241002f00a093423b00062002410941c8d7c400410041001001417f460d01200141003602b00720024109200141b0076a41044100100141016a41044d0d0520012802b007210c20021020200c20064d0d00410610222202450d16200241046a200a3b00002002200736000020024106410c1021220c450d17200c2006360006412010222202450d18200220012903b005370000200241186a200141b0056a41186a290300370000200241106a200141b0056a41106a290300370000200241086a200141b0056a41086a290300370000200c410a20024120100320021020200c10200b200641016a2106200941206a2109200341606a22030d010c020b20021020200641016a2106200941206a2109200341606a22030d000b0b2010450d00200f10200b200141f8036a41086a22024200370300200142003703f80341f48fc1004116200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b00602400240200141b0066a411041c8d7c400410041001001417f460d00200142003703a008200141b0066a4110200141a0086a41084100100141016a41084d0d0e20012903a00822044200510d1d4200211320002004824200520d240c010b42002113200042e807824200520d230b4108210b200141f8036a41086a22022013370300200120133703f80341a490c1004115200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b0064100210a02400240200141b0066a411041c8d7c400410041001001417f460d00200142103702b4052001200141b0066a3602b005200141a0086a200141b0056a10e20120012802a008220b450d1f20012802a40821074188012102200141a8086a280200220a4188016c2209450d010c200b41002107418801210241004188016c22090d1f0b200141003602b8052001200b3602b4052001200b3602b005200120014198046a3602bc05200a0d1f0c200b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b411241011023000b413241011023000b410641011023000b410c41011023000b410641011023000b410c41011023000b410641011023000b410c41011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410641011023000b410c41011023000b412041011023000b419a88c00041331039000b410641011023000b410c41011023000b410641011023000b410c41011023000b410641011023000b410c41011023000b418c90c100102f000b419a88c00041331039000b419a88c00041331039000b200b20096a2109200141a0086a200b28026010e301200b20026a21020240024020012802b0082206450d0020014198036a20012903a008200141a0086a41086a290300200141b8086a350200420010880420014198036a41086a2903002108200129039803211420012802b408450d01200610200c010b42002114420021080b200141013602b805200120093602b405200120023602b005200120014198046a3602bc050240200b450d00200bad4220862115024020022009460d00200a4188016c41f87e6a2109200141b0086a210c200141b8086a2105200141b4086a21034201210e0340200141a0086a200241e0006a28020010e30102400240200c2802002206450d0020014188036a20012903a008200141a0086a41086a2903002005350200420010880420014188036a41086a2903002104200129038803210d2003280200450d01200610200c010b4200210d420021040b02402014200d56200820045620082004511b0d002002ad422086200e842115200d2114200421080b20024188016a2102200e42017c210e200941f87e6a22090d000b0b20154280808080105a0d030b200a450d010b200a4188016c2102200b21160340201610920120164188016a2116200241f87e6a22020d000b0b2007450d01200b10200c010b0240024002400240200a2015a722024d0d00200b20024188016c6a22022903102104200b200a417f6a22064188016c6a22094180016a29030021082009290360210e200941e8006a290300210d200941f0006a2903002114200941f8006a2903002115200941c8006a290300215d200941d0006a2903002158200941d8006a2903002159200941286a290300215a200941306a290300215b200941386a290300215e200941186a290300215f200941c0006a2903002162200941206a2903002161200929030021632009290308217c200220092903103703102002290308217d2002207c3703082002290300217c20022063370300200241206a2209290200216320092061370200200241c0006a2209290200216120092062370200200241186a220929030021622009205f370300200241386a2209290200215f2009205e370200200241306a2209290200215e2009205b370200200241286a2209290200215b2009205a370200200241d8006a2209290200215a20092059370200200241d0006a2209290200215920092058370200200241c8006a220929020021582009205d370200200241f8006a2015370300200241f0006a2014370300200241e8006a200d3703002002280260210c2002200e37036020024180016a2008370200200141b0056a41d8006a205a370300200141b0056a41d0006a2059370300200141b0056a41c8006a2058370300200141b0056a41c0006a2061370300200141b0056a41386a205f370300200141b0056a41306a205e370300200141b0056a41286a205b370300200141b0056a41206a2063370300200141b0056a41186a2062370300200120043703c0052001207d3703b8052001207c3703b005200120063602a808200120073602a4082001200b3602a008200141f8036a41086a22024200370300200142003703f80341a490c1004115200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b0062001411036029c042001200141b0066a36029804200141a0086a20014198046a10e40102402006450d00200a4188016c41f87e6a2109200b21020340200210920120024188016a2102200941f87e6a22090d000b0b02402007450d00200b10200b411310222202450d01410021062002410f6a410028008df040360000200241086a4100290086f040370000200241002900feef4037000020024113412610212202450d022002200c36001320014190056a41186a2209420037030020014190056a41106a220b420037030020014190056a41086a2205420037030020014200370390052002411720014190056a100020014190076a41186a200929030037030020014190076a41106a200b29030037030020014190076a41086a200529030037030020012001290390053703900702400240024020014190076a412041c8d7c400410041001001417f460d00200120014190076a360298042001412036029c04200142003703a808200142003703a0082001410020014190076a4120200141a0086a41104100100122092009417f461b2209411020094110491b3602a0042009410f4d0d02200141a8086a2209290300210420012903a0082108200141a0086a20014198046a103820012802a0082206450d022009280200210b20012802a408210520014190076a41201009200210202006450d010c060b2002102041000d050b200141b0056a1092010c050b419a88c00041331039000b41bc90c1002002200a10b501000b411341011023000b412641011023000b0240200b4105742209450d0020062102034020022008200410e501200241206a2102200941606a22090d000b0b200141c8086a2004370300200141c0086a2008370300200141b8086a200b360200200141b4086a2005360200200141a0086a41106a2006360200200141ac086a200c360200200141a0086a41086a41013a0000200141053a00a008200141a0086a103d200141f8036a41086a22024200370300200142003703f80341f9edc0004116200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b00602400240024002400240200141b0066a411041c8d7c400410041001001417f460d00200142003703a008200141b0066a4110200141a0086a41084100100141016a41084d0d0220012903a00821080c010b42e80721080b200141a0086a200141b0056a41e0001084041a42002104200141f8036a41086a22024200370300200142003703f80341cc90c1004115200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b0060240200141b0066a411041c8d7c400410041001001417f460d002001420037039804200141b0066a411020014198046a41084100100141016a41084d0d0220012903980421040b20014198046a200820007c200141a0086a4100200410e6012001280298044101470d03200128029c0420014198046a41086a280200100f0c020b419a88c00041331039000b419a88c00041331039000b410221020c010b200141f8036a41086a22162013370300200120133703f80341e190c1004113200141f8036a1002200141b0066a41086a2016290300370300200120012903f8033703b006410021160240024002400240024002400240200141b0066a411041c8d7c400410041001001417f460d00200141003602a008200141b0066a4110200141a0086a41044100100141016a41044d0d0120012802a00821160b200141f8036a41086a22024200370300200142003703f80341f490c1004119200141f8036a1002200141b0066a41086a2002290300370300200120012903f8033703b006410021020240200141b0066a411041c8d7c400410041001001417f460d00200141003602a008200141b0066a4110200141a0086a41044100100141016a41044d0d0220012802a00821020b0240024002400240201620024f0d00200141ac086a210c200141a8086a210902400340200141a0086a201610e70120092802002206410f470d01201641016a22162002490d000c020b0b20012903a008210420014198046a200c41ec001084041a200141b0076a20014198046a41ec001084041a200141b0086a22092006360200200120043703a808200120163602a008200141b4086a200141b0076a41ec00108404210c024020042000520d00200141b0066a41086a2209200141a0086a41086a290300370300200120012903a0083703b006200141b0056a200c41ec001084041a20014198046a41086a220c2009290300370300200120012903b00637039804200141a0086a200141b0056a41ec001084041a41800110222217450d07201720012903980437030020172006360210201741086a200c290300370300201741146a200141a0086a41ec001084041a201641016a221620024f0d03200141a0086a41106a2118200141a0086a41146a2105200141ac086a2103200141a0086a41086a210641012119410121090340200141a0086a201610e70102402006280200220c410f470d00201641016a22162002490d010c040b20012903a008210420014198046a200341ec001084041a200141b0076a20014198046a41ec001084041a2018200c36020020062004370300200120163602a0082005200141b0076a41ec00108404210b20042000520d0520014190056a41086a220a2006290300370300200120012903a00837039005200141b0056a200b41ec001084041a200141f8036a41086a2207200a29030037030020012001290390053703f803200141a0086a200141b0056a41ec001084041a024020192009470d00201941016a220b2019490d0e2019410174220a200b200b200a491b220bad4207862204422088a70d0e2004a7220a4100480d0e024002402019450d0020172019410774200a102122170d010c0c0b200a10222217450d0b0b200b21190b201720094107746a220b20012903f803370300200b41086a2007290300370300200b41106a200c360200200b41146a200141a0086a41ec001084041a200941016a2109201641016a22162002490d000c030b0b20091092010b4100211941082117410021090b4107211a201720094107746a21182009450d060c070b410121194107211a201741014107746a211841010d060c050b20181092014107211a201720094107746a211820090d050c040b419a88c00041331039000b419a88c00041331039000b41800141081023000b200a41081023000b0240201722162018460d00410021020c020b410121020c010b4108211b20014198046a41086a211c200141a0086a41086a211d4104211e200141a0086a410472211f410c212020014198046a410c6a2121411021224114212341ec0021244180012125410f212641162127418feec00021284100212941c8d7c400212a417f212b4202212c423e212d41fe00212e4102212f42002130417e213141ff002132423f2133420121344115213541cc90c1002136410321374105213841e800213920014198046a41e8006a213a41e000213b200141a9086a213c4106213d4113213e41e190c100213f4101214041f800214142e80021424220214341172144412e214541182146411f21474120214841987f214942e4cab5fbb6ccdcb0e300214a4238214b4140214c4138214d4130214e4128214f4160215020014188056a215141c0002152412c215341242154411c2155413421562017211641002157410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010206060b200141a0086a41106a2109200141a0086a41146a210b0340200141b0066a41086a2206201641086a290300370300200120162903003703b006201641106a2802002102200141a0086a201641146a41ec001084041a2002410f460d6f20014190056a41086a220c2006290300370300200120012903b00637039005200141b0056a200141a0086a41ec001084041a20092002360200200141a0086a41086a200c29030037030020012001290390053703a008200b200141b0056a41ec001084041a200910920120164180016a22162018470d000b410121020c7a0b02402019450d00201710200b411710222202450d012002410f6a410029009c9141370000200241086a410029009591413700002002410029008d914137000020024117412e10212202450d022002200037001720014190056a41186a2209420037030020014190056a41106a2206420037030020014190056a41086a220c420037030020014200370390052002411f20014190056a100020014190076a41186a200929030037030020014190076a41106a200629030037030020014190076a41086a200c2903003703002001200129039005370390070240024020014190076a412041c8d7c400410041001001417f460d00200142203702b405200120014190076a3602b005200141a0086a200141b0056a10e80120012802a0082211450d0520012902a408210420014190076a412010092004422088a721092004a721120c010b4108211141002109410021120b200210202011200941e8006c22026a210c02400240024002402002450d00200241987f6a2106200141a0086a4104722105200141ac086a2103200141a9086a210a200141a8086a210720112102034020022802002109200141b0056a200241046a41dc001084041a20094110460d02200141a0086a200141b0056a41dc001084041a0240024002402009410f470d0020060d010c020b200241e0006a280200210b20014198046a200141a0086a41dc001084041a200120093602a008200520014198046a41dc001084041a200141003b01b005200141386a200141a0086a200141b0056a10a301200128023821092003200b360200200a2009453a0000200741063a0000200141053a00a008200141a0086a103d2006450d010b200241e8006a2102200641987f6a21060c010b0b200c2202200c470d020c030b20112202200c470d010c020b200241e8006a2202200c460d010b200141a0086a4104722106034020022802002109200141a0086a200241046a41e4001084041a20094110460d01200141b0056a200141a0086a41e4001084041a200120093602a0082006200141b0056a41e4001084041a02402009410f460d00200141a0086a1092010b200241e8006a2202200c470d000b0b2012450d6e20111020410221020c790b200010e9014108217e4200217f200141f8036a41086a2280014200370300200142003703f803411721810141f9d0c20021820141f9d0c2004117200141f8036a100220014190056a41086a228301208001290300370300200120012903f80337039005410021840141c8d7c4002185014110218601417f21870120014190056a411041c8d7c400410041001001417f460d0420014198046a4104722188014105218901200141a0086a410572218a014120218b01200141a0086a41206a218c01200141a0086a410472218d014210218e01200141a0086a41086a218f01410f21900141dc002191014118219201411521930141dbc9c10021940142202195014128219601410621970141ff01219801410c21990120014198046a410c6a219a014130219b01200141a0086a41306a219c01412c219d01200141a0086a412c6a219e014107219f01410121a001411c21a101413c21a201413421a301412421a40141e00021a501410d21a60141cdc8c00021a701410221a801411621a90141f9edc00021aa01411e21ab0141c4d1c20021ac01411b21ad01413b21ae01413321af01412b21b001412321b10141f60021b20141d30021b30141cb0021b40141c30021b50141db0021b601415821b701422821b801413821b901410121570c710b411741011023000b412e41011023000b419a88c00041331039000b0240024020570e0400010312120b201620226a28020021022016290208210420162802002106200141a0086a201620236a20241084041a201620256a2116024020022026460d00200141b0076a200141a0086a20241084041a201c200236020020012004370398042021200141b0076a20241084041a200141b0056a200610ea0120012802b0052105024002400240200141b0056a201b6a22102802002202450d002002203874210c4200210e200521024200211442002158420021594200215a4200215b0340200141f8026a2002103b200141f8026a201b6a290300210820012903f8022104201f2002290000370000201f201b6a2002201b6a290000370000201f20226a200220226a290000370000201f20466a200220466a290000370000200120063602a008200141e8026a20042008200141a0086a10eb012209204674204675220b201a7620097320406aad204b86204b872030108804200820147c2004200e7c220e200454ad7c21142030200141e8026a201b6a2903002204200b20294822091b20597c203020012903e802220820091b220d20587c2258200d54ad7c21592004203020091b205b7c2008203020091b2204205a7c225a200454ad7c215b200220486a2102200c20506a220c0d000b20012802b405450d020c010b4200215a4200215b42002158420021594200210e4200211420012802b405450d010b200510200b200141b0056a200610ea0120012802b005215c02400240024020102802002202450d00200220387421034200210d205c21024200215d420021134200215e420021154200215f0340200141a0086a20466a220b200220466a220a290000370300200141a0086a20226a2205200220226a2207290000370300201d2002201b6a2211290000370300200120022900003703a008202210222209450d192009201b6a20292900feee40370000200920292900f6ee4037000020092022204810212209450d1a2009200636001020092048205210212209450d1b200920012903a008370014200920536a200b290300370000200920546a2005290300370000200920556a201d29030037000020014190056a20466a220c203037030020014190056a20226a2212203037030020014190056a201b6a220f203037030020012030370390052009205620014190056a100020014190076a20466a200c29030037030020014190076a20226a201229030037030020014190076a201b6a200f2903003703002001200129039005370390074100210c024020014190076a2048202a410041001001202b460d00200120293a00b00620014190076a2048200141b0066a20402029100120406a20404d0d2020012d00b006210c0b20091020200b200a29000037030020052007290000370300201d2011290000370300200120022900003703a008200141c8026a2006200141a0086a200c2046742209204775200c7320406a202210ec01200141c8026a20466a290300205d7c20012903d8022204200d7c220d200454ad7c215d2030200141c8026a201b6a2903002204200920467520294822091b205e7c203020012903c802220820091b225e20137c2213205e54ad7c215e2004203020091b205f7c2008203020091b220420157c2215200454ad7c215f200220486a2102200320506a22030d000b20012802b405450d020c010b420021154200215f420021134200215e4200210d4200215d20012802b405450d010b205c10200b42002108200141f8036a201b6a22054200370300200142003703f80320282027200141f8036a1002200141b0066a201b6a22602005290300370300200120012903f8033703b00602400240200141b0066a2022202a202920291001202b460d00200120303703a808200120303703a008200141b0066a2022200141a0086a2022202910012202202b460d28200220264d0d28201d290300210420012903a00821080c010b420021040b024002400240200d200e7c220e202c88205d20147c200e200d54ad7c220d202d86842214200e85200d202c88225d200d8584500d002014205d84500d004100210202400340200141b8026a200e200d2002201e6a202e71108a042002202f6a210220012903b8022214200e85200141b8026a201b6a290300225d200d8584500d012014205d842030520d000b0b200141a8026a200e200d2002202e71108a0420012903a802200141a8026a201b6a2903008421144200215d2002450d012014420052ad2114034020014188026a200e200d2029200220316a2209200920024b1b2202203271108a0420014198026a201420348622612034842262205d203486201420338884225d2062205d108804206120622001290398022001290388025620014198026a201b6a290300221420014188026a201b6a29030022635620142063511b1b211420020d000c030b0b4200215d200e200d84420052ad21140c010b2014420052ad21140b0240024002400240024002402008202c882004202d8684220e2008852004202c88220d20048584500d00200e200d84500d004100210202400340200141f8016a200820042002201e6a202e71108a042002202f6a210220012903f801220e200885200141f8016a201b6a290300220d20048584500d01200e200d842030520d000b0b200141e8016a200820042002202e71108a0420012903e801200141e8016a201b6a29030084210e4200210d2002450d01200e420052ad210e0340200141c8016a200820042029200220316a2209200920024b1b2202203271108a04200141d8016a200e20348622612034842262200d203486200e20338884220d2062200d1088042061206220012903d80120012903c80156200141d8016a201b6a290300220e200141c8016a201b6a290300226356200e2063511b1b210e20020d000b2014205d8450450d020c030b4200210d2008200484420052ad210e2014205d8450450d010c020b200e420052ad210e2014205d84500d010b205e20597c201320587c2208201354ad7c2158205f205b7c2015205a7c2204201554ad7c211320512d00002202202f460d01024020022040470d000340205d215d20142159200e200d842030510d26200141a8016a200420132059205d108704200141b8016a20082058200e200d1087044101216420012903b801225a20012903a801225b54200141b8016a201b6a2903002214200141a8016a201b6a290300221554201420155122021b0d04205b205a54201520145420021b0d0220014198016a205a2014200e200d10880420014188016a205b20152059205d108804200420012903880122147d2215201320014188016a201b6a2903007d2004201454ad7d225a84500d02205820014198016a201b6a2903007d215b20082001290398012204542102200820047d2114200e2104200d21132015210e205a210d20592108205d21582014205b2002ad7d225d8450450d000c040b0b0340200141f8006a200820582014205d108704200e2259200d225a842030510d26200141f8006a201b6a290300210e2001290378210d200141e8006a200420132059205a10870441012164200d2001290368225b54200e200141e8006a201b6a290300221554200e20155122021b0d03205b200d542015200e5420021b0d01200141d8006a200d200e2014205d108804200141c8006a205b20152059205a10880420042001290348220e7d220d2013200141c8006a201b6a2903007d2004200e54ad7d221584500d012058200141d8006a201b6a2903007d215b200820012903582204542102200820047d210e20142104205d2113200d21142015215d20592108205a2158200e205b2002ad7d220d8450450d000c030b0b410021640c010b2004200856201320585620132058511b21640b4200210d20054200370300200142003703f80320362035200141f8036a100220602005290300370300200120012903f8033703b0060240200141b0066a2022202a202920291001202b460d00200120303703a008200141b0066a2022200141a0086a201b2029100120406a201b4d0d1e20012903a008210d0b200141a0086a200610ea0120012802a408216520012802a00821660240201d2802002202450d002002203874210f20642040732167206621020340200141d8036a20466a2209200220466a2203290000370300200141d8036a20226a220c200220226a220a290000370300200141d8036a201b6a220b2002201b6a2207290000370300200120022900003703d80320014190076a20466a2268200329000037030020014190076a20226a2269200a29000037030020014190076a201b6a226a2007290000370300200229000021042005200b290300370300200141f8036a20226a2211200c290300370300200141f8036a20466a221220092903003703002001200437039007200120012903d8033703f80320022900002104201f20466a226b2003290000370000201f20226a226c200a290000370000201f201b6a226d2007290000370000201f2004370000200120063602a008410021030240200141a0086a10eb01204674204675220a4100482067732040470d00200141b8036a20466a2012290300370300200141b8036a20226a2011290300370300200141b8036a201b6a2005290300370300200120012903f8033703b80341012103200a216e0b200141b0056a20466a2207200141b8036a20466a226f290300370300200141b0056a20226a225c200141b8036a20226a22702903003703002010200141b8036a201b6a2271290300370300200120012903b8033703b005024020030d00200220486a2102200f20506a220f0d010c020b0b200141b0066a20466a22722007290300370300200141b0066a20226a2273205c29030037030020602010290300370300200120012903b0053703b00620014190056a20466a2274207229030037030020014190056a20226a2275207329030037030020014190056a201b6a22762060290300370300200120012903b00637039005200141a0086a20466a22772074290300370300200141a0086a20226a22782075290300370300201d20762903003703002001204a3703a80620012001290390053703a008200141a8066a200141a0086a200d206e204674204675201a76206e7320406aad204b86204b877e20007c10ed01200f2048460d00200f204c6a21794100210a034020092002200a6a2203204d6a220f290000370300200c2003204e6a226e290000370300200b2003204f6a227a2900003703002001200320486a22032900003703d8032068200f2900003703002069206e290000370300206a207a290000370300200329000021042005200b2903003703002011200c290300370300201220092903003703002001200437039007200120012903d8033703f803200120063602a00820032900002104207a2900002108206e290000210e206b200f290000370000206c200e370000206d2008370000201f2004370000410021030240200141a0086a10eb01204674204675220f4100482067732040470d00206f20122903003703002070201129030037030020712005290300370300200120012903f8033703b80341012103200f217b0b2007206f290300370300205c207029030037030020102071290300370300200120012903b8033703b005024002402003450d00207220072903003703002073205c29030037030020602010290300370300200120012903b0053703b006207420722903003703002075207329030037030020762060290300370300200120012903b006370390052077207429030037030020782075290300370300201d20762903003703002001204a3703a80620012001290390053703a008200141a8066a200141a0086a200d207b204674204675201a76207b7320406aad204b86204b877e20007c10ed012079200a470d010c030b2079200a460d020b200a20486a210a0c000b0b02402065450d00206610200b200610ee0102400240024002400240024002402064450d00200141a0086a20206a22022006360200201d20373a0000200120383a00a008200141a0086a103d203a2903002204500d01200141b0056a20014198046a20411084041a200141f8036a200420007c220410ef01200141a0086a200141b0056a20411084041a200141b0066a201d203b1084041a20012802fc03220b20052802002202470d02200220406a22092002490d7e2002204074220c20092009200c491b220bad20427e2208204388a70d7e2008a722092029480d7e2002450d0320012802f803200220396c20091021220c0d040c4a0b200141a0086a20206a2006360200201d201e3a0000200120383a00a008200141a0086a103d20052030370300200120303703f803203f203e200141f8036a100220602005290300370300200120012903f8033703b0062001200620406a3602a008200141b0066a2022200141a0086a201e1003201c10920120162018470d690c050b200141a0086a201c203b1084041a200120293b01b005200141c0006a200141a0086a200141b0056a10a3012001280240210920022006360200203c2009453a0000201d203d3a0000200120383a00a008200141a0086a103d20052030370300200120303703f803203f203e200141f8036a100220602005290300370300200120012903f8033703b0062001200620406a3602a008200141b0066a2022200141a0086a201e100320162018470d670c040b20012802f803210c0c020b20091022220c450d460b2001200b3602fc032001200c3602f8030b200c200220396c22116a200141b0066a203b10840421092005200220406a22033602002009203b6a2006360200204410222202450d39200220266a202929009c91413700002002201b6a202929009591413700002002202929008d914137000020022044204510212202450d3a2002200437001720014190056a20466a2209203037030020014190056a20226a220a203037030020014190056a201b6a2207203037030020012030370390052002204720014190056a100020014190076a20466a200929030037030020014190076a20226a200a29030037030020014190076a201b6a2007290300370300200120012903900537039007200120483602a408200120014190076a3602a008200141f8036a200141a0086a10f0012002102002402003450d00201120396a2109200c21020340024020022802002026460d0020021092010b200220396a2102200920496a22090d000b0b0240200b450d00200c10200b20052030370300200120303703f803203f203e200141f8036a100220602005290300370300200120012903f8033703b0062001200620406a3602a008200141b0066a2022200141a0086a201e100320162018470d620b201821160b20162018470d680c670b2001208e013702b405200120014190056a3602b005200141a0086a200141b0056a10f10120012802a0082202450d2720012802a408210c410f21090240024002400240208f012802002206450d0020022903002000520d00200141b8036a2092016a220b2002208b016a290000370300200141b8036a2086016a220520022092016a290000370300200141b8036a207e6a220320022086016a290000370300200120022900083703b80320062087016a2209ad20b8017e220420950188a70d2e2004a722062087014c0d2e024002402006450d0020061022220a0d010c400b4108210a0b200a20022096016a20061084042106208f012009360200200120093602a408200120063602a008208001207f3703002001207f3703f803208201208101200141f8036a1002208301208001290300370300200120012903f8033703900520012086013602b405200120014190056a3602b005200141a0086a200141b0056a10f20102402009450d00200610200b200141b0066a2092016a220a200b290300370300200141b0066a2086016a22072005290300370300200141b0066a207e6a22112003290300370300200120012903b8033703b00620920110222209450d3f20092086016a2084012900a0d1423700002009207e6a208401290098d1423700002009208401290090d142370000200920920120b90110212206450d40200620012903b0063700182006209b016a200a29030037000020062096016a20072903003700002006208b016a2011290300370000200141f8036a2092016a2209207f370300200141f8036a2086016a220a207f370300208001207f3703002001207f3703f803200620b901200141f8036a1000200141d8036a2092016a2009290300370300200141d8036a2086016a200a290300370300200141d8036a207e6a208001290300370300200120012903f8033703d80302400240200141d8036a208b012085012084012084011001208701460d002001209501370294052001200141d8036a36029005200141a0086a20014190056a108b0120012802a0082209209001460d43200141b0056a208d012091011084041a200141d8036a208b0110090c010b410f21090b20014198046a200141b0056a2091011084041a2009209001470d0120061020410f21090b200c450d020c010b200141b0076a20014198046a2091011084041a2006102020014190076a2092016a200b29030037030020014190076a2086016a200529030037030020014190076a207e6a2003290300370300200120012903b80337039007200c450d010b200210200b2009209001460d002001200936029804208801200141b0076a2091011084041a200141b0066a2092016a221220014190076a2092016a290300370300200141b0066a2086016a220f20014190076a2086016a290300370300200141b0066a207e6a221020014190076a207e6a29030037030020012001290390073703b006208001207f3703002001207f3703f803209401209301200141f8036a1002208301208001290300370300200120012903f803370390050240024002400240024020014190056a2086012085012084012084011001208701460d002001208e013702b405200120014190056a3602b005200141a0086a200141b0056a10f30120012802a008225c450d3420012902a408220420950188a7226f2096016c220c450d020c010b420021044108215c420020950188a7226f2096016c220c450d010b4100211141002107205c21090340200141a0086a2092016a22062012290300370300200141a0086a2086016a220b200f290300370300208f012010290300370300200120012903b0063703a008208c012009290000370000208c01207e6a22052009207e6a290000370000208c012086016a220320092086016a290000370000208c012092016a220a20092092016a29000037000020ad0110222202450d1a20022081016a208401280088ae4236000020022086016a208401290081ae423700002002207e6a2084012900f9ad4237000020022084012900f1ad42370000200220ad0120ae0110212202450d1b200220012903a00837001b200220af016a2006290300370000200220b0016a200b290300370000200220b1016a208f01290300370000200220ae0120b20110212202450d1c2002208c0129000037003b200220b3016a200a290000370000200220b4016a2003290000370000200220b5016a2005290000370000200141f8036a2092016a2206207f370300200141f8036a2086016a220b207f370300208001207f3703002001207f3703f803200220b601200141f8036a100020014190056a2092016a200629030037030020014190056a2086016a200b290300370300208301208001290300370300200120012903f8033703900502400240024020014190056a208b012085012084012084011001208701470d00410221062002102041022098017120a801470d010c020b20012084013a00b00520014190056a208b01200141b0056a20a001208401100120a0016a20a0014d0d2020012d00b005210620014190056a208b0110092002102020062098017120a801460d010b2011200620a001716a2111200720062087017320a001716a21070b20092096016a2109200c20b7016a220c0d000b206f20076b21022004a7450d020c010b4100210741002111206f41006b21022004a7450d010b205c10200b200220116b2102024002400240024002400240200128029804209701470d0020014198046a207e6a2d000020980171209701470d00209a012802002109209c012002360200209e012007360200200141a0086a2096016a2011360200208a0120012903b006370000208a01207e6a2010290300370000208a012086016a200f290300370000208a012092016a201229030037000020012084013a00a4082001209f013a00a008200141a0086a103d20022007720d01200141a0086a2099016a2009360200208f012089013a000020012089013a00a008200141a0086a103d200910ee010c010b209c012002360200209e012007360200200141a0086a2096016a2011360200208a0120012903b006370000208a01207e6a2010290300370000208a012086016a200f290300370000208a012092016a2012290300370000200120a0013a00a4082001209f013a00a008200141a0086a103d2011200220076a4d0d0020a10110222209450d4320092092016a2084012800c0d14236000020092086016a2084012900b8d1423700002009207e6a2084012900b0d14237000020092084012900a8d142370000200920a10120a20110212209450d44200920012903b00637001c200920a3016a20122903003700002009209d016a200f290300370000200920a4016a201029030037000042002104200141f8036a2092016a22064200370300200141f8036a2086016a220c42003703002080014200370300200142003703f803200920a201200141f8036a1000200141d8036a2092016a2006290300370300200141d8036a2086016a200c290300370300200141d8036a207e6a208001290300370300200120012903f8033703d803200141d8036a208b01100920091020420021082007450d02208001207f3703002001207f3703f80320ac0120ab01200141f8036a1002208301208001290300370300200120012903f8033703900520014190056a2086012085012084012084011001208701460d012001207f3703a00820014190056a208601200141a0086a207e208401100120a0016a207e4d0d2d20012903a00821080c020b20014198046a1092010c020b420021080b200141b0056a20014198046a20a5011084041a2080014200370300200142003703f80320a70120a601200141f8036a1002208301208001290300370300200120012903f80337039005024020014190056a2086012085012084012084011001208701460d002001207f3703a00820014190056a208601200141a0086a207e208401100120a0016a207e4d0d2520012903a00821040b208001207f3703002001207f3703f80320aa0120a901200141f8036a1002208301208001290300370300200120012903f803370390050240024020014190056a2086012085012084012084011001208701460d002001207f3703a00820014190056a208601200141a0086a207e208401100120a0016a207e4d0d2720012903a008210e0c010b42e807210e0b200141a0086a200141b0056a20a5011084041a20014190056a200e20047c200141a0086a20a80120a00120022007721b200810e60120012802900520a001470d0020012802940522020d010b208001207f3703002001207f3703f803208201208101200141f8036a1002208301208001290300370300200120012903f8033703900520014190056a2086012085012084012084011001208701470d630c010b208301280200210941e2d1c200410f100f20022009100f0b200141286a41b7b0c000411010e001200129033021ba012001280228210b20014190056a41086a22024200370300200142003703900541cec0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a0080240200141a0086a411041c8d7c400410041001001417f460d00200141003a00b005200141a0086a4110200141b0056a41014100100141016a41014d0d4a20012d00b0050d090b410810222209450d4e2009420037030020014190056a41086a22024200370300200142003703900541c7b0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141003602b805200142013703b005200141013602980420014198046a200141b0056a103e20092903002104024020012802b405220c20012802b80522066b41084f0d00200641086a22022006490d75200c4101742205200220022005491b22054100480d75200c450d0220012802b005200c200510212202450d050c030b20012802b00521020c030b20cc01290300210441002102024020c601a7220920c801460d002009450d1b4100210203402002200920c80176220620026a220c200420bd01200c20c301746a290300541b2102200920066b220920c8014b0d000b0b200420bd01200220c301746a22092903002208520d1b20c6012002ad580d1c2009200920c7016a200220c9017320c601a76a20c301741085041a20be0120c2018320c60120c5018620ca017c8421be0120c60120cb017c21c60120cc0120c7016a22cc0120c401470d610c080b200510222202450d020b200120053602b405200120023602b0052005210c0b200141b0056a41086a200641086a2205360200200220066a2004370000200141a0086a41102002200510030240200c450d00200210200b20091020410810222209450d4b2009420037030020014190056a41086a22024200370300200142003703900541e3c0c000411620014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141003602b805200142013703b005200141013602980420014198046a200141b0056a103e20092903002104024020012802b405220c20012802b80522066b41084f0d00200641086a22022006490d71200c4101742205200220022005491b22054100480d71200c450d0220012802b005200c200510212202450d070c030b20012802b00521020c030b200541011023000b200510222202450d040b200120053602b405200120023602b0052005210c0b200141b0056a41086a200641086a2205360200200220066a2004370000200141a0086a41102002200510030240200c450d00200210200b2009102020014190056a41086a22024200370300200142003703900541a7b0c000411020014190056a1002200141a0086a41086a2209200229030037030020012001290390053703a008200142003703b005200141a0086a4110200141b0056a41081003200141013a00b00520024200370300200142003703900541cec0c000411520014190056a10022009200229030037030020012001290390053703a008200141a0086a4110200141b0056a410110030b410821bb01420021bc0120014190056a41086a22024200370300200142003703900541c7b0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a0080240200141a0086a411041c8d7c400410041001001417f460d002001421037029c042001200141a0086a36029804200141b0056a20014198046a10f40120012802b00522bb01450d4220012902b40521bc010b410821bd01420021be0120014190056a41086a22024200370300200142003703900541e3c0c000411620014190056a1002200141a0086a41086a200229030037030020012001290390053703a0080240200141a0086a411041c8d7c400410041001001417f460d002001421037029c042001200141a0086a36029804200141b0056a20014198046a10f40120012802b00522bd01450d4320012902b40521be010b20014190056a41086a22024200370300200142003703900541f9c0c000411420014190056a1002200141a0086a41086a200229030037030020012001290390053703a008024002400240200141a0086a411041c8d7c400410041001001417f460d00200142003703b005200141a0086a4110200141b0056a41084100100141016a41084d0d29420120012903b00522042004501b21bf0120bc01422088a721c001200b0d020c010b42e50021bf0120bc01422088a721c001200b0d010b20c001417f6a220220c0014b0d39200220c0014f0d3920bb0120024103746a2202450d39200229030021ba010b410020c00141016a220220bf01a76b2209200920024b1b22c10120c0014b0d3942ffffffff0f21c201410321c30120bb0120c1014103746a21c40120c101450d00422021c50120be0142208821c601410821c701410121c801417f21c90142808080807021ca01427f21cb0120bb0121cc01410221570c650b20bc0120c201832108024020c00120c1016b2202450d00024020c101450d0020bb0120c40120024103741085041a0b2002ad42208620088421080b41002102024020be014220882204a7220b450d000240200b4101460d0041002102200b2109034020022009410176220620026a220c20ba0120bd01200c4103746a290300541b2102200920066b220941014b0d000b0b2002200220ba0120bd0120024103746a290300220e566a20ba01200e511b2202200b4b0d3f0b0240024002400240024002400240200b20be01a7470d00200b41016a2209200b490d712004a7220c4101742206200920092006491bad22be01420386220e422088a70d71200ea722094100480d710240200b450d0020bd01200c4103742009102122bd01450d020c010b2009102222bd01450d010b20bd0120024103746a220941086a2009200b20026b4103741085041a200920ba013703002008a72008422088220da72202470d02200241016a22092002490d7020024101742206200920092006491bad2208420386220e422088a70d70200ea722094100480d702002450d0120bb0120024103742009102122bb01450d030c020b200941081023000b2009102222bb01450d010b20bb0120024103746a20ba013703002004a7220741016a220a450d3c200a4101762202200a4f0d3d20bd0120024103746a290300210e0240200a4101710d002002417f6a2202200a4f0d4a20bd0120024103746a290300200e7c420188210e0b20014190056a41086a22024200370300200142003703900541c7b0c000411520014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141003602b805200142013703b0052001200d42017c220da722023602980420014198046a200141b0056a103e024002402002450d00200241037421cd014100200141b0056a41086a220328020022026b210920012802b405210c20bb0121060340200629030021040240024002400240200c20096a41084f0d00200241086a220b2002490d74200c4101742205200b200b2005491b22054100480d74200c450d0120012802b005200c20051021220b0d020c240b20012802b005210b0c020b20051022220b450d220b200120053602b4052001200b3602b0052005210c0b200641086a21062003200241086a2205360200200b20026a2004370000200941786a21092005210220cd0141786a22cd010d000c020b0b200141b0056a41086a280200210520012802b405210c20012802b005210b0b200141a0086a4110200b200510030240200c450d00200b10200b02402008a7450d0020bb0110200b20014190056a41086a22024200370300200142003703900541e3c0c000411620014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200142013703b005200141003602b8052001200a36029804200741037441086a210520014198046a200141b0056a103e410020012802b80522026b210920012802b405210c20bd0121060340200629030021040240024002400240200c20096a41084f0d00200241086a220b2002490d72200c41017422cd01200b200b20cd01491b22cd014100480d72200c450d0120012802b005200c20cd011021220b0d020c1e0b20012802b005210b0c020b20cd011022220b450d1c0b200120cd013602b4052001200b3602b00520cd01210c0b200641086a2106200141b0056a41086a200241086a22cd01360200200b20026a2004370000200941786a210920cd012102200541786a22050d000b200141a0086a4110200b20cd0110030240200c450d00200b10200b024020be01a7450d0020bd0110200b20014190056a41086a220c4200370300200142003703900541a7b0c000411020014190056a1002200141a0086a41086a2202200c29030037030020012001290390053703a0082001200e3703b005200141a0086a4110200141b0056a41081003200d42ffffffff0f8320bf01520d07200c4200370300200142003703900541cdc8c000410d20014190056a10022002200c29030037030020012001290390053703a008420021040240200141a0086a411041c8d7c400410041001001417f460d00200142003703b005200141a0086a4110200141b0056a41084100100141016a41084d0d3120012903b00521040b20014190056a41086a22024200370300200142003703900541fcc1c000411720014190056a1002200141a0086a41086a200229030037030020012001290390053703a008200141a0086a411041c8d7c400410041001001417f460d01200142003703b005200141a0086a4110200141b0056a41084100100141016a41084d0d3120012903b00521080c020b200941081023000b42e80721080b200e20bf014201887c20087c2004560d04200141a0086a109d0120012802a008210b20012802a40821cd0120012802a8082202450d01200241057422094105752203ad42287e2204422088a70d6a2004a722064100480d6a200610222205450d51200b20096a210a2002410574210620052102200b21090340200941086a2900002104200941106a29000021082009290000210e200241186a200941186a290000370000200241106a2008370000200241086a20043700002002200e370000200241206a4201370300200241286a2102200941206a2109200641606a22060d000b200a200b6b41606a41057641016a210220cd01450d030c020b200541011023000b41002103410821054100210220cd01450d010b200b10200b4200210420014190056a41086a22094200370300200142003703900541a7b0c000411020014190056a1002200141f8036a41086a200929030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d3220012903a00821040b200120023602a808200120033602a408200120053602a008200141a0086a20bf01427f7c4201200410f5010b200c4200370300200142003703900541c898c200411d20014190056a1002200141f8036a41086a200c29030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a10f60120012903b00822044202510d3e200141c8086a2802002105200141c4086a2802002107200141c0086a280200210a20012903a808211402400240024002400240024020012903a00822132000520d002005ad221542287e2208422088a741004721092008a721020240024002400240024020044201520d0020090d262002417f4c0d2620012903b80821152002450d0120021022220b450d592005450d030c020b20090d252002417f4c0d252002450d0520021022220b450d59410021cd014100210620050d060c070b4108210b2005450d010b200541286c210c41002106200b2102200a21090340200941086a2903002104200941106a2903002108200941186a290300210e2009290300210d200241206a200941206a290300370300200241186a200e370300200241106a2008370300200241086a20043703002002200d370300200241286a2102200641016a2106200941286a2109200c41586a220c0d000c020b0b410021060b200141c0086a2014370300200141b8086a2015370300200141b4086a2006360200200141b0086a2005360200200141ac086a200b360200200141a8086a4101360200200141023a00a008200141a0086a10df010b201420137c2000520d040c030b4108210b410021cd01410021062005450d010b200541286c210c41002106200b2102200a21090340200941086a2903002104200941106a2903002108200941186a290300210e2009290300210d200241206a200941206a290300370300200241186a200e370300200241106a2008370300200241086a20043703002002200d370300200241286a2102200641016a2106200941286a2109200c41586a220c0d000b0b200141b8086a2014370300200141ac086a200b360200200141a8086a20cd01360200200141b0086a2006ad422086201584370300200141023a00a008200141a0086a10df01201420137c2000520d010b2005ad42287e2204422088a70d1c2004a72202417f4c0d1c0240024002402002450d002002102222cd01450d504100210c4100210620050d010c020b410821cd014100210c410021062005450d010b200541286c210b4100210620cd012102200a21090340200941086a2903002104200941106a2903002108200941186a290300210e2009290300210d200241206a200941206a290300370300200241186a200e370300200241106a2008370300200241086a20043703002002200d370300200241286a2102200641016a2106200941286a2109200b41586a220b0d000b0b200141ac086a2006360200200141a0086a41086a220b2005360200200120cd013602a408200141093a00a008200141a0086a103d02402005450d00200a200541286c6a21034100210c200a21020340200141a0086a41186a2205200241186a290300370300200141a0086a41106a22cd01200241106a290300370300200b200241086a290300370300200120022903003703a008200241206a2903002104410e10222209450d1f200941066a410029009893423700002009410029009293423700002009410e411c10212206450d202006200c36000e412010222209450d21200920012903a008370000200941186a2005290300370000200941106a20cd01290300370000200941086a200b2903003700002009412041c00010212209450d2220092004370020200641122009412810032009102020061020200c41016a210c200241286a22022003470d000b0b02402007450d00200a10200b410e10222202450d46200241066a410029009893423700002002410029009293423700002002410e411c10212202450d47200241106a41002d00a293423a0000200241002f00a093423b000e024002402002411141c8d7c400410041001001417f460d00200141003602a00820024111200141a0086a41044100100141016a41044d0d3a20012802a008210b20021020200b200c4d0d01200c21090340410e10222202450d29200241066a41002900989342220437000020024100290092934222083700002002410e411c10212202450d2a200241106a41002d00a293423a0000200241002f00a093423b000e02402002411141c8d7c400410041001001417f460d00200141003602a00820024111200141a0086a41044100100141016a41044d0d1c20012802a0082106200210200240200620094d0d00410e10222202450d3e200241066a2004370000200220083700002002410e411c10212202450d3f2002200936000e200241121009200210200b200b200941016a2209470d010c030b20021020200b200941016a2209470d000c020b0b200210200b410e10222202450d48200241066a410029009893423700002002410029009293423700002002410e411c10212202450d49200241106a41002d00a293423a0000200241002f00a093423b000e2001200c3602a00820024111200141a0086a410410032002102020014190056a41086a22024200370300200142003703900541c898c200411d20014190056a1002200141f8036a41086a200229030037030020012001290390053703f803200141f8036a411010090c010b2007450d00200a10200b20014190056a41086a22024200370300200142003703900541e8c8c300411420014190056a1002200141f8036a41086a200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a008200141f8036a4110200141a0086a41084100100141016a41084d0d2320012903a00822044200510d40420021ce0120002004824200520d040c010b420021ce0120004201824200520d030b20014190056a41086a220220ce01370300200120ce013703900541fca6c300410c20014190056a1002200141f8036a41086a2209200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142003703a808200142003703a008200141f8036a4110200141a0086a4110410010012206417f460d442006410f4d0d44200141a8086a290300210420012903a00821080c010b42002108420021040b200120083703b006200120043703b806200141b8086a2004370300200141a0086a41106a2008370300200141a0086a41086a41013a00002001410a3a00a008200141a0086a103d200141003a009007420021cf01200142003703b807200142003703b0072002420037030020014200370390054194c9c300411220014190056a10022009200229030037030020012001290390053703f80302400240200141f8036a411041c8d7c400410041001001417f460d00200142103702b4052001200141f8036a3602b005200141a0086a200141b0056a10aa0120012802a00822d001450d4a20012902a40821cf010c010b410421d0010b410021d101410021d20120cf01422088a722d301450d01200141a9086a21d401200141d8046a21d501412021d60120014198046a41206a21d701410821d801200141b0056a41086a21d901410021da01410221db01410121dc01420121dd0141e00021de01410421df01411221e001411021e101412421e201411821e301420021e401411621e501427f21e601200141d8086a21e701200141d0086a21e801200141cc086a21e901410a21ea01417f21eb01410021ec01410021d201410021cd01410321570c610b024002400240024020d201450d0020d00120cd0120db01746a210220d00120cd0120ec016a20db01746a2109034020cd0120d3014f0d1d200141b0056a2002280200220610f70120012903b00520dd01520d0220014198046a20d90120de011084041a20012903b006220d200129039804220e54200141b0066a20d8016a290300220820014198046a20d8016a29030022045420082004511b450d03200120dc013a00900720ec0120cd016a220620d3014f0d2620092002280200360200200220df016a2102200920df016a210920d30120cd0120dc016a22cd01470d000c050b0b20d00120cd0120db01746a2102034020cd0120d3014f0d1c200141b0056a2002280200220610f70120012903b00520dd01520d0120014198046a20d90120de011084041a20012903b006220d200129039804220e5a200141b0066a20d8016a290300220820014198046a20d8016a29030022045a20082004511b0d02200120dc013a009007200220df016a210220d30120cd0120dc016a22cd01470d000c030b0b20ec0120eb016a21ec0120d20120dc016a21d20120cd0120dc016a22cd0120d301470d560c020b20cd0120dc016a21cd012001200d200e7d3703b0062001200820047d200d200e54ad7d3703b80620e00110222202450d49200220e1016a20da012f0098a7433b0000200220d8016a20da01290090a743370000200220da01290088a743370000200220e00120e20110212202450d4a2002200636001220014190056a20e3016a220920e40137030020014190056a20e1016a220c20e40137030020014190056a20d8016a220b20e401370300200120e40137039005200220e50120014190056a1000200141f8036a20e3016a2009290300370300200141f8036a20e1016a200c290300370300200141f8036a20d8016a200b29030037030020012001290390053703f803200141f8036a20d60110092002102020d70120014198046a20e1016a29030020014198046a20e3016a29030010e501200141186a20d501200e200410f801200141b0076a20d8016a220220e60120022903002208200141186a20d8016a2903007c20012903b007220d20012903187c2214200d542202ad7c220d2002200d200854200d2008511b22021b370300200120e601201420021b3703b00720e701200437030020e801200e370300200141a0086a20d8016a20db013a000020e901200636020020d40120d50129000037000020d40120d8016a20d50120d8016a29000037000020d40120e1016a20d50120e1016a29000037000020d40120e3016a20d50120e3016a290000370000200120ea013a00a008200141a0086a103d20ec0120eb016a21ec0120d20120dc016a21d20120cd0120d301470d540c010b410021d2010b20014190056a41086a2216420037030020014200370390054194c9c300411220014190056a1002200141f8036a41086a201629030037030020012001290390053703f803200120d1013602a808200142013703a008200120d30120d2016b22163602b005200141b0056a200141a0086a103e024002402016450d0020d30141027420d2014102746b2184014100200141a0086a41086a22860128020022166b214620012802a408212220d001211b0340201b28020021480240024002400240202220466a41044f0d00201641046a22022016490d6a20224101742209200220022009491b22094100480d6a2022450d0120012802a00820222009102122020d020c280b20012802a00821020c020b200910222202450d260b200120093602a408200120023602a008200921220b201b41046a211b208601201641046a2209360200200220166a20483600002046417c6a214620092116208401417c6a2284010d000c020b0b200141a0086a41086a280200210920012802a408212220012802a00821020b200141f8036a411020022009100302402022450d00200210200b024020cf01a7450d0020d00110200b20012903b007200141b0076a41086a29030010f901024020012d0090070d004200217f20014190056a41086a22164200370300200142003703900541a6c9c300410d20014190056a1002200141f8036a41086a201629030037030020012001290390053703f8030240200141f8036a411041c8d7c400410041001001417f460d00200141003602a008200141f8036a4110200141a0086a41044100100141016a41044d0d4320013502a008217f0b200141086a20012903b00622304200207f4200108804200141b0066a41086a22162016290300227f207f420042edeb82bdef9804200129030842c0843d8020012903104200521b22042030564100207f501b22161b22347d20302030200420161b227f54ad7d37030020012030207f7d3703b006200141b8086a2034370300200141b0086a207f370300200141a0086a41086a41033a00002001410a3a00a008200141a0086a103d0b20012903b0062130200141b8086a200141b0066a41086a2216290300370300200141a0086a41106a2030370300200141a0086a41086a41043a00002001410a3a00a008200141a0086a103d2016290300213020012903b006217f20014190056a41086a22164200370300200142003703900541fca6c300410c20014190056a1002200141f8036a41086a201629030037030020012001290390053703f803200120303703a8082001207f3703a008200141f8036a4110200141a0086a411010030b20014190056a41086a221620ce01370300200120ce013703900541f0e2c200411120014190056a1002200141a0086a41086a201629030037030020012001290390053703a008200141a0086a41101009200141a0096a24000f0b411041011023000b412041011023000b41c00041011023000b411b41011023000b413b41011023000b41f60041011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410010fa01000b200220042008566a10fa01000b4194c4c100102f000b419ca7c300102f000b419ca7c300102f000b20cd0141011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200541011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41ccc4c10020cd0120d30110b501000b1031000b410e41011023000b411c41011023000b412041011023000b41c00041011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41a4c5c100200620d30110b501000b200941011023000b410e41011023000b411c41011023000b411741011023000b412e41011023000b419a88c00041331039000b419a88c00041331039000b200641081023000b411841011023000b413841011023000b419a88c00041331039000b411c41011023000b413c41011023000b419a88c00041331039000b200941081023000b418dc1c00041261039000b418cb8c400102f000b41e4c1c000102f000b41d4b2c0002002200a10b501000b419a88c00041331039000b410e41011023000b411c41011023000b41c0b8c400102f000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41fcc8c300102f000b410841081023000b410841081023000b41d4b2c0002002200a10b501000b419a88c00041331039000b419a88c00041331039000b410e41011023000b411c41011023000b410e41011023000b411c41011023000b419a88c00041331039000b411241011023000b412441011023000b200241081023000b200641081023000b200241081023000b200241081023000b410021570c0a0b410021570c0a0b410021570c0a0b410121570c0b0b410221570c0c0b410321570c0d0b410321570c0d0b410121020c0d0b410021020c0c0b410121020c0b0b410221020c0a0b410321020c090b410321020c080b410321020c070b410321020c060b410321020c050b410321020c040b410321020c030b410321020c020b410321020c010b410321020c000b0b1024000ba00905027f017e037f027e097f230041d0006b220124004108210242002103200141186a41086a220442003703002001420037031841c0c8c000410d200141186a1002200141086a41086a2004290300370300200120012903183703084100210502400240024002400240024002400240024002400240200141086a411041c8d7c400410041001001417f460d00200142103702442001200141086a360240200141186a200141c0006a108a0220012802182202450d05200129021c2103200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a290300370300200141186a41086a200041086a290300370300200120002903003703182003422088a722052003a7470d02200141186a210020052003a7460d010c070b200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a2903003703002004200041086a29030037030020012000290300370318200141186a210041004200a7470d060b200541016a22042005490d0720054101742206200420042006491bad220742287e2208422088a70d072008a722044100480d072005450d012002200541286c200410212202450d020c040b200141186a21000c050b2004102222020d020b200441081023000b419a88c00041331039000b20034280808080708320078421030b2003422088a721050b2002200541286c22066a22042000290300370300200441206a200041206a290300370300200441186a200041186a290300370300200441106a200041106a290300370300200441086a200041086a290300370300200141186a41086a220942003703002001420037031841c0c8c000410d200141186a1002200141086a41086a20092903003703002001200129031837030820014100360248200142013703402001200541016a220a360218200141186a200141c0006a103e02400240200a450d00200641286a210b200141c0006a41086a220c28020021002001280244210d200221060340200141186a2006109a012001280218210e0240024002400240200d20006b2009280200220f4f0d002000200f6a22042000490d07200d4101742210200420042010491b22114100480d07200d450d012001280240200d2011102122100d020c080b2000200f6a2104200128024021100c020b201110222210450d060b20012011360244200120103602402011210d0b200c2004360200201020006a200e200f1084041a0240200128021c450d00200e10200b200641286a210620042100200b41586a220b0d000c020b0b200141c0006a41086a28020021042001280244210d200128024021100b200141086a41102010200410030240200d450d00201010200b0240200a450d00200541286c41286a2104200221000340024020002d00002206450d00024020064101470d00200041086a280200450d01200041046a2802001020200041286a2100200441586a22040d020c030b200041106a280200450d002000410c6a28020010200b200041286a2100200441586a22040d000b0b02402003a7450d00200210200b200141d0006a24000f0b1024000b201141011023000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1002200341086a2005290300370300200320032903103703000240024002402003411041c8d7c400410041001001417f460d002003420037031020034110200341106a41084100100141016a41084d0d0220032903102106200341101009420121040c010b0b2000200437030020002006370308200341206a24000f0b419a88c00041331039000beeab012e017f027e027f037e0e7f017e027f017e037f017e037f037e177f027e027f017e097f027e117f027e1f7f027e057f017e087f037e0e7f037e017f017e137f017e027f027e077f027e027f017e077f017e0b7f017e047f027e0a7f027e230041c0096b2202240002400240024002400240024002400240024002402001450d00200241e0056a41086a22014200370300200242003703e00541fc95c2004117200241e0056a100220024198046a41086a2001290300370300200220022903e00537039804024002400240024002400240024020024198046a411041c8d7c400410041001001417f460d00200242003703e80720024198046a4110200241e8076a41084100100141016a41084d0d0220022903e80721030c010b420321030b200241e0056a41086a22014200370300200242003703e00541b8adc2004115200241e0056a1002200241d8046a41086a2001290300370300200220022903e0053703d80402400240200241d8046a411041c8d7c400410041001001417f460d00200242003703e807200241d8046a4110200241e8076a41084100100141016a41084d0d034200210420022903e80720037e22034200510d010c050b4200210442e80720037e22034200520d040b200241e0056a41086a22012004370300200220043703e00541a299c400411c200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e0060240200241e0066a411041c8d7c400410041001001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012201417f460d032001410f4d0d03200241f0076a290300210320022903e80721040c050b420021030c040b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b2000200320032000541b22002004510d0442002104200241e0056a41086a22014200370300200242003703e00541a299c400411c200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e0062003421086200080210002400240200241e0066a411041c8d7c400410041001001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012201417f460d052001410f4d0d05200241f0076a290300210320022903e80721040c010b420021030b20024188046a200420032000420010880420022903880442108820024190046a2903002200423086842104200042108821030b200241e0056a41086a22014200370300200242003703e00541d899c4004118200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012206417f460d032006410f4d0d03200241f0076a290300210720022903e80721000c010b42002100420021070b20014200370300200242003703e00541d899c4004118200241e0056a100220052001290300370300200220022903e0053703e0062002200020047c22043703e8072002200720037c2004200054ad7c3703f007200241e0066a4110200241e8076a411010030b200241e0056a41086a22014200370300200242003703e00541a4adc2004114200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006420021040240024002400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0120022903e80721040b20014200370300200242003703e00541f4edc3004115200241e0056a100220052001290300370300200220022903e0053703e0060240200241e0066a411041c8d7c400410041001001417f460d00200241e0066a411010090c070b200241e0056a41086a22014200370300200242003703e00541f099c400411b200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006420021000240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0220022903e80721000b20014200370300200242003703e005418b9ac4004116200241e0056a100220052001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0420022903e80722034200520d0141a49ac400102f000b42e80721030b200420007d2003824200520d070c060b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41c099c400102f000b42002104200241e0056a41086a22014200370300200242003703e00541d899c4004118200241e0056a100220024198046a41086a2001290300370300200220022903e0053703980402400240024002400240024020024198046a411041c8d7c400410041001001417f460d00200242003703f007200242003703e80720024198046a4110200241e8076a4110410010012201417f460d012001410f4d0d01200241f0076a290300210820022903e807210920024198046a41101009420121042009200884500d030c040b420042008450450d030c010b419a88c00041331039000b410121010c020b410121010c010b024002402004a7450d00200241e0056a41086a22014200370300200242003703e00541bc9ac4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e0064100210a02400240024002400240200241e0066a411041c8d7c400410041001001417f460d00200242103702dc042002200241e0066a3602d804200241e8076a200241d8046a103820022802e807220b450d0220022802ec07210c200241f0076a280200220a41057422010d010c040b4101210b4100210c41004105742201450d020b200b20016a210d4120210e4112210f41102110410021114108211241322113412a21144118211541222116411a21174200211841c8d7c4002119417f211a4201211b20024190086a211c4130211d2002418c086a211e4220211f200b2120410021210c040b419a88c00041331039000b410021010c030b410021010c020b410121010c010b410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010212120b200241e8026a20092008200aad2203420010880420024180086a2008370300200241e8076a41106a2009370300200241e8076a41086a41003a0000200241043a00e807200241e8076a103d200241e0056a41086a22014200370300200242003703e00541d29ac4004111200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006200241e0066a411041c8d7c4004100410010012101200241e8026a41086a290300210420022903e8022100024002402001417f460d00200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012201417f460d0f2001410f4d0d0f200241f0076a290300210720022903e80721230c010b42002123420021070b200241d8026a202320072003420010880402402000200484500d0020022903d8022203200241d8026a41086a290300222384500d0042002107200241e0056a41086a22014200370300200242003703e005418feec0004116200241e0056a100220024198046a41086a22052001290300370300200220022903e005370398040240024020024198046a411041c8d7c400410041001001417f460d00200242003703f007200242003703e80720024198046a4110200241e8076a4110410010012206417f460d112006410f4d0d11200241f0076a290300212520022903e80721240c010b42002124420021250b200241c8026a202420037d202520237d2024200354ad7d20032023108704200241b8026a20022903c802200241c8026a41086a2903002000200410880420014200370300200242003703e00541fca6c300410c200241e0056a100220052001290300370300200220022903e0053703980420024198046a411041c8d7c4004100410010012101200241b8026a41086a290300210420022903b8022100024002402001417f460d00200242003703f007200242003703e80720024198046a4110200241e8076a4110410010012201417f460d122001410f4d0d12200241f0076a290300210320022903e80721070c010b420021030b200241e0056a41086a22014200370300200242003703e00541fca6c300410c200241e0056a100220024198046a41086a2001290300370300200220022903e005370398042002200720007c22003703e8072002200320047c2000200754ad7c3703f00720024198046a4110200241e8076a411010030b200c450d12200b1020410121010c3d0b200241e0056a41086a22014200370300200242003703e00541e39ac4004112200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0320022903e80742017c21040c010b420121040b200241e0056a41086a22014200370300200242003703e00541e39ac4004112200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006200220043703e807200241e0066a4110200241e8076a4108100320014200370300200242003703e00541f59ac400411a200241e0056a100220052001290300370300200220022903e0053703e0060240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d03200220022903e80722043703d804200241e0056a41086a22014200370300200242003703e005418b9ac4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d06200420022903e807520d010c020b200442e807510d010b200241e0056a41086a22014200370300200242003703e005418b9ac4004116200241e0056a1002200241e0066a41086a22052001290300370300200220022903e0053703e006200220043703e807200241e0066a4110200241e8076a4108100320014200370300200242003703e00541a4adc2004114200241e0056a100220052001290300370300200220022903e0053703e006420021040240200241e0066a411041c8d7c400410041001001417f460d00200242003703e807200241e0066a4110200241e8076a41084100100141016a41084d0d0820022903e80721040b20014200370300200242003703e00541f099c400411b200241e0056a100220052001290300370300200220022903e0053703e006200220043703e807200241e0066a4110200241e8076a410810030b200241e0056a41086a22014200370300200242003703e005418f9bc4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006410021260240200241e0066a411041c8d7c400410041001001417f460d00200241003602e807200241e0066a4110200241e8076a41044100100141016a41044d0d0520022802e80721260b200241e0056a41086a22014200370300200242003703e00541a59bc400411d200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006024002400240200241e0066a411041c8d7c400410041001001417f460d00200241003602e80741012127200241e0066a4110200241e8076a41044100100141016a41044d0d0820022802e807220141024f0d010c020b410421010b200121270b200241d8046a41186a22014200370300200241d8046a41106a22054200370300200241d8046a41086a22064200370300200242003703d80441dceec300411a200241d8046a1000200241e0066a41186a2001290300370300200241e0066a41106a2005290300370300200241e0066a41086a2006290300370300200220022903d8043703e006410021050240200241e0066a412041c8d7c400410041001001417f460d00200241e0056a41186a4200370300200241e0056a41106a4200370300200241e0056a41086a4200370300200242003703e005200241e0066a4120200241e0056a4120410010012201417f460d082001411f4d0d08200241e8076a41186a2201200241e0056a41186a290300370300200241e8076a41106a2205200241e0056a41106a290300370300200241e8076a41086a2206200241e0056a41086a290300370300200220022903e0053703e807200241d8046a41186a2001290300370300200241d8046a41106a2005290300370300200241d8046a41086a2006290300370300200220022903e8073703d804410121050b412810222201450d0a200120053a0004200141c8d7c400360200200120022903d804370005200120022f0098093b00252001410d6a200241d8046a41086a2205290300370000200141156a200241d8046a41106a22062903003700002001411d6a200241d8046a41186a2228290300370000200141276a2002419a096a2d00003a0000202842003703002006420037030020054200370300200242003703d80441c29bc400411a200241d8046a1000200241e0066a41186a2028290300370300200241e0066a41106a2006290300370300200241e0066a41086a2005290300370300200220022903d8043703e006410021050240200241e0066a412041c8d7c400410041001001417f460d00200241e0056a41186a4200370300200241e0056a41106a4200370300200241e0056a41086a4200370300200242003703e005200241e0066a4120200241e0056a4120410010012205417f460d092005411f4d0d09200241e8076a41186a2205200241e0056a41186a290300370300200241e8076a41106a2206200241e0056a41106a290300370300200241e8076a41086a2228200241e0056a41086a290300370300200220022903e0053703e807200241d8046a41186a2005290300370300200241d8046a41106a2006290300370300200241d8046a41086a2028290300370300200220022903e8073703d804410121050b412810222228450d0b202820053a0004202841c8d7c400360200202820022903d804370005202820022f0098093b00252028410d6a200241e0046a290300370000202841156a200241d8046a41106a2903003700002028411d6a200241d8046a41186a290300370000202841276a20024198096a41026a2d00003a0000200241003602c004200242083703b804200241f8086a41186a200241b8096a3602002002410036028809200241dc9bc4003602fc08200220013602f8082002200241b8046a36028c092002200241b8096a360284092002200241b8096a36028009200241e8076a200241f8086a10f702024002400240024020022d00e80822054102470d00200241023a00e0070c010b200241e0056a200241e8076a4180011084041a2002200241e8076a4184016a28000036009b04200220022800e90836029804200241e8076a41046a200241e0056a4180011084042121200241f8086a41106a4101360200200241d8046a200241e8076a4184011084041a200241003602e807200241e8076a410472200241d8046a4184011084041a200241e8076a4188016a20053a0000200241f1086a200228029804360000200241f4086a200228009b04360000200241e0066a2002418c096a200241e8076a104020022d00e0074102470d010b41002129200241003602d004200242083703c804200110204108212a4108212b4108212c4100212d0c010b200241e8076a200241e0066a4188011084041a200241d8046a200110ba034188011022222a450d10202a200241e8076a4188011084041a20024198096a41186a200241f8086a41186a28020036020020024198096a41106a222e200241f8086a41106a29030037030020024198096a41086a200241f8086a41086a290300370300200220022903f80837039809200241e8076a20024198096a10f702024002400240024020022d00e808222f4102470d004101212d410121290c010b200241f1086a212d200241e8076a410472212b200241ac096a2130200241e9086a212c202e280200213141022106418801210541002101410121290340200241e0056a200241e8076a4180011084041a2002202c41036a28000036009b042002202c280000360298042021200241e0056a4180011084041a202e203120016a222241016a360200200241d8046a200241e8076a4184011084041a200220223602e807202b200241d8046a4184011084041a200241e8076a4188016a202f3a0000202d200228029804360000202d41036a200228009b04360000200241e0066a2030200241e8076a1040200241e0066a4180016a2d00004102460d02200241e8076a200241e0066a4188011084041a0240200141016a22222029470d00200241d8046a200228029809200228029c09280210110500202241016a222f2022490d442006202f202f2006491b2229ad4288017e2204422088a70d442004a7222f4100480d4402402001417f460d00202a2005202f1021222a0d010c100b202f1022222a450d0f0b202a20056a200241e8076a4188011084041a200641026a210620054188016a2105200241e8076a20024198096a10f70220222101200241e8076a4180016a2d0000222f4102470d000b202241016a212d0b202a212b200241e0076a41023a00000c010b200141016a212d202a212b0b2002280298092205200228029c09220128020011060002402001280204450d00200510200b2002202d3602d004200220293602cc042002202a3602c804202b212c0b200241e0066a20281080032002280280072230450d2241012132200241d8046a410172213341282134200241e0066a41286a213541242136200241e0066a41246a213741182138411021394108213a4120213b200241e8076a41206a213c42d000213d4220213e417f213f410521404200214141162142418feec00021434100214441c8d7c400214541d000214641342147413c214841c4002149410f214a427e214b427f214c418801214d419f04214e41e000214f41e801215041f002215141f803215241a004215341c800215441c0002155413821564130215741cc002158410121210c140b209b01450d22209b01208e016a219b01209c0120706a2101209c0120686a2265219c0120012d00000d112065208e016a229c0120736a219d012065209a01470d170c160b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b202f41081023000b412841041023000b412841041023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41880141081023000b024002400240024002400240024002400240024002400240024002400240024002400240024020210e050001020304040b2020450d11200f10222201450d0a200120106a20112f00cdcf433b0000200120126a20112900c5cf43370000200120112900bdcf433700002001200f201310212201450d0b20012020290000370012200120146a202020156a290000370000200120166a202020106a290000370000200120176a202020126a290000370000200241d8046a20156a22052018370300200241d8046a20106a22062018370300200241d8046a20126a22222018370300200220183703d80420012013200241d8046a1000200241e0056a20156a2005290300370300200241e0056a20106a2006290300370300200241e0056a20126a2022290300370300200220022903d8043703e00502400240200241e0056a200e2019201120111001201a460d002002201f3702ec072002200241e0056a3602e80720024180046a200241e8076a108e01200228028004450d0b200241e8036a200241e8076a108c0120022903e803a7450d0b200241e8036a20106a290300210420022903f00321030c010b42002103420021040b2001102042002100200242003703e806200242003703e006024002402009200320092003200954200420085420042008511b22011b22237d220320082004200820011b22247d2009202354ad7d220784500d00200241e8076a202010b201200241e8076a20126a2903002204201820022903e8072200201b5620042018522004501b22011b21042000201b20011b2100200241e8076a200e6a28020021060240201c2802002201450d002000200484500d1020062001201d6c6a2105200621010340200241c0036a2001290300200120126a29030020032007108804200241b0036a20022903c003200241c0036a20126a29030020002004108704200241d0036a200120106a20022903b003200241b0036a20126a29030010bb03200241e0066a20022903d00320022903d803200241d0036a20106a29030010a0022001201d6a22012005470d000b0b20002004842018510d0e200241a0036a200241e8076a20106a290300200241e8076a20156a2903002003200710880420024190036a20022903a003200241a0036a20126a2903002000200410870420024190036a20126a29030021042002290390032100201e280200450d01200610200c010b420021040b200241f8026a2020200020237c2203200420247c2003200054ad7c10bb03200241e0066a20022903f802200229038003200241f8026a20106a29030010a00220022903e006200241e0066a20126a29030010f9012020200e6a220121202001200d470d0f410021010c3d0b203528020021592037280200215a20024198096a20386a225b200241e0066a20386a29030037030020024198096a20396a225c200241e0066a20396a29030037030020024198096a203a6a225d200241e0066a203a6a290300370300200220022903e00637039809200241d8046a20024198096a10f80202400240024020022d00d8042032470d00200241e0056a20386a203320386a290000370300200241e0056a20396a203320396a290000370300200241e0056a203a6a2033203a6a290000370300200220332900003703e005200241e8076a200241e0056a10b101203c2802002201450d01200241e8076a203a6a290300215e20022903e807215f200241e8076a20366a280200450d02200110200c020b203c20443602000b4200215f4200215e0b2059ad203d7e2204203e88a70d2a2004a72201203f4c0d2a0240024002402001450d00200110222260450d0920592040742201450d020c010b4108216020592040742201450d010b203020016a21614100216220302163410021640c1a0b410021620c210b0240202d450d00202b20706a2101206921050340024020012d0000450d00200120686a21012005208e016a22050d010c020b20012093016a290300220420900120042090015620012092016a2903002204208f01522004501b22061b22002004208f0120061b220484208f01510d04200241e8016a2091012091012000200410870420012094016a200241e8016a206c6a2903003703002001208d016a20022903e801370300200120686a21012005208e016a22050d000b0b20022802b804229601206d280200229701206e6c6a219801209701450d15209601219901410121640c190b20a8012802282201450d1e20a80128022022c901200120a7016c6a21ca0120a80120aa016a21cb01410321640c190b20ce0120d2016a290300210420ce012903002100200241e0066a20d3016a222e20ce0120de016a290000370300200241e0066a20d4016a22a30120ce0120df016a290000370300200241e0066a20d2016a22a50120ce0120e0016a290000370300200220ce012900603703e00620ce01280228222fad20e1017e220320e20188a70d272003a7220520e3014c0d2720ce0120d3016a290300210320ce01290310210720ce01280220210102400240024002402005450d00200510222221450d08202f450d020c010b41082121202f450d010b2001202f20d7016c6a212241002106202121050340200520012903003703002005200120d2016a290300370308200520d1016a200120d1016a290300370300200520cc016a200120cc016a290300370300200520d3016a200120d3016a290300370300200520d4016a200120d4016a290300370300200520d7016a2105200620d5016a2106200120d7016a22012022470d000c020b0b410021060b200241e8076a20d3016a200337030020dd01200737030020e401200636020020e501202f36020020e6012021360200200220003703e807200220043703f00720e70110222201450d01200120e8016a20cf012900fdee43370000200120cf012900f6ee43370000200120e70120e90110212231450d02203120022903e00637000f203120ea016a202e290300370000203120eb016a20a301290300370000203120ec016a20a501290300370000200241d8046a20d3016a220120ed01370300200241d8046a20d4016a220520ed01370300200241d8046a20d2016a222220ed01370300200220ed013703d804203120e901200241d8046a1000200241e0056a20d3016a2001290300370300200241e0056a20d4016a2005290300370300200241e0056a20d2016a2022290300370300200220022903d8043703e005202220cf01360200200220ee013703d8042002200241e8076a3602f808200241f8086a200241d8046a109801200220dd013602f808200241f8086a200241d8046a10980120e6012802002101200220e40128020022053602f808200241f8086a200241d8046a103e024002402005450d00200520d7016c212f0340024002400240024020022802dc042206202228020022056b20cc014f0d00200520cc016a22212005490d42200620d50174222e20212021202e491b222120cf01480d422006450d0120022802d80420062021102122060d020c060b20022802d80421060c020b202110222206450d040b200220213602dc04200220063602d8040b2022200520cc016a360200200620056a220520d2016a200120d3016a290000370000200520d4016a200120cc016a290000370000200520d3016a200120d1016a2900003700002005200120d4016a290000370000200220013602f808200241f8086a200241d8046a109801200120d7016a2101202f20d6016a222f0d000b0b200020d001542101200420dc01512105200420dc0154210620022802dc04212f200241e0056a20cc0120022802d8042221202228020010030240202f450d00202110200b2001200620051b210120ce0120da016a21ce0120311020024020e501280200450d0020e60128020010200b200420dc0120011b21dc01200020d00120011b21d00120ce0120db01470d0d200241e0056a41086a22654200370300200242003703e00541d29ac4004111200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200220dc013703f007200220d0013703e807200241e0066a4110200241e8076a4110100320d8014188016c22654188016d217a024002402065450d00207aad4205862204422088a70d3e2004a722014100480d3e2001102222d401450d0d20d801450d010c1d0b410121d4014100217a20d8010d1c0b4100217320d9010d1c0c1d0b202141011023000b41d8d0c400102f000b410f41011023000b412f41011023000b200141081023000b200541081023000b419a88c00041331039000b411241011023000b413241011023000b41c099c400102f000b41c099c400102f000b200141011023000b410021210c040b410421210c050b410021010c2b0b410121010c2a0b410221010c290b410321010c280b410321010c270b410321010c260b410021010c050b410221010c040b410121010c030b410321010c020b410321010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010204040b209501206b6a219501202c202d20686c6a219a012069219b01202c2165024002400240024003402065219c01209a0120656b206f4d0d07209c0120706a2d0000450d01209c0120716a2d0000450d02209c0120746a2d0000450d03209b0120766a219b01209c0120776a2165209c0120786a2d00000d000b410321010c030b209c0120736a219d01209c0120686a2265209a01470d160c150b209c0120726a2165410121010c010b209c0120756a2165410221010b209c01200120686c6a229c0120736a219d012065209a01460d11410121010c270b209d01206c6a2903002104209d0129030021000340206520686a21010240206520706a2d0000450d0020012165206a2001470d010c150b20652085016a29030022032004206520736a2903002207200054200320045420032004511b22051b21042007200020051b21002065209c0120051b219c0120012165206a2001470d000b410221010c260b209c01206b3a008001209701450d02209c012085016a219e01209c01208c016a219f01410221640c160b410221010c440b02400240024020640e0400010204040b20632201450d2a2001203b6a2163202c202d204d6c6a212f41002105202c2106024002400340202f20066b204e4d0d012006204f6a22222001460d02200520222001203b10860422222044476a21052022450d02200620506a22222001460d02200520222001203b10860422222044476a21052022450d02200620516a22222001460d02200520222001203b10860422222044476a21052022450d02200620526a22222001460d02200520222001203b10860422222044476a2105200620536a210620220d000c020b0b02402006202f460d0003402006204f6a22062001460d02200520062001203b10860422222044476a21052022450d02200620346a2206202f470d000b0b20632061470d0c0c2b0b202c2005204d6c22066a22222903402104202220546a2903002100200241e0056a203a6a22222041370300200220413703e00520432042200241e0056a100220024198046a203a6a2022290300370300200220022903e0053703980402400240024020024198046a20392045204420441001203f460d00200220413703f007200220413703e80720024198046a2039200241e8076a2039204410012222203f460d082022204a4d0d08420121034200210720022903e8072224204b54200241e8076a203a6a29030022235020234201511b0d01200241a8026a20242023204c2041108704200241a8026a203a6a290300210720022903a8022103202d20054b0d020c090b42002107420121030b202d20054d0d070b20024198026a205f205e20032007108704202c20066a220620546a204c200020042002290398027c22032004542222ad7c220720222007200054200320045a1b22221b3703002006204c200320221b370340200241e8076a20386a2206200120386a290000370300200241e8076a20396a2222200120396a290000370300200241e8076a203a6a222f2001203a6a290000370300200220012900003703e807024020592062470d00205920326a22012059490d482059203274222e20012001202e491b2201ad203d7e2204203e88a70d482004a7222e2044480d48024002402059450d002060205920466c202e102122600d010c0a0b202e10222260450d090b200121590b2060206220466c6a220120443602242001200536022020012041370300200120386a2041370300200120396a20413703002001203a6a2041370300202f2903002104202229030021002006290300210320022903e8072107200120443a0048200120556a2003370300200120566a2000370300200120576a200437030020012007370328200120586a200228009b043600002001200228029804360049206220326a216220632061470d0c0c2a0b02402099012802282201450d002001206e6c2106209901280220208b016a21010340202d200128020022054d0d050240202c200520686c6a22052d0080010d002005290340220420052083016a290300220084500d0020024198016a209001208f012099012903002203208f01108804200241a8016a209901206c6a2903002207208f01208f01208f01108804200241d8016a2003208f01208f01208f01108804200241c8016a20910120022903d801200720022903b0018420022903a00184208f0152200241d8016a206c6a290300220320022903a8012002290398017c7c22072003547222221b209101200720221b20042000108704200241b8016a209901207a6a290300208f0120022903c801200241c8016a206c6a29030010880420052085016a222220910120222903002204200241b8016a206c6a2903007c2005290330220020022903b8017c22032000542222ad7c22002022200020045420002004511b22221b3703002005209101200320221b3703300b2001206e6a21012006208d016a22060d000b0b209901206e6a229901209801470d0c410021010c240b209601206e6a212e02402096012802282205450d0020960128022021012005206e6c210503400240209e012001460d0020012087016a209f01208b01108604450d002001206e6a21012005208d016a22050d010c020b209601207a6a22062903002104209e0129030021002001209c0120736a22222903002203209601207c6a222f29030022077d3703002001200020047d2003200754ad7d370308202229030021042006209e01290300370300202f20043703002001206e6a21012005208d016a22050d000b0b202e219601202e209801470d0c0b200241e8076a207a6a222e209c0120796a290300370300207d209c01207b6a290300370300200241e8076a206c6a222b209c01207e6a2903003703002002209c012903603703e807209c01280228222fad207f7e220420800188a70d302004a722052081014c0d30209c01207a6a2903002104209c01206c6a2903002100209c012802202101209c012903102103209c01290300210702400240024002402005450d00200510222221450d09202f450d020c010b41082121202f450d010b2001202f20736c6a2122410021062021210503402005200129030037030020052001206c6a29030037030820052087016a20012087016a2903003703002005208b016a2001208b016a2903003703002005207a6a2001207a6a2903003703002005207c6a2001207c6a290300370300200520736a21052006206b6a2106200120736a22012022470d000c020b0b410021060b209c0120706a2d00002131209c012082016a2903002123209c01206e6a2903002124209c012083016a2903002125209c012084016a29030021a001209c012085016a29030021a101209c0120736a29030021a201024002400240024020022802ac04200241a8046a206c6a22052802002201470d002001206b6a22222001490d482001206b7422a3012022202220a301491b22a301ad2086017e22a40120800188a70d4820a401a722a5012067480d482001450d0120022802a804200120686c20a501102122220d020c0a0b20022802a80421220c020b20a50110222222450d080b200220a3013602ac04200220223602a804200528020021010b2022200120686c6a22012024370350200120a001370340200120a20137033020012003370310200120003703082001200737030020012021360220200120022903e807370360200120312067473a008001200120022800e0063600810120012082016a202337030020012083016a202537030020012085016a20a1013703002001207a6a200437030020012087016a200636020020012088016a202f3602002001207e6a202b2903003703002001207b6a207d290300370300200120796a202e29030037030020012089016a208a0128000036000020052005280200206b6a360200202c212b2095012066490d070c290b20c901222220ab016a2105202220a7016a21c90120022802a804220620ac0128020020ad016c6a212e0240024002400340202e200622016b20ae014d0d03200120af016a22062005460d182006200520b001108604450d18200120b1016a22062005460d012006200520b001108604450d01200120b2016a22062005460d022006200520b001108604450d020240200120b4016a222f2005460d00200120b6016a2106202f200520b0011086040d010b0b200120b5016a21010c170b200120ad016a21010c160b200120b3016a21010c150b2001202e460d150340200120af016a22062005460d152006200520b001108604450d15200620ab016a2201202e470d000c160b0b419487c0002005202d10b501000b419a88c00041331039000b419487c0002005202d10b501000b202e41081023000b200541081023000b20a50141081023000b41022121410321010c3a0b410021640c070b410021640c070b410121640c070b410221640c080b410221010c150b410221010c140b410121010c130b410221010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b202220b7013a0048200241e8006a20a80120a6016a290300220020b8012022290300220420b801108804200241f8006a202220a6016a290300220320b80120a801290300220720b80110880420024188016a200720b801200420b80110880420a80120ba016a290300220420bb01200420bb015620a80120b9016a290300220420b801522004501b22051b2207200420b80120051b220484500d04200241d8006a20bc01200229038801200020b80152200320b8015271200229037020b801527220022903800120b801527220024188016a20a6016a2903002200200229036820022903787c7c22032000547222051b20bc01200320051b20072004108704202220b9016a2206200241d8006a20a6016a2903002200370300202220022903582203370310200120bd016a220520bc012000200529030022047c2003200129035022007c22032000542205ad7c22002005200020045420002004511b22051b370300200120bc01200320051b37035020cb01200120af016a2205460d00200520cb0120b001108604450d0020062903002123202220ba016a22222903002124200120a6016a290300210420012903002100200241e0056a20a6016a220520b801370300200220b8013703e00520bf0120be01200241e0056a1002200241d8046a20a6016a222f2005290300370300200220022903e0053703d80402400240200241d8046a20ba0120c10120c00120c001100120c201460d00200220b8013703f007200220b8013703e807200241d8046a20ba01200241e8076a20ba0120c0011001222e20c201460d07202e20c7014d0d07420121034200210720022903e80722a00120c80154200241e8076a20a6016a29030022255020254201511b0d01200241c8006a20a001202520bc0120b801108704200241c8006a20a6016a2903002107200229034821030c010b42002107420121030b200241386a2003200720242023108804200120bc012004200241386a20a6016a2903007c200020022903387c2203200054222ead7c2200202e200020045420002004511b222e1b370308200120bc012003202e1b370300200241e8076a20b9016a222e20cb0120b9016a290000370300200241e8076a20ba016a223120cb0120ba016a290000370300200241e8076a20a6016a22a30120cb0120a6016a290000370300200220cb012900003703e8072006290300210320222903002107200520b801370300200220b8013703e00520bf0120be01200241e0056a1002202f2005290300370300200220022903e0053703d80402400240200241d8046a20ba0120c10120c00120c001100120c201460d00200220b8013703e806200220b8013703e006200241d8046a20ba01200241e0066a20ba0120c0011001220520c201460d08200520c7014d0d08420121044200210020022903e006222420c80154200241e0066a20a6016a29030022235020234201511b0d01200241286a2024202320bc0120b801108704200241286a20a6016a2903002100200229032821040c010b42002100420121040b200241186a2004200020072003108804200241e0066a20b9016a2222202e290300370300200241e0066a20ba016a222f2031290300370300200241e0066a20a6016a222e20a301290300370300200220022903e8073703e006200241186a20a6016a290300210420022903182100024020012802282205200120c3016a2231280200470d00200520b7016a22062005490d2f200520b7017422a3012006200620a301491b22a301ad20c4017e220320c50188a70d2f2003a722a50120c001480d2f2005450d02200120b0016a280200200520c6016c20a501102122060d030c080b200120b0016a28020021060c030b20c90120ca01470d070c0f0b20a50110222206450d050b203120a301360200200120b0016a2006360200200120ab016a28020021050b2006200520c6016c6a220520022903e0063703102005200437030820052000370300200520ab016a2022290300370300200520b0016a202f290300370300200520b9016a202e290300370300200120ab016a2201200128020020b7016a36020020c90120ca01470d050c0c0b41a487c000102f000b419a88c00041331039000b419a88c00041331039000b20a50141081023000b410321640c010b410321640c010b410321010c010b410321010c000b0b20cd0120656a21870120d8014188016c210520cd014180016a2165200241a0086a219c014100217320d4012101024002400340206541a47f6a2802002168206541a07f6a28020021d301200241e0066a206541a87f6a41d8001084041a20652d00004102460d01200241e8076a200241e0066a41d8001084041a200241d8046a41186a2270209c0141186a290000370300200241d8046a41106a226a209c0141106a290000370300200241d8046a41086a22cc01209c0141086a2900003703002002209c012900003703d80402402068450d0020d30110200b200120022903d804370000200141186a2070290300370000200141106a206a290300370000200141086a20cc0129030037000020654188016a2165207341016a2173200141206a2101200541f87e6a22050d000c020b0b206541086a2265208701460d0020cd0120d8014188016c6a219c01034020654180016a2d00004102460d0120654188016a21010240206541246a280200450d00206541206a28020010200b20012165209c012001470d000b0b20d901450d010b20cd0110200b200241e0056a41086a22654200370300200242003703e00541bc9ac4004116200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200241003602f007200242013703e807200220733602d804200241d8046a200241e8076a103e02400240024002400240024002402073450d00207341057421704100200241e8076a41086a28020022016b210520022802e807216a20022802ec07216820d401216503400240206820056a411f4b0d00200141206a229c012001490d27206841017422cc01209c01209c0120cc01491b229c014100480d27024002402068450d00206a2068209c011021226a0d010c060b209c011022226a450d050b209c0121680b206a20016a229c012065290000370000209c0141186a206541186a290000370000209c0141106a206541106a290000370000209c0141086a206541086a290000370000200541606a2105200141206a2101206541206a2165207041606a22700d000b200241f0076a2001360200200220683602ec072002206a3602e8070c010b200241e8076a41086a280200210120022802ec07216820022802e807216a0b200241e0066a4110206a2001100302402068450d00206a10200b410021050240024020734105742265450d002065410575228701ad4205862204422088a70d252004a722014100480d252001102222cc01450d0320d40120656a20d401470d010c040b410121cc01410021870120d40120656a20d401460d030b2073410574229c0141606a4105762168200241e8076a410172210520cc01216520d40121010340200241e0066a41186a200141186a290000370300200241e0066a41106a200141106a290000370300200241e0066a41086a200141086a290000370300200220012900003703e006200241e8076a200241e0066a10f8020240024020022d00e8074101470d00200241d8046a41186a200541186a290000370300200241d8046a41106a200541106a290000370300200241d8046a41086a200541086a290000370300200220052900003703d8040c010b200241d8046a41186a4200370300200241d8046a41106a4200370300200241d8046a41086a4200370300200242003703d8040b200141206a2101206520022903d804370000206541186a200241d8046a41186a290300370000206541106a200241d8046a41106a290300370000206541086a200241d8046a41086a290300370000206541206a2165209c0141606a229c010d000b206841016a2105207a0d030c040b209c0141011023000b200141011023000b207a450d010b20d40110200b2005ad2204421b88a70d0a2004420586a72265417f4c0d0a02400240024002402065450d002065102222d301450d0341002168410021d4014100216520050d010c020b410121d30141002168410021d401410021652005450d010b2005410574219c01416020cc016b217020d301216520cc012101034020652001290000370000206541186a200141186a290000370000206541106a200141106a290000370000206541086a200141086a290000370000206541206a2165200141206a2101209c0141606a229c010d000b20cc0120054105746a20706a41057641016a2165200521d4010b200241e0056a41086a22014200370300200242003703e00541cdadc2004112200241e0056a100220024198046a41086a2001290300370300200220022903e00537039804200220683602f007200242013703e807200220653602e006200241e0066a200241e8076a103e0240024002402065450d00206541057421704100200241e8076a41086a28020022016b210520022802e807216a20022802ec07216820d301216503400240206820056a411f4b0d00200141206a229c012001490d2420684101742273209c01209c012073491b229c014100480d24024002402068450d00206a2068209c011021226a0d010c060b209c011022226a450d050b209c0121680b206a20016a229c012065290000370000209c0141186a206541186a290000370000209c0141106a206541106a290000370000209c0141086a206541086a290000370000200541606a2105200141206a2101206541206a2165207041606a22700d000b200241f0076a2001360200200220683602ec072002206a3602e8070c010b200241e8076a41086a280200210120022802ec07216820022802e807216a0b20024198046a4110206a2001100302402068450d00206a10200b024020d401450d0020d30110200b208701450d0b20cc0110200c0b0b209c0141011023000b206541011023000b20a80120a7016a22a80120a901460d0341032121410321010c1b0b200241d8046a20386a2201205b290300370300200241d8046a20396a2205205c290300370300200241d8046a203a6a2206205d29030037030020022002290398093703d804200241e0056a203a6a22222041370300200220413703e00520432042200241e0056a100220024198046a203a6a2022290300370300200220022903e005370398040240024020024198046a20392045204420441001203f460d00200220413703f007200220413703e80720024198046a2039200241e8076a2039204410012222203f460d0c2022204a4d0d0c420121044200210020022903e8072207204b54200241e8076a203a6a29030022035020034201511b0d0120024188026a20072003204c204110870420024188026a203a6a290300210020022903880221040c010b42002100420121040b200241f8016a205f205e20042000108704200241f8086a20386a22222001290300370300200241f8086a20396a22012005290300370300200241f8086a203a6a22052006290300370300200220022903d8043703f80820022903f80121040240205a450d00203010200b2060450d00200241e8076a20386a222f2022290300370300200241e8076a20396a22222001290300370300200241e8076a203a6a22212005290300370300200220022903f8083703e8070240200241b8046a203a6a2206280200220520022802bc04470d00200241e0066a202810ba0320022802bc0422012006280200222e6b203f20022802e006223020326a223120312030491b22304f0d00202e20306a2230202e490d1d2001203274222e20302030202e491b2230ad203d7e2200203e88a70d1d2000a7222e2044480d1d024002402001450d0020022802b804200120466c202e102122010d010c150b202e10222201450d140b200220303602bc04200220013602b8040b20022802b804200520466c6a22012060360220200120022903e80737022c200120346a2062360200200120366a2059360200200120413703102001204137030820012004370300200120386a2041370300200120476a2021290300370200200120486a2022290300370200200120496a202f2903003702002006200520326a360200200241e0066a2028108003200241e0066a203b6a28020022300d160b202810200240202d20274f0d000240202d450d00202d4188016c2101202b41206a216503400240206541046a280200450d00206528020010200b20654188016a2165200141f87e6a22010d000b0b02402029450d00202a10200b0240200241c0046a2802002265450d00206541d0006c210120022802b80441206a216503400240206541046a280200450d00206528020010200b206541d0006a2165200141b07f6a22010d000b0b20022802bc04450d0320022802b80410200c030b202d2026202d2026491b2266ad4288017e2204422088a70d072004a72201417f4c0d07024002402001450d002001102222050d01200141081023000b410821050b41002167200241003602b004200220663602ac04200220053602a8042066450d004188012168202c202d4188016c22696a216a4101216b4108216c200241b8046a41086a216d41d000216e419f04216f418001217041880221714190022172413021734190032174419803217541e07b217641a0042177419804217841f80021794118217a41f000217b4110217c200241e8076a41106a217d41e800217e4230217f4220218001417f21810141d80021820141c80021830141c000218401413821850142880121860141282187014124218801418401218901200241e3066a218a014120218b0141e000218c0141b07f218d0141f87e218e014200218f014201219001427f2191014148219201414021930141b87f2194014100219501410221210c160b410821a601200241b8046a41086a2802002201450d0041d00021a70120022802b80422a801200141d0006c6a21a901412c21aa01412821ab01200241a8046a41086a21ac0141880121ad01419f0421ae0141e00021af01412021b00141e80121b10141f00221b20141900221b30141f80321b40141980321b50141a00421b601410121b701420021b801411821b901411021ba01420121bb01427f21bc0141d80021bd01411621be01418feec00021bf01410021c00141c8d7c40021c101417f21c201412421c301423021c401422021c501413021c601410f21c701427e21c801410321210c160b20022802c80421cc0120022902ac04210320022802a80421cd010240200241c8046a20a6016a2802002201450d0020014188016c210520cc0141206a210103400240200141046a280200450d00200128020010200b20014188016a2101200541f87e6a22050d000b0b024020022802cc04450d0020cc0110200b0240200241c0046a2802002201450d00200141d0006c210520022802b80441206a210103400240200141046a280200450d00200128020010200b200141d0006a2101200541b07f6a22050d000b0b024020022802bc04450d0020022802b80410200b20cd01450d00200220cd01360298092002200337029c09200241e0056a41086a22014200370300200242003703e00541bc9ac4004116200241e0056a1002200241e0066a41086a2001290300370300200220022903e0053703e006200241e0066a411041c8d7c400410041001001417f460d01200242103702dc042002200241e0066a3602d804200241e8076a200241d8046a103820022802e80722ce01450d1220022802ec0721cf01200241f0076a280200410574222f0d020c030b420021d001200241e0056a41086a22654200370300200242003703e00541d29ac4004111200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200241e0066a411041c8d7c400410041001001417f460d03200242003703f007200242003703e807200241e0066a4110200241e8076a4110410010012265417f460d0f2065410f4d0d0f20022903e80721d0010c030b410121ce01410021cf014100410574222f450d010b20ce0121010340410f10222205450d06200541076a41002900fdee43370000200541002900f6ee433700002005410f412f10212205450d072005200129000037000f200541276a200141186a22d1012900003700002005411f6a200141106a22d201290000370000200541176a200141086a2222290000370000200241d8046a41186a22cc014200370300200241d8046a41106a22d3014200370300200241d8046a41086a22d4014200370300200242003703d8042005412f200241d8046a1000200241e0056a41186a22d50120cc01290300370300200241e0056a41106a222120d301290300370300200241e0056a41086a22d60120d401290300370300200220022903d8043703e005200241e0056a4120100920051020411210222205450d08200541106a41002f008aed43222e3b0000200541086a4100290082ed432204370000200541002900faec43220037000020054112413210212205450d09200520012900003700122005412a6a20d101290000370000200541226a20d2012900003700002005411a6a202229000037000020cc01420037030020d301420037030020d4014200370300200242003703d80420054132200241d8046a1000200241e8076a41186a20cc01290300370300200241e8076a41106a20d301290300370300200241e8076a41086a20d401290300370300200220022903d8043703e807410021d7010240200241e8076a412041c8d7c400410041001001417f460d00200241003602e006200241e8076a4120200241e0066a41044100100141016a41044d0d0520022802e0062106200241e8076a41201009410121d7010b2005102002402006410020d7011b22d70141014d0d00411210222205450d0b200541106a202e3b0000200541086a20043700002005200037000020054112413210212205450d0c200520012900003700122005412a6a20d101290000370000200541226a20d2012900003700002005411a6a202229000037000020cc01420037030020d301420037030020d4014200370300200242003703d80420054132200241d8046a100020d50120cc01290300370300202120d30129030037030020d60120d401290300370300200220022903d8043703e005200220d701417f6a3602e807200241e0056a4120200241e8076a41041003200510200b200141206a2101202f41606a222f0d000b0b2003422088a721d801024020cf01450d0020ce0110200b20d801450d0d2003a721d90141880121da0120cd0120d8014188016c6a21db01410821d20120cd0141086a29030021dc0120cd0129030021d001411021d401200241e8076a41106a21dd0141f80021de01411821d30141f00021df0141e80021e001423021e101422021e201417f21e301413021d701412821d101200241e8076a41286a21e4012002418c086a21e501412021cc01200241e8076a41206a21e601410f21e701410721e801410021cf01412f21e901412721ea01411f21eb01411721ec01420021ed01420121ee01410121d501415021d60120cd0121ce01410421210c120b200241e0056a41086a22654200370300200242003703e00541e49dc4004115200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e00602400240200241e0066a411041c8d7c400410041001001417f460d00200241003602e807200241e0066a4110200241e8076a41044100100141016a41044d0d0b20023502e80721040c010b423c21040b200241086a20d001420020044200108804200241e0056a41086a22654200370300200242003703e00541a299c400411c200241e0056a1002200241e0066a41086a2065290300370300200220022903e0053703e006200242003703f00720024289f48bdcc4002002290308428094ebdc038020022903104200521b3703e807200241e0066a4110200241e8076a411010030c130b1031000b419a88c00041331039000b419a88c00041331039000b410f41011023000b412f41011023000b411241011023000b413241011023000b411241011023000b413241011023000b419a88c00041331039000b202e41081023000b419a88c00041331039000b41d49dc4004100410010b501000b419a88c00041331039000b41012121410321010c030b410321010c020b410321010c010b410321010c000b0b200241e8076a109d0120022802e807210520022802ec072168024020022802f0072265450d002065410574220141057522cc01ad42287e2204422088a70d012004a7229c014100480d01209c011022226a450d02200520016a21702065410574219c01206a2165200521010340200141086a2900002104200141106a290000210020012900002103206541186a200141186a290000370000206541106a2000370000206541086a200437000020652003370000206541206a4201370300206541286a2165200141206a2101209c0141606a229c010d000b207020056b41606a41057641016a21702068450d040c030b410021cc014108216a4100217020680d020c030b1024000b209c0141081023000b200510200b02400240410e10222265450d0041002101206541066a410029009893423700002065410029009293423700002065410e411c10212265450d01206541106a41002d00a293423a0000206541002f00a093423b000e024002402065411141c8d7c400410041001001417f460d00200241003602e80720654111200241e8076a41044100100141016a41044d0d0120022802e80721010b20651020200241e0066a200110d40220022802e0062173024002400240207020022802e806470d002073206a460d01417f219c01206a2165207321010340209c0141016a229c0120704f0d022065200141201086040d01200141206a2105206541206a2168206541286a2165200141286a210120682903002005290300510d000b0b200220703602f007200220cc013602ec072002206a3602e807200241e8076a42004200200410f50120022802e406450d0120731020200241c0096a24000f0b024020022802e406450d00207310200b20cc01450d00206a10200b200241c0096a24000f0b419a88c00041331039000b410e41011023000b411c41011023000bb20803027f017e107f230041f0036b22022400200241086a2001108e0102400240024002400240024002400240024002402002280208450d00200228020c2203ad4288017e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241f0036a24000f0b4108210620030d030b4100210f4100210d0c030b1031000b200541081023000b200241b0026a4104722107200141086a2108200241306a41186a2109200241306a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f200828020021102002410036029003200841002001280200200f20024190036a410420101001220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d00200228029003211120024190036a2001108b01200228029003410f460d00200241b0026a20024190036a41e0001084041a20094200370300200a4200370300200241306a41086a2210420037030020024200370330200841002001280200200e280200200241306a412020082802001001220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d0020024190016a41186a200929030037030020024190016a41106a200a29030037030020024190016a41086a2010290300370300200220022903303703900120022802b0022110200241b4016a200741dc001084041a201121120c020b200241b0026a1093010b410f21100b20024190036a200241b4016a41dc001084041a20024190026a41186a220e20024190016a41186a29030037030020024190026a41106a221120024190016a41106a29030037030020024190026a41086a221320024190016a41086a2903003703002002200229039001370390022010410f460d02200541016a210f200241306a20024190036a41dc001084041a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903900237031002402005200d470d00200b200f200f200b491b220dad4288017e2204422088a70d042004a722134100480d0402402005450d002006200c2013102122060d010c060b201310222206450d050b2006200c6a22052010360200200541046a200241306a41dc001084041a200541e0006a2012360200200541fc006a2014290300370200200541f4006a200e290300370200200541ec006a2011290300370200200541e4006a2002290310370200200b41026a210b200c4188016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241f0036a24000f0b2000410036020002402005450d00200621050340200510920120054188016a2105200c41f87e6a220c0d000b0b0240200d450d00200610200b200241f0036a24000f0b1024000b201341081023000bad0302047f037e230041d0006b2202240002400240411310222203450d002003410f6a410028008df040360000200341086a4100290086f040370000200341002900feef4037000020034113412610212203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041c8d7c400410041001001417f460d00200220023602202002412036022420024200370338200242003703302002410020024120200241306a41104100100122012001417f461b2201411020014110491b3602282001410f4d0d02200241386a290300210620022903302107200241306a200241206a103820022802302201450d0220022902342108200020063703082000200737030020002008370214200020013602100c010b200041003602100b20031020200241d0006a24000f0b419a88c00041331039000b411341011023000b412641011023000bc90401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d0020004188016c2104200241086a22052802002100200228020421060340200341e0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102122060d020c070b200228020021060c020b200010222206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a200736000020032002109501024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000102122080d020c080b200228020021080c020b200010222208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341ec006a290000370000200741106a200341f4006a290000370000200741186a200341fc006a2900003700002007200341e4006a29000037000020034188016a2103200441f87e6a22040d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1024000b200041011023000b200041011023000b200810200b200241106a24000bdb0604027f017e037f047e230041c0006b22032400024002400240411810222204450d00200441106a41002900b9ef40370000200441086a41002900b1ef40370000200441002900a9ef4037000020044118413810212204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044138200341206a1000200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041c8d7c400410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a2903002109200329032021052004102041142106411410222204450d010c050b4200210920041020411421064114102222040d040b200641011023000b419a88c00041331039000b411841011023000b413841011023000b200441106a41002800a5ef40360000200441086a410029009def4037000020044100290095ef40370000024020042006413410212204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a2900003700004200210a200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044134200341206a1000200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041c8d7c400410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a290300210b2003290320210a0c010b4200210b0b200410202000200a200120052005200156200920025620092002511b22041b22017c220c200b2002200920041b22027c200c200a54ad7c10af012000200520017d200920027d2005200154ad7d10b601200341c0006a24000f0b419a88c00041331039000b413441011023000bf20b03027f017e047f23004190026b22052400200541f8006a41086a220642003703002005420037037841f490c1004119200541f8006a1002200541086a200629030037030020052005290378370300410021060240024002400240024002400240024002400240024002400240024002402005411041c8d7c400410041001001417f460d002005410036027820054110200541f8006a41044100100141016a41044d0d01024020052802782206450d0020052006417f6a10e7012005280208410f460d01200541f8006a200541f8001084041a20052903782107200541f8006a41086a10920120072001580d01200041d491c10036020420004101360200200041086a41c700360200200210920120054190026a24000f0b410021060b200541f8006a41086a220842003703002005420037037841f490c1004119200541f8006a1002200541086a2008290300370300200520052903783703002005200641016a36027820054110200541f8006a41041003200520013703782008200241e0001084042109200520043703e001200520033a00e801411a10222208450d01200841186a41002f00eeef403b0000200841106a41002900e6ef40370000200841086a41002900deef40370000200841002900d6ef403700002008411a413410212202450d022002200636001a200541186a220a4200370300200541106a220b4200370300200541086a22084200370300200542003703002002411e20051000200541f0016a41186a200a290300370300200541f0016a41106a200b290300370300200541f0016a41086a2008290300370300200520052903003703f00120054100360208200542013703002005290378210141081022220a450d032005410836020420082008280200220b41086a3602002005200a360200200a200b6a20013700002009200510950102400240024002400240024002400240024002400240200541e8016a2d000022084101460d0020084102470d012005280204200541086a2802002208470d03200841016a220a2008490d162008410174220b200a200a200b491b220b4100480d162008450d0720052802002008200b1021220a450d080c130b2005280204200541086a2802002208470d01200841016a220a2008490d152008410174220b200a200a200b491b220b4100480d152008450d0420052802002008200b1021220a450d050c100b2005280204200541086a2802002208470d02200841016a220a2008490d142008410174220b200a200a200b491b220b4100480d142008450d0720052802002008200b1021220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b1022220a0d0b0b200b41011023000b200b1022220a0d0b0b200b41011023000b200b1022220a0d050b200b41011023000b419a88c00041331039000b411a41011023000b413441011023000b410841011023000b2005200b3602042005200a360200200541086a28020021080b200541086a200841016a360200200a20086a41003a00000c040b2005200b3602042005200a360200200541086a28020021080b200541086a200841016a360200200a20086a41013a00000c020b2005200b3602042005200a360200200541086a28020021080b200541086a200841016a360200200a20086a41023a00000b200541e0016a29030021010240024002402005280204220a200541086a28020022086b41084f0d00200841086a220b2008490d03200a4101742208200b200b2008491b22084100480d03200a450d012005280200200a20081021220a450d020c040b2005280200210a0c040b20081022220a0d020b200841011023000b1024000b200520083602042005200a360200200541086a28020021080b200541086a220b200841086a360200200a20086a200137000020052802042108200541f0016a41202005280200220a200b280200100302402008450d00200a10200b20021020200910920120054184016a200636020020054181016a20033a0000200541f8006a41086a41023a0000200541053a0078200541f8006a103d200041003602002000200636020420054190026a24000bd60604047f017e027f017e230041b0036b220224000240024002400240411a10222203450d00200341186a41002f00eeef403b0000200341106a41002900e6ef40370000200341086a41002900deef40370000200341002900d6ef403700002003411a413410212203450d012003200136001a200241f0016a41186a22014200370300200241f0016a41106a22044200370300200241f0016a41086a22054200370300200242003703f0012003411e200241f0016a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903f0013703000240024002402002412041c8d7c400410041001001417f460d002002200236022020024120360224200242003703f0012002410020024120200241f0016a41084100100122012001417f461b2201410820014108491b360228200141074d0d0620022903f0012106200241f0016a200241206a108b0120022802f0012101200241d4026a200241f0016a41047241dc001084041a2001410f460d0620024194016a200241d4026a41dc001084041a20022001360230200241306a41047220024194016a41dc001084042104200241003a00f00120022802202002280224200241f0016a4101200241286a22012802001001210520012001280200200541016a41014b22056a22073602002005450d0220022d00f001220541034f0d02200242003703f001200241206a41086a2208410020022802202002280224200241f0016a41082007100122012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903f001210920022802302101200241f0016a200441dc001084041a2002200241336a2800003600d702200220022800303602d4022001410f460d06200241306a200241f0016a41dc001084041a200220022800d70236009701200220022802d4023602940120002001360208200020063703002000410c6a200241306a41dc001084041a200041f0006a20053a0000200041e8006a20093702002000200228029401360071200041f4006a2002280097013600000c010b2000410f3602080b20031020200241b0036a24000f0b200241306a109201419a88c00041331039000b411a41011023000b413441011023000b200241306a1092010b419a88c00041331039000bed0603027f017e0b7f23004190036b22022400200241086a2001108e0102400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42e8007e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b2000410036020020024190036a24000f0b4108210620030d030b4100210d4100210b0c030b1031000b200541081023000b200241c8016a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00a8022001280200200141046a220c280200200241a8026a410120052802001001210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00a802220d4101460d00200d0d06200241a8026a200241106a41dc001084041a410f210c0c010b200241a8026a2001108b0120022802a802410f460d04200241c8016a200241a8026a41e0001084041a200c280200210d2005280200210c2002410036028c03200541002001280200200d2002418c036a4104200c1001220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d03200228028c03210e20022802c801210c200241ec006a200741dc001084041a200241a8026a200241ec006a41dc001084041a200c410f460d05200241106a200241a8026a41dc001084041a200241a8026a200241106a41dc001084041a200c4110460d060b200a41016a210d200241c8016a200241a8026a41dc001084041a0240200a200b470d002008200d200d2008491b220bad42e8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f102122060d010c090b200f10222206450d080b200620096a220a200c360200200a41046a200241c8016a41dc001084041a200a41e0006a200e360200200841026a2108200941e8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d36020020024190036a24000f0b200241c8016a1093010b200241a8026a200241ec006a41dc001084041a0b200241a8026a200241106a41dc001084041a0b200041003602000240200a450d0020062105034002402005280200410f460d0020051092010b200541e8006a2105200941987f6a22090d000b0b0240200b450d00200610200b20024190036a24000f0b1024000b200f41081023000bfd82010b027f027e067f017e0d7f017e017f027e297f027e337f230041b0026b2201240020014190026a41086a22024200370300200142003703900241a082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d02200129035022034200510d044200210420002003824200520d120c010b42002104200042e807824200520d110b20014190026a41086a22022004370300200120043703900241cc82c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f001200141f0016a411041c8d7c400410041001001417f460d1020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d0120012802502202450d104108210520014190026a41086a22064200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a200629030037030020012001290390023703f0014100210602400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10f30120012802502205450d06200141d8006a2802002106200128025421070c010b410021070b4200210320014190026a41086a22084200370300200142003703900241e082c200411420014190026a1002200141f0016a41086a2209200829030037030020012001290390023703f001200141d0006a200141f0016a105a0240200128025c220a450d00200128025822082001290360220b422088a76b20066a2109200129035021030240200ba7450d00200a10200b20092002490d070c060b20084200370300200142003703900241cdc8c000410d20014190026a10022009200829030037030020012001290390023703f001410021080240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d04200129035021030b200620024f0d050c060b419a88c00041331039000b419a88c00041331039000b41b482c200102f000b419a88c00041331039000b419a88c00041331039000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014190026a41086a22024200370300200142003703900241f482c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d02200129035020037c21030c010b420520037c21030b20014190026a41086a22024200370300200142003703900241a082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d022001290350220b4200520d0141f0c9c100102f000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d00200510200b20032000520d0c4108210c20014190026a41086a22024200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100210d02400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10f3012001280250220c450d07200141d8006a280200210d2001280254210e0c010b4100210e0b20014190026a41086a22024200370300200142003703900241cc82c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100210f0240200141f0016a411041c8d7c400410041001001417f460d0020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d032001280250210f0b4200210320014190026a41086a22024200370300200142003703900241cdc8c000410d20014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d02200129035021030b0240024002400240200d41286c2202450d00200c41206a2903002003520d00200141f0016a41186a2206200c41186a290300370300200141f0016a41106a2208200c41106a290300370300200141f0016a41086a2205200c41086a2903003703002001200c2903003703f001412010222210450d0b201020012903f001370000201041186a2006290300370000201041106a2008290300370000201041086a2005290300370000200c20026a200c41286a2202460d02200d41286c41586a21054120210841012106410121110340200241206a2903002003520d04200141f0016a41186a2207200241186a290300370300200141f0016a41106a220a200241106a290300370300200141f0016a41086a2209200241086a290300370300200120022903003703f00102400240024020112006470d00200641016a22122006490d2a20064101742213201220122013491b2213ad420586220b422088a70d2a200ba722124100480d2a2006450d01201020064105742012102122100d020c0c0b200621130c010b201210222210450d0a0b200241286a2102201020086a220620012903f001370000200641186a2007290300370000200641106a200a290300370000200641086a2009290300370000200841206a2108201141016a211120132106200541586a22050d000c020b0b4101211041002111410021130b200f200d20116b22064d0d0a0c0b0b4101211141012113200f200d41016b22064b0d0a0c090b20062113200f200d20116b22064b0d090c080b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b201241011023000b419a88c00041331039000b418883c2002008200610b501000b412041011023000b2013450d01201010200c010b20014190026a41086a220242003703002001420037039002419883c200411c20014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240024002400240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d022001290350210b0c010b42e807210b0b20014190026a41086a22024200370300200142003703900241e082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f0012001410036025820014201370350410810222202450d01200142888080808001370254200120023602502002200b20037c37000020024108411010212202450d0220014290808080c0013702542002200f20066b221436000820012002360250200120113602900220014190026a200141d0006a103e0240024002402011450d002011410574210a4100200141d0006a41086a28020022066b210520012802502109200128025421072010210203400240200720056a411f4b0d00200641206a22082006490d2320074101742212200820082012491b22084100480d23024002402007450d00200920072008102122090d010c060b200810222209450d050b200821070b200920066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200a41606a220a0d000b200141d8006a200636020020012007360254200120093602500c010b200141d8006a280200210620012802542107200128025021090b200141f0016a411020092006100302402007450d00200910200b02402013450d00201010200b20014190026a41086a22024200370300200142003703900241b483c200410e20014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100210602400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a103820012802502210450d0620012802542115200141d8006a280200220641ffffff3f712213450d010c070b4101211041002115410041ffffff3f7122130d060b410821120c060b200841011023000b419a88c00041331039000b410841011023000b411041011023000b419a88c00041331039000b20134104742202102222120d00200241081023000b4100210202402010201020064105746a460d002006410574220841606a2107200141086a21052012210220102106034020012006103b200129030021032002200529030037030820022003370300200241106a2102200641206a2106200841606a22080d000b200741057641016a21020b20014190026a41086a22064200370300200142003703900241c283c200411820014190026a1002200141d0006a41086a2006290300370300200120012903900237035020014100360298022001420137039002200120023602f001200141f0016a20014190026a103e0240024020024104742207450d0020062802002102200128029002210a2001280294022105201221060340200641086a29030021032006290300210b0240024002400240200520026b41104f0d00200241106a22082002490d1f20054101742209200820082009491b22094100480d1f2005450d01200a200520091021220a0d020c0a0b200241106a21080c020b20091022220a450d080b200921050b200641106a2106200a20026a220220033700082002200b37000020082102200741706a22070d000b20014198026a200836020020012005360294022001200a360290020c010b200628020021082001280294022105200128029002210a0b200141d0006a4110200a2008100302402005450d00200a10200b02402013450d00201210200b20014190026a41086a22024200370300200142003703900241da83c200411220014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041c8d7c400410041001001417f460d0020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d0a200128025021060c010b410221060b200141a8026a4200370300200141a0026a420037030020014198026a42003703002001420037039002200620146a2212ad42307e2203422088a70d172003a72202417f4c0d17024002402002450d00200210222213450d0d201321020c010b41082113410821020b200141d0006a41186a220a20014190026a41186a290300370300200141d0006a41106a220920014190026a41106a290300370300200141d0006a41086a20014190026a41086a290300370300200120012903900237035002400240024020124102490d002011200f6a20066a417f6a200d6b21060340200141f0016a41186a2208200a290300370300200141f0016a41106a22052009290300370300200141f0016a41086a2207200141d0006a41086a290300370300200120012903503703f0012002420037030820024200370300200241286a2008290300370300200241206a2005290300370300200241186a2007290300370300200241106a20012903f001370300200241306a21022006417f6a22060d000b2012417f6a21060c010b410021062012450d010b200242003703082002420037030020022001290350370310200241186a200141d8006a290300370300200241206a200141e0006a290300370300200241286a200141d0006a41186a290300370300200641016a21060b20012006360258200120123602542001201336025020014190026a41086a22024200370300200142003703900241ec83c200411320014190026a1002200141f0016a41086a200229030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a10da0202402012450d00201310200b200141d0006a41086a2014360200200141023a0054200141063a0050200141d0006a103d2015450d0020101020200e0d010c020b200e450d010b200c10200b20014190026a41086a22022004370300200120043703900241e082c200411420014190026a1002200141f0016a41086a200229030037030020012001290390023703f001200141d0006a200141f0016a105a200128025c2216450d172001280260211720012903502000520d1620014190026a41086a22024200370300200142003703900241c283c200411820014190026a1002200141f0016a41086a2206200229030037030020012001290390023703f001200141f0016a4110100920024200370300200142003703900241e082c200411420014190026a10022006200229030037030020012001290390023703f0010240024002400240024002400240200141f0016a411041c8d7c400410041001001417f460d002001200141f0016a3602900220014110360294022001420037035020014100200141f0016a4110200141d0006a41084100100122022002417f461b2202410820024108491b220636029802200241074d0d05200129035021042001410036025020014198026a4100200141f0016a4110200141d0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d0520012802502102200141d0006a20014190026a103820012802502218450d0520012902542119200141f0016a41101009200120023602c801200120043703c00120012802c801211a410821094200211b20014190026a41086a22024200370300200142003703900241ec83c200411320014190026a1002200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10dc0220012802502209450d0a2001290254211b200141f0016a411010090b20014190026a41086a22024200370300200142003703900241cdc8c000410d20014190026a1002200141f0016a41086a2206200229030037030020012001290390023703f0014200210b0240200141f0016a411041c8d7c400410041001001417f460d0020014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d042001290350210b0b20024200370300200142003703900241f482c200411420014190026a10022006200229030037030020012001290390023703f001200141f0016a411041c8d7c400410041001001417f460d0120014200370350200141f0016a4110200141d0006a41084100100141016a41084d0d042001290350211c0c020b02402017450d00201610200b41e2d1c200410f100f41de84c2004135100f200141b0026a24000f0b4205211c0b4200210420014190026a41086a22024200370300200142003703900241c984c200411520014190026a1002200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041c8d7c400410041001001417f460d002001420037035820014200370350200141f0016a4110200141d0006a4110410010012202417f460d072002410f4d0d07200141d8006a2903002104200129035021000c010b420921000b2009201b422088a7221d41306c6a2102024002400240201a450d00201a417f6a211041002108024020092002460d002009201d41306c6a220641506a2202290300200641586a29030084500d02200141a8026a200641786a290000370300200141a0026a200641706a29000037030020014198026a200641686a2900003703002001200641606a29000037039002410121080b410021120c020b4100211241002110410021080c010b410121120b200141d9006a20014190026a41086a290300370000200141e1006a20014190026a41106a290300370000200141e9006a20014190026a41186a290300370000200120083a005020012001290390023700514101211e200141d0006a4101722106024002402008450d0020062000200410e501200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f00141201022221e450d09201e20012903f001370000201e41186a200141f0016a41186a2208290300370000201e41106a200141f0016a41106a2205290300370000201e41086a200141f0016a41086a2207290300370000200141d0006a4101722106410221114120210a4101210d4101211f410020106b220f41016a4101460d010340201241ff01710d0220092002460d02200241506a2210290300200241586a29030084500d022008200241786a2900003703002005200241706a2900003703002007200241686a2900003703002001200241606a2900003703f001200620012903f001370000200641086a22022007290300370000200641106a22122005290300370000200641186a22132008290300370000200141013a005020062000200410e50120014190026a41186a220c201329000037030020014190026a41106a2213201229000037030020014190026a41086a2212200229000037030020012006290000370390022008200c290300370300200520132903003703002007201229030037030020012001290390023703f0010240200d201f470d00200d41016a2202200d490d1d2011200220022011491b221fad4205862203422088a70d1d2003a722024100480d1d0240200d450d00201e200a20021021221e0d010c080b20021022221e450d070b201e200a6a220220012903f001370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000201141026a2111200a41206a210a4100211220102102200f200d41016a220d6a4101470d000c020b0b200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014100210d4100211f0b4108212020014190026a41086a22024200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a200229030037030020012001290390023703f0014100212102400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10f30120012802502220450d0a200141d8006a2802002111200128025421210c010b410021110b200141013602502020201141286c6a210e0240024002400240024002402019422088a72205450d00410021224100212302402005200e20206b41286e2202200220054b1b2202450d00200241057422064100480d20200610222208450d1220012008360250200221230b20202102200521082001280250222421060340200e20026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000202241046a212220064180016a2106200241a0016a21022008417c6a22080d000c060b0b4100212320012802502124410021220c040b200e2002460d032020201141286c6a2112410121070240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082007220a460d01200a41016a2107200641206a21062012200241286a2202470d000b0b2022200a6a21220c030b202241017221220c020b202241027221220c010b202241037221220b201c200b7c210b201e200d4105746a2125024002400240024002402005450d00200e2020460d012005417f732106201141286c2108202021020340200141f0016a41186a200241186a290300370300200141f0016a41106a200241106a290300370300200141f0016a41086a200241086a290300370300200120022903003703f001200641016a2206450d03200241286a2102200841586a22080d000c020b0b200e2020460d00200141d0006a41186a202041186a290300370300200141d0006a41106a202041106a290300370300200141d0006a41086a202041086a29030037030020012020290300370350202041286a2106202029032021040c020b0240201e2025460d00200141f0016a41186a201e41186a2202290000370300200141f0016a41106a201e41106a2206290000370300200141f0016a41086a201e41086a22082900003703002001201e2900003703f0012008290000210420062900002100201e290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002201e41206a210841022105200e2106200b21040c030b410021114108210c02402021450d00202010200b410021070c100b200241206a2903002104200141d0006a41186a200141f0016a41186a290300370300200141d0006a41106a200141f0016a41106a290300370300200141d0006a41086a200141f0016a41086a290300370300200120012903f001370350200241286a21060b20014190026a41186a200141d0006a41186a29030037030020014190026a41106a200141d0006a41106a29030037030020014190026a41086a200141d0006a41086a290300370300200120012903503703900241002105201e21080b417f417f200e20066b41286d2202202520086b4105766a220720072002491b220241016a220720072002491b2211ad42287e2200422088a70d182000a72202417f4c0d18024002402002450d0020021022220c450d0c200c21260c010b4108210c410821260b200c200129039002370300200c41186a20014190026a41186a290300370300200c41106a20014190026a41106a290300370300200c41086a20014190026a41086a29030037030020262004370320024002402005450d0020082025460d01200841086a2900002104200841106a29000021002008290000210320014190026a41186a200841186a29000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c100b02402006200e460d00200141d0006a41186a200641186a2202290300370300200141d0006a41106a200641106a2205290300370300200141d0006a41086a200641086a22072903003703002001200629030037035020014190026a41086a200729030037030020014190026a41106a200529030037030020014190026a41186a20022903003703002001200629030037039002200641286a2102200629032021044100210f0c110b20082025460d00200141f0016a41186a200841186a2202290000370300200141f0016a41106a200841106a2205290000370300200141f0016a41086a200841086a2207290000370300200120082900003703f00120072900002104200529000021002008290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c0f0b4101210720210d100c110b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b200241011023000b200941011023000b419a88c00041331039000b419a88c00041331039000b412041011023000b419a88c00041331039000b419a88c00041331039000b200241081023000b200641011023000b200241081023000b410021020c090b4102210f200b2104200621020b4102210a41022106412821050340200141d0006a41186a221220014190026a41186a2214290300370300200141d0006a41106a221020014190026a41106a2215290300370300200141d0006a41086a221320014190026a41086a22272903003703002001200129039002370350024020062207417f6a22062011470d002006417f417f200e20026b41286d2226202520086b4105766a221120112026491b222641016a221120112026491b6a22262006490d0b200a20262026200a491b2211ad42287e2200422088a70d0b2000a722064100480d0b0240024020074101470d0020061022220c0d010c060b200c200520061021220c450d050b200c21260b202620056a22062001290350370300200641186a2012290300370300200641106a2010290300370300200641086a2013290300370300200641206a2004370300024002400240024002400240200f41ff017122064101460d0020064102470d0120082025460d05200841086a2900002104200841106a2900002100200829000021032014200841186a29000037030020152000370300202720043703002001200337039002200841206a2108420121004102210f0c020b200e2002460d042014200241186a2903003703002015200241106a2903003703002027200241086a290300370300200120022903003703900220022903202104420121004101210f200241286a21020c030b200e2002470d014102210f024020082025460d00200141f0016a41186a200841186a2206290000370300200141f0016a41106a200841106a2212290000370300200141f0016a41086a200841086a2210290000370300200120082900003703f0012010290000210420122900002100200829000021032014200629000037030020152000370300202720043703002001200337039002200841206a2108420121000c010b420021000c020b200b21040c010b2012200241186a22062903003703002010200241106a22122903003703002013200241086a221029030037030020012002290300370350201029030021042012290300210020022903002103201420062903003703002015200037030020272004370300200120033703900220022903202104420121004100210f200241286a21020b200a41026a210a200741016a2106200541286a210520004200520d010b0b2021450d010b202010200b0240200741144b0d0041012128200741014d0d03417f21292007417f6a212a4128212b2026200741286c6a212c4102212d4120212e4118212f41102130410821314103213241f0002133415821344178213541702136416821374160213841c80021394100213a0c040b2007410176223bad42287e2204422088a70d062004a72202417f4c0d064108213c024002402002450d0020021022223d450d03203d213e0c010b4108213d4108213e0b4158213f202641586a2140202641a87f6a21414100214241042143417f21444101214542032146422021474103214841022149417d214a4128214b4178214c4120214d4118214e4110214f417e2150417421514164215241502153410521544109215541f000215641c800215741c0002158413821594130215a410a215b4104215c4100215d4100215e2007215f4101213a0c040b200641081023000b200241081023000b410021020c020b410121020c010b410121020b0240034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b20012007360258200120113602542001200c36025020014190026a41086a22654200370300200142003703900241dbc9c100411520014190026a1002200141f0016a41086a2202206529030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a10db0202402011450d00200c10200b206542003703002001420037039002419084c200411220014190026a10022002206529030037030020012001290390023703f00141002166024002400240200141f0016a411041c8d7c400410041001001417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a103820012802502267450d02200141d8006a2802002168200128025421660c010b41012167410021680b200141d8016a4200370300200141d0016a4200370300200141c8016a4200370300200142003703c0012068ad2204421b88a70d172004420586a72265417f4c0d17024002402065450d002065102222690d01206541011023000b410121690b200141d0006a41186a2206200141c0016a41186a290300370300200141d0006a41106a2208200141c0016a41106a290300370300200141d0006a41086a2205200141c0016a41086a290300370300200120012903c00137035002400240024020684102490d002068417f6a210220692165034020652001290350370000206541186a2006290300370000206541106a2008290300370000206541086a2005290300370000206541206a21652002417f6a22020d000b2068417f6a216a0c010b4100216a206921652068450d010b20652001290350370000206541186a200141d0006a41186a290300370000206541106a200141d0006a41106a290300370000206541086a200141d0006a41086a290300370000206a41016a216a0b2009201d41306c6a2165201ba7216b4100216c4158216d4150216e4178216f4118217020014190026a41186a2171417021724110217320014190026a41106a2174416821754108217620014190026a41086a217741602178410121794105217a201a450d024102213a0c090b419a88c00041331039000b02400240024002400240024002400240024002400240203a0e0400010203030b2007202a220220296a222a490d0402402007202a6b2206202d490d0020262002202b6c6a2202202e6a22052903002026202a202b6c6a2208202e6a220a29030022045a0d00200141f0016a202f6a22122008202f6a2210290300370300200141f0016a20306a2213200820306a220f290300370300200141f0016a20316a220e200820316a2214290300370300200120082903003703f001200820022903003703002014200220316a290300370300200f200220306a29030037030020102002202f6a290300370300200a2005290300370300024020062032490d00200820336a29030020045a0d0041022108202c210503402005220220346a2002290300370300200220356a2002202e6a290300370300200220366a2002202f6a290300370300200220376a200220306a290300370300200220386a200220316a290300370300200820286a220820064f0d012002202b6a2105200220396a2903002004540d000b0b200220012903f001370300200220043703202002202f6a2012290300370300200220306a2013290300370300200220316a200e2903003703000b202c20346a212c202a0d090c0e0b205f21604100215f41012161206020446a2210450d1502400240024002400240024020262010204b6c6a204d6a29030020262060204b6c22026a20536a29030022045a0d002041206020546c20487422056a2102034020102045460d02201020446a21102004200229030022005421062002203f6a21022000210420060d000c030b0b206020506a2105204120026a21064100215f41002102034020052002460d05200220456a21022004200629030022005a21082006203f6a21062000210420080d000b200220456a2161206020026b20446a2210450d030c020b410021100b20602010490d08206020074b0d0a0240206020106b22612045762208450d00204020056a210220262010204b6c6a21060340200141d0006a204d6a22052006204d6a220a290300370300200141d0006a204e6a22122006204e6a2213290300370300200141d0006a204f6a220f2006204f6a220e290300370300200141d0006a203c6a22142006203c6a2215290300370300200120062903003703502002203c6a222729030021042002204f6a222529030021002002204e6a222029030021032002290300210b200a2002204d6a222129030037030020132003370300200e2000370300201520043703002006200b37030020212005290300370300202020122903003703002025200f29030037030020272014290300370300200220012903503703002002203f6a21022006204b6a2106200820446a22080d000b0b2010450d010b206120554b0d00206020074b0d0820262010204b6c6a2162410021630c1c0b2010215f205d205e460d190c1a0b20602161205d205e460d160c170b20652009460d012065206d6a21022065206e6a2265290300200229030084500d01201a2079460d0b2079201a6b2102034020092065460d022065206d6a21062065206e6a2265290300200629030084500d02200220796a22020d000c0b0b0b20652009460d00024003402065206d6a29030021042065206e6a2202290300210020712065206f6a2903003703002074206520726a2903003703002077206520756a2903003703002001206520786a290300370390022000200484500d01200141d0006a20706a22062071290300370300200141d0006a20736a22082074290300370300200141d0006a20766a220520772903003703002001200129039002370350200141e0016a200141d0006a10de02200141c0016a20706a220a2071290300370300200141c0016a20736a22122074290300370300200141c0016a20766a2210207729030037030020012001290390023703c001024020012802e0012079460d002002216520092002470d010c030b0b200141f0016a20766a22132010290300370300200141f0016a20736a22102012290300370300200141f0016a20706a2212200a290300370300200120012903c0013703f001200141e0016a20766a2802002102200141306a20706a220a2012290300370300200141306a20736a22122010290300370300200141306a20766a22102013290300370300200120012903f001370330200141106a20706a2213200a290300370300200141106a20736a220a2012290300370300200141106a20766a2212201029030037030020012001290330370310200620132903003703002008200a29030037030020052012290300370300200120012903103703500240206a20024d0d002065206e6a216520692002207a746a22022001290350370000200220706a2006290300370000200220736a2008290300370000200220766a2005290300370000206c20796a216c4100211a41000d0a4103213a0c110b418084c2002002206a10b501000b200141306a41186a200141f0016a41186a290300370300200141306a41106a200141f0016a41106a290300370300200141306a41086a200141f0016a41086a290300370300200120012903f0013703300b0240206b450d00200910200b024002400240206a206841ffffff3f7122652065206a4b1b2208450d0020672165206921024100214d0340024020652002460d00206520024120108604450d00411610222206450d032006410e6a41002900d3c941370000200641086a41002900cdc941370000200641002900c5c94137000020064116413610212206450d04200620652900003700162006412e6a206541186a290000370000200641266a206541106a2900003700002006411e6a206541086a290000370000200141f0016a41186a22054200370300200141f0016a41106a223c4200370300200141f0016a41086a224f4200370300200142003703f00120064136200141f0016a1000200141c0016a41186a2005290300370300200141c0016a41106a203c290300370300200141c0016a41086a204f290300370300200120012903f0013703c001200141c0016a41201009200610200b206541206a2165200241206a2102204d41016a224d2008490d000b0b2069206a4105746a2165206a21050240024002400240024002400240206a4104490d00200141d0006a41206a213c20014190016a214f200141b0016a214e200141d0016a213f200141e8006a2106200141e0006a214d200141d8006a210820652102206a2105034020064200370300204d420037030020084200370300200142003703500240203c2002460d00200241606a200141d0006a41201086040d030b20064200370300204d420037030020084200370300200142003703500240204f2002460d00200241406a200141d0006a41201086040d040b20064200370300204d420037030020084200370300200142003703500240204e2002460d00200241a07f6a200141d0006a41201086040d050b20064200370300204d42003703002008420037030020014200370350200241807f6a21650240203f2002460d002065200141d0006a41201086040d060b2005417c6a210520652102206520696b41ff004b0d000b0b20652069460d052005417f6a2102200141d0006a41206a2106200141e8006a214d200141e0006a2108200141d8006a21050340204d4200370300200842003703002005420037030020014200370350024020062065460d00206541606a200141d0006a41201086040d060b2002417f6a21022069206541606a2265470d000c060b0b2005417f6a21020c030b2005417e6a21020c020b2005417d6a21020c010b2005417c6a21020b200241016a2265206a206a20654b1b216a0b200141ec006a2022360200200141d0006a41186a2023360200200141e4006a2024360200200141d0006a41106a200d360200200141dc006a201f360200200141d0006a41086a2202201e360200200141033a0054200141063a0050200141d0006a103d20014190026a41086a226542003703002001420037039002419084c200411220014190026a1002200220652903003703002001200129039002370350200141003602980220014201370390022001206a3602f001200141f0016a20014190026a103e024002400240206a450d00206a41057421054100206528020022026b214d200128029002213c200128029402210820692165034002402008204d6a411f4b0d00200241206a22062002490d232008410174224f20062006204f491b22064100480d23024002402008450d00203c200820061021223c0d010c060b20061022223c450d050b200621080b203c20026a22062065290000370000200641186a206541186a290000370000200641106a206541106a290000370000200641086a206541086a290000370000204d41606a214d200241206a2102206541206a2165200541606a22050d000b20014198026a200236020020012008360294022001203c360290020c010b206528020021022001280294022108200128029002213c0b200141d0006a4110203c2002100302402008450d00203c10200b02402068450d00206910200b20014190026a41086a22654200370300200142003703900241a284c200411620014190026a1002200141f0016a41086a2202206529030037030020012001290390023703f0012001206c360250200141f0016a4110200141d0006a4104100320654200370300200142003703900241b884c200411120014190026a10022002206529030037030020012001290390023703f00102400240200141f0016a411041c8d7c400410041001001417f460d0020014100360250200141f0016a4110200141d0006a41044100100141016a41044d0d06200128025041016a21650c010b410121650b20014190026a41086a22024200370300200142003703900241b884c200411120014190026a1002200141f0016a41086a200229030037030020012001290390023703f00120012065360250200141f0016a4110200141d0006a4104100302402066450d00206710200b2019a7450d20201810200c200b200641011023000b411641011023000b413641011023000b202a2007102d000b419a88c00041331039000b20102060102d000b20602010417f6a225f490d160b20602007102e000b4100213a0c050b4103213a0c050b4102213a0c070b4103213a0c070b4103213a0c070b410021020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410121020c080b410121020c070b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b205d205e470d13410121020c170b205d20456a2202205d490d1a205d2045742206200220022006491b2202ad2046862204204788a70d1a2004a722062042480d1a02400240205d450d00205c205d20487420061021225c0d010c030b20061022225c450d020b2002215d410221020c160b205c205e2048746a220220613602042002205f360200205e20456a2264215e20642049490d02410121630c140b200641041023000b0240024020630e020001010b2060201020446a225f490d1602402060205f6b22612049490d0020262010204b6c6a2202204d6a22082903002026205f204b6c6a2206204d6a220529030022045a0d00200141f0016a204e6a220a2006204e6a2212290300370300200141f0016a204f6a22132006204f6a220f290300370300200141f0016a203c6a220e2006203c6a2214290300370300200120062903003703f0012006200229030037030020142002203c6a290300370300200f2002204f6a29030037030020122002204e6a29030037030020052008290300370300024020612048490d00200620566a29030020045a0d0041022106206221080240034020082202204d6a200220576a2903003703002002204e6a200220586a2903003703002002204f6a200220596a2903003703002002203c6a2002205a6a29030037030020022002204b6a2208290300370300200620456a220620614f0d01200220566a2903002004540d000b0b2002204b6a21020b200220012903f001370300200220043703202002204e6a200a2903003703002002204f6a20132903003703002002203c6a200e2903003703000b205f450d0f2062203f6a2162205f21102061205b490d0d410021020c140b0240024002400240205c2064220e20446a22642048746a2202280200450d00205c200e2048746a220a20516a2802002205200228020422064d0d004102215e200e41024d0d04205c200e204a6a22022048746a2802042208200620056a4d0d014103215e200e41034d0d04200a20526a280200200820056a4d0d010c050b200e2048490d0120022802042106205c200e204a6a22022048746a28020421080b20082006490d010b200e20506a21020b200e200220456a22254d0d03200e20024d0d04205c20022048746a2215280204222020152802006a2202205c20252048746a2227280200225e490d05200220074b0d06201520436a21212026205e204b6c6a220f20272802042214204b6c22066a210a2002204b6c2108024002400240024002402002205e6b221220146b220220144f0d00203d200a2002204b6c22061084041a203e20066a210520142045480d0120022045480d01204020086a2108200a2102034020082002203f6a22122005203f6a22132005204c6a2903002002204c6a29030054220a1b22062903003703002008204d6a2006204d6a2903003703002008204e6a2006204e6a2903003703002008204f6a2006204f6a2903003703002008203c6a2006203c6a29030037030020052013200a1b2105200f20122002200a1b22024f0d042008203f6a2108203e2106203e2005490d000c050b0b203d200f20061084041a203e20066a210520142045480d01201220144c0d01202620086a2113203e2106200f210203402002200a2006200a204d6a2903002006204d6a2903005422121b22082903003703002002204d6a2008204d6a2903003703002002204e6a2008204e6a2903003703002002204f6a2008204f6a2903003703002002203c6a2008203c6a29030037030020062006204b6a20121b21062002204b6a2102200a204b6a200a20121b220a20134f0d04200520064b0d000c040b0b200a21020c010b200f21020b203e21060b20022006200520066b22082008204b706b1084041a2021202020146a3602002015205e36020020272027203c6a2025204473200e6a2048741085041a2064215e206420454b0d0d0b205f0d060c010b200e215e205f0d060b0240205d450d00205c10200b203b450d06203d1020410021020c110b41e896c2002025200e10b501000b41e896c2002002200e10b501000b205e2002102d000b20022007102e000b4101213a0c020b4101213a0c020b410021020c0a0b410121020c090b410121020c080b410021630c030b410121630c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b205f2060102d000b1031000b1024000b2017450d00201610200b200141b0026a24000bd20201047f230041d0006b22022400024002400240411310222203450d002003410f6a41002800b39141360000200341086a41002900ac9141370000200341002900a4914137000020034113412610212203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a103820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031020200241d0006a24000f0b411341011023000b412641011023000b419a88c00041331039000b800301047f230041c0006b220124000240024002400240411010222202450d00200241086a41002900feee40370000200241002900f6ee403700002000280200210320024110412010212202450d01200220033600102002412041c00010212202450d02200220002900043700142002412c6a2000411c6a290000370000200241246a200041146a2900003700002002411c6a2000410c6a290000370000200141206a41186a22004200370300200141206a41106a22034200370300200141206a41086a220442003703002001420037032020024134200141206a1000200141186a2000290300370300200141106a2003290300370300200141086a2004290300370300200120012903203703004100210002402001412041c8d7c400410041001001417f460d00200141003a002020014120200141206a41014100100141016a41014d0d0420012d002021000b20021020200141c0006a240020000f0b411041011023000b412041011023000b41c00041011023000b419a88c00041331039000b8912040a7f047e0a7f027e230041b0036b220524000240024002400240024002400240024002400240024002402004450d0020054190036a41186a2206420037030020054190036a41106a2207420037030020054190036a41086a22084200370300200542003703900341b791c100411d20054190036a1000200541e8016a41186a2006290300370300200541e8016a41106a2007290300370300200541e8016a41086a200829030037030020052005290390033703e801410021060240200541e8016a412041c8d7c400410041001001417f460d00200541d0026a41186a4200370300200541d0026a41106a4200370300200541d0026a41086a4200370300200542003703d002200541e8016a4120200541d0026a4120410010012206417f460d0b2006411f4d0d0b200541a0016a41186a200541d0026a41186a290300370300200541a0016a41106a200541d0026a41106a290300370300200541a0016a41086a200541d0026a41086a290300370300200520052903d0023703a001410121060b412810222208450d0b200820063a0004200841c8d7c400360200200820052903a001370005200820052f00e8013b00252008410d6a200541a8016a290300370000200841156a200541b0016a2903003700002008411d6a200541b8016a290300370000200841276a200541ea016a2d00003a0000200541a0016a200810ab0220052d00a001450d012004417f6a2109200541e8016a41206a210a200541a0016a4101722106200541e8016a41c0006a220b2002460d02200541e8016a41186a210c200541e8016a41106a210d200541c8026a210e4200210f4200211042002111420021120340200c2010370300200d200f370300200520113703e801200520123703f001200a200641c10010840421040240200b200241201086040d00200541f0026a41186a2213200441186a2214290200370300200541f0026a41106a2215200441106a2216290200370300200541f0026a41086a2217200441086a2218290200370300200520042902003703f002411010222207450d07200741086a41002900feee40370000200741002900f6ee4037000020074110412010212207450d0a200720013600102007412041c00010212207450d0b200720052903f0023700142007412c6a2013290300370000200741246a20152903003700002007411c6a201729030037000020054190036a41186a2219420037030020054190036a41106a221a420037030020054190036a41086a221b420037030020054200370390032007413420054190036a1000200541d0026a41186a2019290300370300200541d0026a41106a201a290300370300200541d0026a41086a201b29030037030020052005290390033703d002200541d0026a412041c8d7c400410041001001211c20071020201c417f470d00200e2c00002107201320142900003703002015201629000037030020172018290000370300200520042900003703f00220054190016a200541f0026a103b20054190016a41086a290300211d200529039001211e20054180016a200541f0026a103b200541d0006a20052903800120054180016a41086a2903002007200320072003411874411875481b2204ad423886423887420010880420192013290300370300201a2015290300370300201b2017290300370300200520052903f00237039003200541e0006a200120054190036a2004200910ec01201d20107c201e200f7c2210201e54ad7c200541e0006a41186a2903007c201020052903707c220f201054ad7c2110200541d0006a41086a29030020127c2005290350221e20117c2212201e54ad7c200541e0006a41086a2903007c201220052903607c2211201254ad7c21120b200541a0016a200810ab0220052d00a0010d000c040b0b4200210f4200211042002111420021120c030b42002111420021124200210f420021100c010b200541c8026a21194200210f4200211042002111420021120340200541e8016a41186a2010370300200541e8016a41106a200f370300200520113703e801200520123703f001200a200641c100108404210c200541f0026a41186a2207200641186a290000370300200541f0026a41106a2202200641106a290000370300200541f0026a41086a220b200641086a290000370300200520062900003703f002411010222204450d03200441086a41002900feee40370000200441002900f6ee4037000020044110412010212204450d04200420013600102004412041c00010212204450d05200420052903f0023700142004412c6a2007290300370000200441246a20022903003700002004411c6a200b29030037000020054190036a41186a220d420037030020054190036a41106a2213420037030020054190036a41086a2215420037030020054200370390032004413420054190036a1000200541d0026a41186a200d290300370300200541d0026a41106a2013290300370300200541d0026a41086a201529030037030020052005290390033703d002200541d0026a412041c8d7c40041004100100121172004102002402017417f470d0020192c000021042007200c41186a2900003703002002200c41106a290000370300200b200c41086a2900003703002005200c2900003703f002200541c0006a200541f0026a103b200541c0006a41086a290300211d2005290340211e200541306a200541f0026a103b20052005290330200541306a41086a2903002004200320042003411874411875481b2204ad4238864238874200108804200d2007290300370300201320022903003703002015200b290300370300200520052903f00237039003200541106a200120054190036a2004200910ec01201d20107c201e200f7c2210201e54ad7c200541106a41186a2903007c201020052903207c220f201054ad7c2110200541086a29030020127c2005290300221e20117c2212201e54ad7c200541106a41086a2903007c201220052903107c2211201254ad7c21120b200541a0016a200810ab0220052d00a0010d000b0b200810200b2000200f37031020002011370300200041186a201037030020002012370308200541b0036a24000f0b411041011023000b412041011023000b41c00041011023000b412041011023000b41c00041011023000b419a88c00041331039000b412841041023000bbd1207017f017e087f047e017f037e067f23004180016b2203240042002104200341086a41086a220542003703002003420037030841cdc8c000410d200341086a1002200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041c8d7c400410041001001417f460d0020034200370308200341d8006a4110200341086a41084100100141016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110a80220032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210902402007450d00200610200b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b2003200328024036023841281022220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2216460d002006200841286c6a2108200341d8006a41186a210b200341f9006a221741036a21184101210941012115034002400240024002400240200b2000460d000340200341d8006a41206a2219200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2211200c41106a290300370300200341d8006a41086a221a200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002011290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2008200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022008200c41286a220c470d000c070b0b2003201728000036025020032018280000360053200c41286a210c201a290300211020192d00002111200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22111b21102013200f20111b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722111200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b36004320032003280248360240200341d8006a41206a221920113a0000200b200e370300200341d8006a41106a221a200d3703002017200328024036000020182003280043360000200320103703602003200f370358024020152009470d00200941016a22112009490d0620094101742215201120112015491b2215ad42287e220d422088a70d06200da722114100480d0602402009450d00200a200941286c20111021220a0d010c080b20111022220a450d070b200a200941286c6a22112003290358370300201141206a2019290300370300201141186a200b290300370300201141106a201a290300370300201141086a200341d8006a41086a290300370300200941016a2109200c2016470d000c020b0b41012109410121150b02402007450d00200610200b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2208200541086a2903003703002003200529030037035820092015470d04200941016a220c2009490d0120094101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402009450d00200a200941286c200c1021220a450d010c060b200c1022220a0d050b200c41081023000b419a88c00041331039000b1024000b201141081023000b412841081023000b200a200941286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2008290300370300200941016a21090b200320093602602003201536025c2003200a3602582001200341d8006a10ac0220034180016a24000b8607010d7f230041e0006b220124000240024002400240411a10222202450d00200241186a41002f00eeef403b0000200241106a41002900e6ef40370000200241086a41002900deef40370000200241002900d6ef403700002002411a413410212202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1000200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100920021020411310222202450d022002410f6a41002800b39141360000200241086a41002900ac9141370000200241002900a4914137000020024113412610212202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1000200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100920021020200141c0006a200010ea012001280244210820012802402109024002400240024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010222202450d02200241086a41002900feee40370000200241002900f6ee4037000020024110412010212202450d03200220003600102002412041c00010212202450d04200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10002006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100920021020200a41606a220a0d000b0b02402008450d00200910200b200141e0006a24000f0b411041011023000b412041011023000b41c00041011023000b411a41011023000b413441011023000b411341011023000b412641011023000bd30201057f230041d0006b22022400024002400240411710222203450d002003410f6a410029009c9141370000200341086a410029009591413700002003410029008d914137000020034117412e10212203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1000200241186a2004290300370300200241106a2005290300370300200241086a200629030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a10e80120022802302204450d0420002002290234370204200020043602000c010b20004100360208200042083702000b20031020200241d0006a24000f0b411741011023000b412e41011023000b419a88c00041331039000b9d0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e024002400240024002402000450d00200041e8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410f470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007102122060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007102122060d060c0c0b200228020021060c030b200228020021060c050b200710222206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341e8006a2103200441987f6a22040d030c040b200710222206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a000020032002109501200341e0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102122060d020c090b200228020021060c020b200010222206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341e8006a2103200441987f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100302402000450d00200310200b200241106a24000f0b1024000b200741011023000b200741011023000b200041011023000bb60504027f017e0e7f017e230041d0006b22022400200241086a2001108e010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210e4100210d0c030b1031000b200541081023000b200141046a2107200241306a41186a2108200241306a41106a21094100210a4100210b4100210c2003210d0240034020024200370330200141086a2205410020012802002007280200200241306a410820052802001001220e200e417f461b220e4108200e4108491b20052802006a220f360200200e41074d0d01200229033021042008420037030020094200370300200241306a41086a22104200370300200242003703302005410020012802002007280200200241306a4120200f1001220e200e417f461b220e4120200e4120491b20052802006a360200200e411f4d0d01200c41016a210e200241106a41186a220f2008290300370300200241106a41106a22112009290300370300200241106a41086a22122010290300370300200220022903303703100240200c200d470d00200a200e200e200a491b220dad42287e2213422088a70d042013a722054100480d040240200c450d002006200b2005102122060d010c060b200510222206450d050b2006200b6a22052004370300200541206a200f290300370300200541186a2011290300370300200541106a2012290300370300200541086a2002290310370300200a41026a210a200b41286a210b200e210c200e2003490d000c020b0b200041003602000240200d450d00200610200b200241d0006a24000f0b2000200d36020420002006360200200041086a200e360200200241d0006a24000f0b1024000b200541081023000ba20403057f017e037f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d002003200041286c6a2104200241086a22052802002100200228020421060340200329030021070240024002400240200620006b41084f0d00200041086a22082000490d0620064101742209200820082009491b220a4100480d062006450d0120022802002006200a102122090d020c070b200041086a2108200228020021090c020b200a10222209450d050b2002200a36020420022009360200200a21060b20052008360200200920006a20073700000240024002400240200620086b41204f0d00200841206a22002008490d062006410174220a20002000200a491b220a4100480d062006450d0120092006200a102122090d020c080b200841206a21000c020b200a10222209450d060b2002200a36020420022009360200200a21060b20052000360200200920086a220841086a200341106a290000370000200841106a200341186a290000370000200841186a200341206a2900003700002008200341086a290000370000200341286a22032004470d000b200128020020012802042009200010032006450d050c040b200228020421032001280200200128020420022802002209200241086a280200100320030d030c040b1024000b200a41011023000b200a41011023000b200910200b200241106a24000bdd0504027f017e0f7f017e230041d0006b22022400200241086a2001108e010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210f4100210d0c030b1031000b200541081023000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241106a41186a22112007290300370300200241106a41106a22122008290300370300200241106a41086a2213200e29030037030020022002290330370310200242003703302005410020012802002009280200200241306a410820101001220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f200229033021042007201129030037030020082012290300370300200e2013290300370300200220022903103703300240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005102122060d010c060b200510222206450d050b2006200b6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a200e290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d00200610200b200241d0006a24000f0b2000200d36020420002006360200200041086a200f360200200241d0006a24000f0b1024000b200541081023000bc20304027f017e087f017e230041106b2202240020022001108e0102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b1031000b200541081023000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001001220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c102122060d010c060b200c10222206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610200b200241106a24000f0b1024000b200c41081023000bb50d03017f017e097f230041d0006b2204240042002105200441206a41086a220642003703002004420037032041c898c200411d200441206a1002200441086a220720062903003703002004200429032037030002400240024002400240024002400240024002402004411041c8d7c400410041001001417f460d002004421037021420042004360210200441206a200441106a10f60120042903304202510d0102402004280244450d00200441c0006a28020010200b200041046a280200450d0920002802001020200441d0006a24000f0b200642003703002004420037032041cdc8c000410d200441206a100220072006290300370300200420042903203703000240024002402004411041c8d7c400410041001001417f460d002004420037032020044110200441206a41084100100141016a41084d0d01200429032021050b02402002a74101470d00200441206a41086a220642003703002004420037032041e598c200411a200441206a1002200441086a20062903003703002004200429032037030002402004411041c8d7c400410041001001417f460d002004420037032020044110200441206a41084100100141016a41084d0d0320042903202005580d00200041046a280200450d0c20002802001020200441d0006a24000f0b200441206a41086a220642003703002004420037032041e598c200411a200441206a1002200441086a2006290300370300200420042903203703002004200142018620057c37032020044110200441206a410810030b200028020821062000280204210820002802002109200441206a41086a220042003703002004420037032041c898c200411d200441206a1002200441086a2000290300370300200420042903203703002004410036022820044201370320410810222200450d03200442888080808001370224200420003602202000200537000020004108411010212200450d04200442908080808002370224200020013700082004200036022020042006360210200441106a200441206a103e02400240024002402006450d002009200641286c6a210a200441206a41086a220b280200210c2004280224210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d062007410174220d20062006200d491b220e4100480d062007450d0120042802202007200e1021220d0d020c070b200c41206a21062004280220210d0c020b200e1022220d450d050b2004200e3602242004200d360220200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d032007410174220e200c200c200e491b220c4100480d03024002402007450d00200d2007200c1021220d0d010c070b200c1022220d450d060b2004200c3602242004200d360220200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441286a28020021002004280224210702400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0c20004101742207200620062007491b22074100480d0c2000450d03200428022020002007102122060d040c140b20072000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d05200428022020002007102122060d060c140b200428022021060c030b20042802202106200721070c050b200710222206450d100b20042007360224200420063602200b200441206a41086a220b200041016a220d360200200620006a41013a000002402007200d6b41074b0d00200d41086a220c200d490d072007410174220e200c200c200e491b220c4100480d072007450d0420062007200c102122060d050c110b2007210c0c050b200710222206450d0e0b20042007360224200420063602200b200441286a200041016a220d360200200620006a41003a0000200441102006200d10032007450d0f0c0e0b200c10222206450d0c0b2004200c360224200420063602200b200b200041096a22003602002006200d6a200337000020044110200620001003200c0d0b0c0c0b1024000b200e41011023000b200c41011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b410841011023000b411041011023000b200741011023000b200741011023000b200c41011023000b200610200b2008450d00200910200b200441d0006a24000be20808037f017e017f017e017f017e0c7f027e230041d0006b22022400200242003703302001410020012802002001280204200241306a41082001280208100122032003417f461b2203410820034108491b20012802086a2204360208024002400240024002400240200341074d0d002002290330210520024200370330200141086a220641002001280200200141046a280200200241306a41082004100122032003417f461b2203410820034108491b20062802006a360200200341074d0d0020022903302107200241086a2001108e012002280208450d000240024002400240200228020c2208ad42287e2209422088a70d002009a72203417f4c0d00024002402003450d0020031022220a450d032008450d010c040b4108210a20080d030b4100210f42002109200a450d040c030b1031000b200341081023000b200241306a41186a2104200241306a41106a2106200141046a210b420021094100210c4100210d4100210e2008210f024003402004420037030020064200370300200241306a41086a2210420037030020024200370330200141086a220341002001280200200b280200200241306a41202003280200100122112011417f461b22114120201141204922111b20032802006a221236020020110d01200241106a41186a22132004290300370300200241106a41106a22142006290300370300200241106a41086a221520102903003703002002200229033037031020024200370330200341002001280200200b280200200241306a41082012100122112011417f461b2211410820114108491b20032802006a360200201141074d0d01200e41016a211120022903302116200420132903003703002006201429030037030020102015290300370300200220022903103703300240200e200f470d00200c20112011200c491b220fad42287e2217422088a70d082017a722034100480d080240200e450d00200a200d20031021220a0d010c0a0b20031022220a450d090b200a200d6a22032002290330370300200341186a2004290300370300200341106a2006290300370300200341086a2010290300370300200341206a201637030020094280808080107c2109200c41026a210c200d41286a210d2011210e20112008490d000b200a0d010c020b200f450d01200a10200c010b2009200fad842116200241003a00302001280200200141046a280200200241306a4101200141086a22032802001001210420032003280200200441016a41014b22046a22063602002004450d0120022d00304101470d014200210920024200370330200141086a220341002001280200200141046a280200200241306a41082006100122012001417f461b2201410820014108491b20032802006a360200200141074d0d0220022903302117420121090c030b20004202370310200241d0006a24000f0b420021090b0b20002017370318200020093703102000200737030820002005370300200041246a2016370200200041206a200a360200200241d0006a24000f0b1024000b200341081023000b870301047f23004180026b22022400024002400240411210222203450d00200341106a41002f0098a7433b0000200341086a4100290090a74337000020034100290088a74337000020034112412410212203450d012003200136001220024198016a41186a2201420037030020024198016a41106a2204420037030020024198016a41086a2205420037030020024200370398012003411620024198016a1000200241e8006a41186a2001290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903980137036802400240200241e8006a412041c8d7c400410041001001417f460d002002422037028c012002200241e8006a3602880120024198016a20024188016a10ab012002290398014201520d04200241086a20024198016a41086a41e0001084041a20004201370300200041086a200241086a41e0001084041a0c010b200042003703000b2003102020024180026a24000f0b411241011023000b412441011023000b419a88c00041331039000b850602057f037e230041c0006b22042400024002400240411410222205450d00200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1000200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703000240024002402004412041c8d7c400410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051020200441206a2001200a20027c2202200920037c2002200a54ad7c10cb01200441206a41106a290300210a20042903282102024002400240024020042903204200510d004200210b200441206a41086a2205420037030020044200370320418feec0004116200441206a1002200441086a22012005290300370300200420042903203703002004411041c8d7c400410041001001417f460d01200442003703282004420037032020044110200441206a4110410010012206417f460d072006410f4d0d07200441286a2903002103200429032021090c020b2002210b0c020b42002109420021030b2005420037030020044200370320418feec0004116200441206a10022001200529030037030020042004290320370300200442002003200a7d2009200254ad7d220a200920027d2202200956200a200356200a2003511b22051b37032820044200200220051b37032020044110200441206a411010034200210a0b2000200b3703002000200a370308200441c0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000bb60202047f027e230041206b22022400200241106a41086a2203420037030020024200370310418feec0004116200241106a1002200241086a22042003290300370300200220022903103703000240024002402002411041c8d7c400410041001001417f460d00200242003703182002420037031020024110200241106a4110410010012205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b2003420037030020024200370310418feec0004116200241106a100220042003290300370300200220022903103703002002427f200620017c200720007c22002007542203ad7c22072003200720065420072006511b22031b3703182002427f200020031b37031020024110200241106a41101003200241206a24000f0b419a88c00041331039000b7d01017f230041c0006b220124002001412e36020c200141b3c1c000360208200120003602142001413c6a41223602002001412c6a4102360200200141033602342001420237021c200141b8d4c4003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41c8d4c4001048000b130020004101360204200041d8c2c0003602000b1600200120002802002200280200200028020810fd010b8008010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022064f0d014100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2109410020002d0030220320034103461b2203410371450d0220034102460d03410021080c040b2000280218200120022000411c6a28020028020c1100000f0b2000280218200120022000411c6a28020028020c1100000f0b20092108410021090c010b200941016a4101762108200941017621090b417f2103200041046a210a200041186a21062000411c6a210702400340200341016a220320094f0d012006280200200a2802002007280200280210110400450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1100000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110400450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11000021030b20030bb81c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b70120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10ff01200041086a200241206a41d8001084041a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10800221010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003102222040d0f200341011023000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e00010222204450d2e20042001410c6a28020010fe01410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10810220004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a1080022101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10820220004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10830220004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310840421012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b1045000b4198afc200102f000b1031000b41b8b3c000102f000b41d0bdc100102f000b41ccb0c200102f000b41f0afc200102f000b41a8a8c300102f000b41e00041081023000b980b02057f037e230041c0006b220224000240024020012d0000417f6a220341044b0d000240024002400240024002400240024002400240024020030e050004020301000b200041d0006a200141d0006a280200360200200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041d4006a200141d4006a2d00004100473a0000200041013a0000200241c0006a24000f0b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2004290300370000200041116a2005290300370000200041096a20062903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a0000200241c0006a24000f0b41012104200141046a2d00004101470d02200141086a28020021050c030b200141386a2903002107200141306a2903002108200141c0006a2903002109200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d08200141246a28020021012003450d032003102222040d04200341011023000b2001410c6a2802002203417f4c0d07200141046a2802002104200141106a29030021072003450d042003102222010d05200341011023000b200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002105410021040b200141306a2802002203417f4c0d05200141c0006a2903002107200141386a2903002108200141286a2802002106200141c8006a2903002109024002402003450d002003102222010d01200341011023000b410121010b2001200620031084042101200041c0006a2007370300200041386a2008370300200041046a20043a0000200041086a2005360200200041c8006a2009370300200041306a20033602002000412c6a2003360200200041286a2001360200200041056a20022f01003b0000200041076a200241026a2d00003a00002000410c6a2002290320370200200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a0000200241c0006a24000f0b410121040b2004200120031084042101200041386a2007370300200041306a2008370300200041c0006a20093703002000412c6a2003360200200041286a2003360200200041246a2001360200200041043a000020002002290320370001200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a290300370000200241c0006a24000f0b410121010b20012004200310840421012000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2007370300200041023a0000200241c0006a24000f0b41c89dc300102f000b1031000bdc1c04057f027e027f027e23004180016b22012400024002400240024002400240024002400240024041e00010222202450d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002200280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002c05090d0a0608040b030c0102000b200141086a200041086a10b70120024101360200200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200141086a200041086a10ff01200241086a200141086a41d8001084041a2002410d36020020014180016a240020020f0b200028020422044102460d0b4101210320044101470d2a200041086a10800221000c160b2000410c6a2802002203417f4c0d2a200028020421002003450d0e2003102222040d0f200341011023000b4102210320002d000422044102460d0a20044101470d2a200041086a280200210541e00010222204450d2f20042000410c6a28020010fe01410121030c0b0b200041086a28020022034102460d0b20034101470d2a2000410c6a22032d00004101470d14200041106a2802002104410121030c150b200141086a200041086a10810220024107360200200241c0006a200141086a41386a290300370300200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200041086a2903002106200241003602002002200637030820014180016a240020020f0b200041086a22042d0000417f6a220341044b0d28024020030e05001d191b17000b2000410c6a1080022100410121030c1d0b41032103200041086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d28200141e4006a200441066a2f00003b0100200141106a200041206a290000370300200141086a41106a200041286a2d00003a00002001200441026a2800003602602001200041186a290000370308200041106a2900002106200041096a2d000021000c0c0b200141086a200041086a10820220024106360200200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200041086a29030021062002410a3602002002200637030820014180016a240020020f0b200041086a280200417f6a220341044b0d26024020030e05001b161814000b200041386a2903002106200041306a2903002107410121032000410c6a2d00004101470d1b200041106a28020021000c1c0b200141086a200041086a10830220024105360200200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b41012103200041086a2d00004101470d082000410c6a2802002104410021050c090b200141e0006a41026a200041046a220441036a2d00003a0000200141086a41086a200041186a290000370300200141156a2000411d6a290000370000200120042f00013b01602001200041106a290000370308200041256a2d00004100472108200041286a28020021092000410c6a2800002104200041086a28000021050b200220012f01603b0005200220033a00042002200436020c200220053602082002200129030837021020022009360228200220083a002520024109360200200241076a200141e2006a2d00003a0000200241186a200141106a2903003702002002411d6a200141156a29000037000020014180016a240020020f0b410121032000410c6a22042d00004101470d0a200041106a28020021040c0b0b410121040b20042000200310840421002002200336020c20022003360208200220003602042002410b36020020014180016a240020020f0b200041106a29030021060c010b20042d000141004721000b200220003a0009200220033a00082002200128026036010a2002200637031020022001290308370318200241043602002002410e6a200141e0006a41046a2f01003b0100200241206a200141106a290300370300200241286a200141186a29030037030020014180016a240020020f0b200141086a41086a200041186a290000370300200141086a41106a200041206a290000370300200141086a41186a200041286a2d00003a00002001200041106a290000370308200041096a2f00002000410b6a2d00004110747241087421052000410c6a2800002104410021030b200141e0006a41186a200141086a41186a280200360200200141e0006a41106a200141086a41106a290300370300200141e0006a41086a200141086a41086a2903003703002001200129030837036020032005722100410221030b2002200436020c2002200036020820022003360204200220012903603702102002410e360200200241186a200141e8006a290300370200200241206a200141f0006a290300370200200241286a200141e0006a41186a28020036020020014180016a240020020f0b200141fe006a200341036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120032f00013b017c2001200041146a290200370308200041106a2802002104410021030b200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041386a2903002106200041306a2903002107410121050c020b200141fe006a200441036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120042f00013b017c2001200041146a290200370308200041106a2802002104410021030b41022105200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041c8006a290300210a200041c0006a290300210b200041386a2903002106200041306a29030021070b2002200b37034020022007370330200220033a000c20022005360208200220012f01043b000d200220043602102002200129036037021420024103360200200241c8006a200a370300200241386a20063703002002410f6a200141066a2d00003a00002002411c6a200141e8006a290300370200200241246a200141f0006a2903003702002002412c6a200141f8006a28020036020020014180016a240020020f0b200041106a2903002106410521030c060b2000410c6a28020022034108762104410521000c090b41032103200141fe006a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041106a29000021062000410c6a28000021000c040b200141086a41106a200041206a2903003703002001200041186a2903003703102001200041106a2802003602082000410c6a28020022034108762104200041286a290300210b410321000c070b200041106a2903002106410421030c020b2000410c6a28020022034108762104410421000c050b41022103200141fc006a41026a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041296a2d00004100472104200041106a29000021062000410c6a28000021000b200220012f017c3b0009200220033a0008200220063703102002200036020c20022001290308370318200220043a00292002200128016036012a2002410b6a200141fe006a2d00003a0000200241206a200141086a41086a290300370300200241286a200141186a2d00003a00002002412e6a200141e4006a2f01003b01002002410836020020014180016a240020020f0b2001200041186a2903003703102001200041106a29030037030841022100410021030c020b200141e8006a2000411c6a290200370300200141e0006a41106a200041246a2802003602002001200041146a290200370360200041286a3502002000412c6a31000042208684210b2000410d6a2f00002000410f6a2d0000411074722104200041106a2802002100410021030b200141146a200141e8006a2903003702002001411c6a200141f0006a2802003602002001200129036037020c20012000360208410121000b2002200737033020022000360208200220012903083703102002200b3703282002410c360200200241386a200637030020022004410874200341ff01717236020c200241186a200141086a41086a290300370300200241206a200141186a29030037030020014180016a240020020f0b41e00041081023000b1045000b4198afc200102f000b1031000b41b8b3c000102f000b41d0bdc100102f000b41ccb0c200102f000b41f0afc200102f000b41a8a8c300102f000b41e00041081023000bb20a01047f230041206b2202240002400240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d124101210402402003450d0020012802042105200310222204450d142004200520031084041a0b20002004360204200041013602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210441012103200141086a22052d00004101470d062001410c6a28020021050c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c2003450d0920012802042105200310222204450d0e2004200520031084041a0c0a0b4101210320012d00044101470d06200141086a28020021040c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200541036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220052f00013b011c2002200141106a2902003703002001410c6a2802002105410021030b20002004360204200020022f011c3b0009200041086a20033a00002000410c6a2005360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002104410021030b200020033a0004200020022f011c3b0005200041086a20043602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20002004360204200041023602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b41ac86c200102f000b1031000b200341011023000b200341011023000bf70401027f02400240024020012d0000417f6a2202410b4b0d004109210302400240024002400240024002400240024002400240024020020e0c000406020809070b05030a01000b41e00010222202450d0c2002200141046a28020010b602200041046a2002360200200041106a200141106a290300370300200041086a200141086a290300370300200041013a00000f0b2000410c3a00000f0b200020012d00013a0001200041046a200141046a280200360200200041043a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700002000410a3a00000f0b200041046a200141046a280200360200410221030b200020033a00000f0b200020012d00013a0001200041046a200141046a280200360200200041033a00000f0b200041086a200141086a290300370300200041046a200141046a280200360200200041073a00000f0b41e00010222202450d052002200141046a28020010b602200041046a2002360200200041086a200141086a290300370300200020012d00013a0001200041053a00000f0b200041046a200141046a280200360200200041063a00000f0b20002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00002000410b3a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041083a00000f0b41f4bcc100102f000b41e00041081023000b41e00041081023000be70d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410e4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0f00090607030a0c080d050e02040b01000b41012103200141046a2d00004101470d0e200141086a28020021040c0f0b2001410c6a2802002205ad2206421b88a70d162006420586a72203417f4c0d16200141046a28020021072003450d11200310222208450d172005450d120c1b0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2000410d3a0000200020012d00014100473a0001200241206a24000f0b2000410a3a0000200041086a200141086a290300370300200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0d2006a72204417f4c0d0d200141046a28020021032004450d0a20041022220b450d0f200a450d0b0c100b2000410e3a0000200041046a200141046a280200360200200241206a24000f0b200041073a0000200241206a24000f0b41012103200141046a2d00004101470d03200141086a28020021010c040b2000410b3a0000200041086a200141086a290300370300200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41c898c400102f000b1031000b200341011023000b200441041023000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410f3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a220442003703002001420037032041dbc9c1004115200141206a1002200141086a200429030037030020012001290320370300024002402001411041c8d7c400410041001001417f460d002001421037021420012001360210200141206a200141106a10f30120012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d02200420004120108604450d02200441286a22082000460d02200820004120108604450d02200441d0006a22082000460d02200820004120108604450d02200441f8006a22082000460d02200441a0016a21042008200041201086040d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d02200420004120108604450d022008200441286a2204470d000b0b410021070b02402003a7450d00200210200b200141306a240020070f0b419a88c00041331039000baf0601097f230041106b220224002002410036020820024201370300200028020021030240024002400240410410222204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810212204450d012002428880808080013702042004200336000420022004360200200041086a28020021042002200041106a280200220336020c2002410c6a2002103e02400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a102122090d020c070b200341206a2108200228020021090c020b200a10222209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b200041146a280200210420022000411c6a280200220336020c2002410c6a2002103e02402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a102122090d020c080b200228020021090c020b200a10222209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10032007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100320040d050c060b1024000b200a41011023000b200a41011023000b410441011023000b410841011023000b200910200b200241106a24000bb12403027f027e0a7f230041b00d6b2208240002402001280224200128024022092802a001470d00200041013a0000200041086a4124360200200041046a4183a9c300360200200841b00d6a24000f0b200442002004290308220a20094198016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a41a7a9c300360200200841b00d6a24000f0b200841b0026a41186a22094200370300200841b0026a41106a220c4200370300200841b0026a41086a220d4200370300200842003703b00220062007200841b0026a100020084180016a41186a200929030037030020084180016a41106a200c29030037030020084180016a41086a200d290300370300200820082903b00237038001024002400240024002400240024002400240024002400240412010222209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010212209450d012009200829038001370020200941386a20084180016a41186a290300370000200941306a20084180016a41106a290300370000200941286a20084180016a41086a290300370000200941c00041800110212209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841b0026a41186a220c4200370300200841b0026a41106a220d4200370300200841b0026a41086a220f4200370300200842003703b002200941e000200841b0026a1000200841106a41186a200c290300370300200841106a41106a200d290300370300200841106a41086a200f290300370300200820082903b00237031020091020200841c4006a41d4a9c300360200200841306a41086a420037030020082001410c6a221036024020084180e5c2003602342008410036023020084180026a41186a200541186a29000037030020084180026a41106a200541106a29000037030020084180026a41086a200541086a2900003703002008410136023020082005290000370380022010200841106a10d401210920082008280230417f6a220c360230024002400240024002402009450d00200841306a410c6a2802002109200841306a41086a280200210520082802342101200041086a412a360200200041046a41ebafc000360200200041013a00002005450d012005210420012100034020002802880b21002004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012005417f6a22050d000c030b0b200c0d082008417f36023020084180016a41186a200841106a41186a29030037030020084180016a41106a200841106a41106a29030037030020084180016a41086a200841106a41086a29030037030020082008290310370380012008280234220c4180e5c200460d02200841306a41086a28020021110c030b200121000b200841cc026a20012f0106360200200841c8026a4100360200200841c4026a2001360200200820093602d002200841003602c002200842003703b802200820003602b402200841003602b002200841b0026a1054200841b00d6a24000f0b41880b1022220c450d0641002111200c41003b0106200c4100360200200c41086a200841b0026a41800b1084041a200841306a41086a41003602002008200c3602340b200841306a4104722112024002400340200c2f01062213410574211441002109417f210d024002400240034020142009460d01200d41016a210d417f410120084180016a200c20096a41086a4120108604220f4100481b4100200f1b220f450d05200941206a2109200f4101460d000b20110d010c020b2013210d2011450d010b2011417f6a2111200c200d4102746a41880b6a280200210c0c010b0b200841c8006a41186a220920084180016a41186a290300370300200841c8006a41106a220f20084180016a41106a290300370300200841c8006a41086a221420084180016a41086a29030037030020082008290380013703482008419c016a2014290300370200200841a4016a200f290300370200200841ac016a200929030037020020082008413c6a360290012008200d36028c0120082012360288012008200c3602840120084100360280012008200829034837029401200841e4026a4200370200200841003a00ec02200842003703b00220084180e5c2003602e002200842003703c80220084180016a200841b0026a104121090c010b200c200d41e0006c6a41e8026a21090b200941013a003c200941286a427f370300200941206a427f3703002009413d6a200829038002370000200941d5006a20084180026a41186a290300370000200941cd006a20084180026a41106a220c290300370000200941c5006a20084180026a41086a220d290300370000200942013703182008200828023041016a360230200c200841306a41106a290300370300200d200841306a41086a2903003703002008200829033037038002200841c8006a41186a2214200841106a41186a290300370300200841c8006a41106a2211200841106a41106a290300370300200841c8006a41086a2213200841106a41086a2903003703002008200829031037034820084180016a200841c8006a10c7014100210f0240024020082d00800122124102470d000c010b200841b0016a280200210920120d002009417f4c0d07200841ac016a280200211520084180016a41286a2802002112024002402009450d0020091022220f0d01200941011023000b4101210f0b200f201220091084041a2015450d00201210200b200841b0026a41086a200936020020084184036a20132903003702002008418c036a201129030037020020084194036a2014290300370200200841c4026a200d290300370200200841cc026a200c290300370200200820093602b4022008200f3602b002200820082903483702fc0220082008290380023702bc02200141246a2802002109200141c0006a290200210b2001280248210c200841e8026a4200370300200841e0026a428080808080013703002008200c3602f8022008200b3703f002200842083703d8022008200941016a3602d402200841086a20044101200e200841106a20022003200841b0026a109603024020082802082209450d00200828020c2101200041013a0000200041086a2001360200200041046a200936020020082802b00222010d0b0c0c0b20084180016a2005200141c8006a28020028020010970202402008280280014101470d00200041046a200829028401370200200041013a00000c0a0b20084180026a41186a22092008419c016a28020036020020084180026a41106a220c20084194016a29020037030020084180026a41086a22052008418c016a290200370300200820082902840137038002200841c8006a41106a2005290300370300200841c8006a41186a200c290300370300200841e8006a20092802003602002008410636024c200841fbb2c3003602482008200829038002370350200141c4006a280200210d200841e0016a41186a220e200141e4006a290000370300200841e0016a41106a220f200141dc006a290000370300200841e0016a41086a2214200141d4006a2900003703002008200129004c3703e0014200210b20054200370300200842003703800241da95c200410d20084180026a1002200841a0026a41086a200529030037030020082008290380023703a0020240200841a0026a411041c8d7c400410041001001417f460d002008420037038002200841a0026a411020084180026a41084100100141016a41084d0d04200829038002210b0b20084180026a108b02200841a4016a2014290300370200200841ac016a200f290300370200200841b4016a200e29030037020020084180016a41c4006a200529030037020020084180016a41cc006a200c29030037020020084180016a41d4006a2009290300370200200820033703880120082002370380012008200b37039001200820082903e00137029c0120082008290380023702bc012008200841b0026a3602980120084100360288022008420137038002200841f0006a200d200841c8006a20084180016a2006200720084180026a2004105d02400240200828027022054101460d0020054102470d01200041046a2008290274370200200041013a0000200841e0006a280200450d0b200841dc006a280200102020082802b00222010d0c0c0d0b200841f8006a280200450d00200828027410200b20084180016a41186a200141cc006a220541186a29000037030020084180016a41106a200541106a29000037030020084180016a41086a200541086a29000037030020084180026a41086a200841106a41086a29030037030020084180026a41106a200841106a41106a29030037030020084180026a41186a200841106a41186a290300370300200820052900003703800120082008290310370380020240024002400240200841e0026a2802002205200841dc026a280200470d00200541016a22042005490d0b20054101742209200420042009491b2209ad42d8007e220b422088a70d0b200ba7220c4100480d0b2005450d01200841d8026a280200200541d8006c200c102122040d020c0c0b200841d8026a28020021040c020b200c10222204450d0a0b200841dc026a2009360200200841d8026a2004360200200841e0026a28020021050b2004200541d8006c6a2205200829038001370001200541013a00002005200829038002370021200520082900e001370041200541096a20084180016a41086a2204290300370000200541116a20084180016a41106a290300370000200541196a20084180016a41186a290300370000200541296a20084180026a41086a2209290300370000200541316a20084180026a41106a290300370000200541396a20084180026a41186a290300370000200541d0006a200841ef016a290000370000200541c9006a200841e0016a41086a290000370000200841e0026a2205200528020041016a220c3602002004200841bc026a220541086a29020037030020092008418c016a2802003602002008200529020037038001200820082902840137038002200841ec026a2802002109200841e8026a2802002106200841e4026a2802002105200841dc026a2802002107200841d8026a28020021040240200841c8006a41186a280200450d00200841dc006a28020010200b024020082802b002220d450d0020082802b402450d00200d10200b20084180016a41086a220d20084180026a41086a280200360200200820082903800237038001200841b0026a41086a200d28020036020020082008290380013703b0022010200841b0026a10d60120082004200c41d8006c6a3602bc02200820043602b802200820073602b402200820043602b002200141286a200841b0026a10d8022008200520094107746a3602bc02200820053602b802200820063602b402200820053602b002200141346a200841b0026a10d702200041003a0000200041196a200841286a290300370000200041116a200841206a290300370000200041096a200841106a41086a29030037000020002008290310370001200841b00d6a24000f0b412041011023000b41c00041011023000b41800141011023000b419a88c00041331039000b10d701000b41880b41081023000b1031000b1024000b200c41081023000b20082802b0022201450d010b20082802b402450d00200110200b200841b0026a41186a2802002109200841c0026a280200210102400240200841b0026a41146a2802002200450d002000210420012105034020052802880b21052004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012000417f6a22000d000c020b0b200121050b2008419c016a20012f010636020020084180016a41186a410036020020084180016a41146a2001360200200820093602a001200841003602900120084200370388012008200536028401200841003602800120084180016a10540240200841e0026a2802002205450d00200841b0026a41286a2802002101200541d8006c21050340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200541a87f6a22050d000b0b0240200841dc026a280200450d00200841d8026a28020010200b0240200841ec026a2802002201450d0020014107742105200841e4026a28020041206a21010340200110920120014180016a2101200541807f6a22050d000b0b0240200841e8026a280200450d00200841e4026a28020010200b200841b00d6a24000b1c00200128021841d081c500410b2001411c6a28020028020c1100000beb1d03027f027e097f230041b0036b2209240002400240024020012802242001280240220a2802a001470d0020004183abc30036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a4190016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d00200041acabc30036020420004101360200200041086a41233602000c010b20024200410110f1021a200941c8016a41186a220d200241186a290000370300200941c8016a41106a220e200241106a290000370300200941c8016a41086a220f200241086a290000370300200920022900003703c80120094180026a200941c8016a10c701410021100240024020092d00800222114102460d00200941b0026a280200210a02402011450d00410021100c010b200a417f4c0d01200941ac026a2802002112200941a8026a280200211102400240200a450d00200a102222100d01200a41011023000b410121100b20102011200a1084041a2012450d00201110200b200941c8006a4200370300200941c0006a42808080808001370300200941306a41d4a9c3003602002009412c6a2001410c6a2212360200200941246a4200370200200941106a41106a4180e5c200360200200941106a41086a200a360200200941e4006a200f290300370200200941ec006a200e290300370200200941f4006a200d290300370200200942083703382009410036021c2009200a36021420092010360210200920092903c80137025c200920012802483602582009200141c0006a2902003703502009200141246a28020041016a3602340240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941106a1096032009280208220a450d00200928020c21012000200a36020420004101360200200041086a2001360200024020092802102201450d002009280214450d00200110200b200941106a41186a280200210a200941206a2802002101200941106a41146a2802002202450d012002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c030b0b201228020022134100480d0a201341ffffffff07460d0a2001410c6a201341016a360200200141106a210a200141146a28020021110240024002400340200a280200220e41086a210d200e2f010622144105742110417f210a02400240024003402010450d01200a41016a210a417f41012002200d4120108604220f4100481b4100200f1b220f450d03201041606a2110200d41206a210d200f4101460d000b20110d010c040b2014210a2011450d030b2011417f6a2111200e200a4102746a41880b6a210a0c010b0b200e200a41e0006c6a41e8026a220a450d0020094188026a2210200a41c5006a29000037030020094190026a220d200a41cd006a29000037030020094198026a220e200a41d5006a2900003703002009200a413d6a29000037038002200a2d003c4101470d0020094189016a201029030037000020094191016a200d29030037000020094199016a200e290300370000200920092903800237008101200941013a008001201220133602000c010b20094180016a2001411c6a2802002002200141206a28020028021011010020092d00800121022001200128020c417f6a36020c2002450d010b200941a8016a41186a20094199016a290000370300200941a8016a41106a20094191016a290000370300200941a8016a41086a20094189016a29000037030020092009290081013703a80120094180026a200941a8016a200141c8006a28020028020010970202402009280280024101470d00200020092902840237020420004101360200024020092802102201450d002009280214450d00200110200b200941106a41186a280200210a200941206a2802002101200941106a41146a2802002202450d042002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c060b0b20094180036a41186a220a2009419c026a28020036020020094180036a41106a221020094194026a29020037030020094180036a41086a22022009418c026a290200370300200920092902840237038003200941c8016a41106a2002290300370300200941c8016a41186a2010290300370300200941e8016a200a280200360200200941043602cc01200941bdb2c3003602c80120092009290380033703d001200141c4006a280200210a200941e0026a41186a200141e4006a290000370300200941e0026a41106a200141dc006a290000370300200941e0026a41086a200141d4006a2900003703002009200129004c3703e0024200210c20024200370300200942003703800341da95c200410d20094180036a1002200941a0036a41086a200229030037030020092009290380033703a003410021100240200941a0036a411041c8d7c400410041001001417f460d002009420037038003200941a0036a411020094180036a41084100100141016a41084d0d0b200929038003210c0b20094180036a108b02200941a4026a200941e0026a41086a290300370200200941ac026a200941e0026a41106a290300370200200941b4026a200941e0026a41186a29030037020020094180026a41c4006a20094180036a41086a2202290300370200200941cc026a20094180036a41106a29030037020020094180026a41d4006a20094180036a41186a290300370200200920043703880220092003370380022009200c37039002200920092903e00237029c0220092009290380033702bc022009200941106a360298022002200841086a2802003602002009200829020037038003200941f0016a200a200941c8016a20094180026a2006200720094180036a2005105d4101210d20092802f00122024101460d054100210620024102470d06200020092902f401370204200041013602000240200941e0016a280200450d00200941dc016a28020010200b024020092802102201450d002009280214450d00200110200b200941106a41186a2802002108200941206a2802002101200941106a41146a2802002202450d082002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c0a0b0b4101210d4100211041002106410121070c060b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a10540240200941c0006a2802002200450d00200941106a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200041a87f6a22000d000b0b02402009413c6a280200450d00200941386a28020010200b0240200941cc006a2802002201450d0020014107742100200941c4006a28020041206a21010340200110920120014180016a2101200041807f6a22000d000b0b200941c8006a280200450d0a200941c4006a2802001020200841046a2802000d0b0c0c0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a10540240200941c0006a2802002200450d00200941106a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200041a87f6a22000d000b0b02402009413c6a280200450d00200941386a28020010200b0240200941cc006a2802002201450d0020014107742100200941c4006a28020041206a21010340200110920120014180016a2101200041807f6a22000d000b0b200941c8006a280200450d08200941c4006a2802001020200841046a2802000d090c0a0b200941fc016a2802002110200941f0016a41086a280200210620092802f401210d0b0240200941e0016a280200450d00200941dc016a28020010200b410021070b20094180026a41086a220a200941246a290200370300200941c8016a41086a220e20094180026a410c6a2802003602002009200929021c3703800220092009290284023703c801200941cc006a280200210f200941c8006a2802002111200941106a41346a2802002102200941c0006a28020021132009413c6a2802002114200941106a41286a2802002105024020092802102215450d002009280214450d00201510200b200a200e280200360200200920092903c80137038002200941106a41086a200a28020036020020092009290380023703102012200941106a10d60120092005201341d8006c6a36021c200920053602182009201436021420092005360210200141286a200941106a10d80220092002200f4107746a36021c200920023602182009201136021420092002360210200141346a200941106a10d7022000410c6a2010360200200041086a20063602002000200d360204200041003602002007450d07200841046a280200450d0720082802001020200941b0036a24000f0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a2001360200200920083602a002200941003602900220094200370388022009200036028402200941003602800220094180026a10540240200941c0006a2802002200450d00200941106a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a28020010200b200141d8006a2101200041a87f6a22000d000b0b02402009413c6a280200450d00200941386a28020010200b0240200941cc006a2802002201450d0020014107742100200941c4006a28020041206a21010340200110920120014180016a2101200041807f6a22000d000b0b200941c8006a280200450d05200941c4006a2802001020200941b0036a24000f0b419a88c00041331039000b10d101000b1031000b200841046a280200450d010b200828020010200b200941b0036a24000bd90d01087f230041e0006b220324002003410036024041cec6c0004110200341c0006a41041003200341c0006a41086a220442003703002003420037034041cdc8c000410d200341c0006a1002200341106a41086a220520042903003703002003200329034037031020032000370340200341106a4110200341c0006a4108100320044200370300200342003703404183cec0004111200341c0006a10022005200429030037030020032003290340370310200341106a4110200141201003024002400240024002400240024002400240411010222204450d00200441086a41002900f7c840370000200441002900efc84037000020044110412010212205450d0120052000427f7c370010200341c0006a41186a22064200370300200341c0006a41106a22074200370300200341c0006a41086a220442003703002003420037034020054118200341c0006a1000200341106a41186a2006290300370300200341106a41106a2007290300370300200341106a41086a2208200429030037030020032003290340370310200341106a412020014120100320051020200442003703002003420037034041dac8c0004115200341c0006a10022008200429030037030020032003290340370310200341106a411020024120100320044200370300200342003703404194cec0004115200341c0006a1002200820042903003703002003200329034037031041002105024002400240024002400240200341106a411041c8d7c400410041001001417f460d002003200341106a36023020034110360234200341003a00402003200341106a4110200341c0006a41014100100141016a220441014b36023820044102490d0520032c00402108200341c0006a200341306a103820032802402204450d05200329024421002003200436020c2000a721092000422088a7220541d0004b0d02200341c0006a41186a200141186a290000370300200341c0006a41106a200141106a290000370300200341c0006a41086a200141086a29000037030020032001290000370340200341c0006a210120052009460d01200328020c2104200341c0006a21010c0a0b2003410136020c2006200141186a2900003703002007200141106a2900003703002004200141086a29000037030020032001290000370340200341c0006a2101410021080b200541016a22042005490d0a20054101742206200420042006491b2209ad4205862200422088a70d0a2000a722064100480d0a2005450d01200328020c2005410574200610212204450d020c070b200341c0006a41186a2206200141186a290000370300200341c0006a41106a2207200141106a290000370300200341c0006a41086a2202200141086a29000037030020032001290000370340200520084d0d05200420084105746a22012003290340370000200141186a2006290300370000200141106a2007290300370000200141086a2002290300370000200841187441808080086a41187541d1006f21080c080b2006102222040d050b200641011023000b419a88c00041331039000b411041011023000b412041011023000b41accec0002008200510b501000b2003200436020c0b200420054105746a22062001290000370000200641186a200141186a290000370000200641106a200141106a290000370000200641086a200141086a290000370000200541016a21050b200341c0006a41086a22014200370300200342003703404194cec0004115200341c0006a1002200341106a41086a2001290300370300200320032903403703102003410036024820034201370340410110222206450d02200620083a00002003428180808010370244200320063602402003200536023020054105742107200341306a200341c0006a103e4100200128020022056b2108200328024021022003280244210603400240200620086a411f4b0d00200541206a22012005490d022006410174220a20012001200a491b22014100480d02024002402006450d00200220062001102122020d010c050b200110222202450d040b200121060b200220056a22012004290000370000200141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a290000370000200841606a2108200541206a2105200441206a2104200741606a22070d000b200341c8006a20053602002003200636024420032002360240200341106a411020022005100302402006450d00200210200b02402009450d00200328020c10200b200341c0006a41086a220442003703002003420037034041bccec000410d200341c0006a1002200341106a41086a200429030037030020032003290340370310200341106a41101009200341e0006a24000f0b1024000b200141011023000b410141011023000bba1607027f017e137f017e047f017e077f23004180026b22022400200241106a2001108e01024002400240024002400240024002400240024002402002280210450d0020022802142203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d01200510222206450d032003450d020c040b2000410036020020024180026a24000f0b4108210620030d020b41002114410021130c020b200541081023000b200241c4016a210520024185016a2107200241186a4101722108200141046a2109200141086a210a200241f8016a210b200241c3016a220c41056a210d200241bf016a210e200241e8016a210f410021104100211141002112200321130340200241003a00b00120012802002009280200200241b0016a4101200a28020010012114200a200a280200201441016a41014b22146a22153602002014450d0220022d00b001221441044b0d02024002400240024002400240024002400240024002400240024002400240024020140e050004020301000b20022001108e012002280200450d1120022802042214417f4c0d152014450d04201410762216450d0a200a201441002001280200200928020020162014200a280200100122152015417f461b2215201520144b1b2215200a2802006a36020020152014460d050c090b20092802002114200241003602b001200a410020012802002014200241b0016a41042015100122142014417f461b22144104201441044922141b200a2802006a36020020140d1020022802b0012117200241086a2001108e012002280208450d10200228020c2215417f4c0d142015450d06201510762214450d0a200a201541002001280200200928020020142015200a280200100122162016417f461b2216201620154b1b2216200a2802006a36020020162015470d070c0b0b200241b0016a41186a22164200370300200241b0016a41106a221b4200370300200241b0016a41086a221c4200370300200242003703b001200a410020012802002009280200200241b0016a41202015100122142014417f461b2214412020144120491b200a2802006a3602002014411f4d0d0f2002200c2900003703782002200d29000037007d200e280000211920022802b001211720022f01b401211420022d00b601211520022900b70121042007411f6a200241b0016a411f6a290000370000200741186a2016290000370000200741106a201b290000370000200741086a201c290000370000200720022900b00137000020044220882118201420154110747221152004a721144101211a0c0b0b200242003703b001200a410020012802002009280200200241b0016a41082015100122142014417f461b2214410820144108491b200a2802006a2215360200201441074d0d0e20022903b0012104200f4200370300200241b0016a41306a4200370300200241b0016a41286a4200370300200241b0016a41206a4200370300200241b0016a41186a4200370300200241b0016a41106a4200370300200241b0016a41086a4200370300200242003703b001200a410020012802002009280200200241b0016a41c0002015100122142014417f461b221441c000201441c000491b200a2802006a3602002014413f4d0d0e200241f8006a41086a200c41086a290000370300200241f8006a41106a200c41106a290000370300200241f8006a41186a200c41186a290000370300200241f8006a41206a200c41206a290000370300200241f8006a41256a200c41256a2900003700002002200c29000037037820022900b701221d422088211820022f01b40120022d00b601411074722115200e280000211920022802b0012117201da721144102211a0c0b0b200241b0016a2001103820022802b0012214450d0d20022902b4012104200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b0013703782004422088211820144108762115201441187421172004a721144100211a0c020b410121162001280200200928020041014100200a28020010011a41002014470d040b200241f8006a41306a200241b0016a41306a280200360200200241f8006a41286a200241b0016a41286a290200370300200241f8006a41206a200241b0016a41206a290200370300200241f8006a41186a200241b0016a41186a290200370300200241f8006a41106a200241b0016a41106a290200370300200241f8006a41086a200241b0016a41086a290200370300200220022902b00137037820164108762115201641187421172014ad21184104211a0b0c060b410121142001280200200928020041014100200a28020010011a41002015460d040b2015450d08201410200c080b2014450d07201610200c070b201441011023000b201541011023000b2014450d042015ad22044220862004842218422088a721194103211a0b0b200241c0006a41306a221e200241f8006a41306a280200360200200241c0006a41286a221f200241f8006a41286a290300370300200241c0006a41206a2220200241f8006a41206a290300370300200241c0006a41186a2221200241f8006a41186a221b290300370300200241c0006a41106a2222200241f8006a41106a221c290300370300200241c0006a41086a2223200241f8006a41086a222429030037030020022002290378370340200241b0016a41106a22162019360200200241b0016a41086a221920184220862014ad8437030020052002290340370200200541086a2023290300370200200541106a2022290300370200200541186a2021290300370200200541206a2020290300370200200541286a201f290300370200200541306a201e280200360200200220173600b1012002201a3a00b001200220153b00b501200220154110763a00b701200b2004370300200241186a200241b0016a10bf0120022d00182115200241b0016a411f6a22172008411f6a290000370000200241b0016a41186a221a200841186a2900003703002016200841106a2900003703002019200841086a290000370300200220082900003703b00120154103460d03201241016a2114200241f8006a411f6a221e2017290000370000201b201a290300370300201c201629030037030020242019290300370300200220022903b001370378024020122013470d002010201420142010491b2213ad42287e2204422088a70d052004a722164100480d0502402012450d00200620112016102122060d010c070b201610222206450d060b200620116a221220153a0000201241206a201e290000370000201241196a201b290300370000201241116a201c290300370000201241096a2024290300370000201241016a2002290378370000201041026a2110201141286a21112014211220142003490d000b0b2000201336020420002006360200200041086a201436020020024180026a24000f0b200241033a0018200241b0016a411f6a2008411f6a290000370000200241b0016a41186a200841186a290000370300200241b0016a41106a200841106a290000370300200241b0016a41086a200841086a290000370300200220082900003703b0010b2000410036020002402012450d00200621050340024020052d0000220a450d000240200a4101470d00200541086a280200450d01200541046a2802001020200541286a2105201141586a22110d020c030b200541106a280200450d002005410c6a28020010200b200541286a2105201141586a22110d000b0b02402013450d00200610200b20024180026a24000f0b1024000b201641081023000b1031000be81901307f230041b00d6b220124004100210220014100360204200141c8d7c400360200200141086a41086a22034200370300200142003703084194cec0004115200141086a1002200141900d6a41086a2003290300370300200120012903083703900d024002400240024002400240024002400240200141900d6a411041c8d7c400410041001001417f460d002001200141900d6a3602e80c200141103602ec0c200141003a00082001200141900d6a4110200141086a41014100100141016a220341014b3602f00c20034102490d0620012c00082103200141086a200141e80c6a103820012802082204450d06200128020c2102200141086a41086a2802002205450d01200141086a410041e00c1083041a200441206a2106200420054105746a2107200141900d6a41086a2108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128200421054100212941d100212a024003402029212b024002400240024002402003450d0020072004460d012003417f7321030340024020052007460d002005212c200541206a222d2105200341016a22030d010c050b2006212d200621052004212c200341016a22030d000c040b0b20052007460d01200541206a212d2005212c0c030b2003417f732103034020072005460d05200541206a2105200341016a22030d000b2005212d200541606a222c0d020c040b2006212d2004212c20072004460d030b202c450d020b202d21052001280204212e2001280200212f20084100360200200142013703900d410110222203450d072003202b3a000020014281808080103702940d200120033602900d2001202e36028c0d2001418c0d6a200141900d6a103e024002400240024020012802940d222d200828020022296b202e4f0d002029202e6a22032029490d0a202d4101742230200320032030491b22304100480d0a202d450d0120012802900d202d2030102122030d020c0d0b20012802900d21030c020b203010222203450d0b0b200120303602940d200120033602900d2030212d0b20082029202e6a2230360200200320296a202f202e1084041a0240024002400240202d20306b411f4b0d00203041206a222e2030490d0a202d4101742229202e202e2029491b222e4100480d0a202d450d012003202d202e102122030d020c0e0b202d212e0c020b202e10222203450d0c0b2001202e3602940d200120033602900d0b200320306a222d202c290000370000202d41186a202c41186a290000370000202d41106a202c41106a290000370000202d41086a202c41086a290000370000200141900d6a41186a222c4200370300200141900d6a41106a222d420037030020084200370300200142003703900d2003203041206a200141900d6a1000200141e80c6a41186a2230202c290300370300200141e80c6a41106a222c202d290300370300200141e80c6a41086a222d2008290300370300200120012903900d3703e80c0240202e450d00200310200b202a417f6a212a202b41016a2129200141086a202b4103704105746a220320012903e80c370000200341186a2030290300370000200341106a202c290300370000200341086a202d2903003700004100212c4100212e02400340202b202b41036e222d417d6c6a4102470d01200141086a202c6a220341df006a2d000022092003411f6a2d0000220a712009200a722003413f6a2d00007172211d200341de006a2d000022092003411e6a2d0000220a712009200a722003413e6a2d00007172211c200341dd006a2d000022092003411d6a2d0000220a712009200a722003413d6a2d00007172211b200341dc006a2d000022092003411c6a2d0000220a712009200a722003413c6a2d00007172211a200341db006a2d000022092003411b6a2d0000220a712009200a722003413b6a2d000071722119200341da006a2d000022092003411a6a2d0000220a712009200a722003413a6a2d000071722118200341d9006a2d00002209200341196a2d0000220a712009200a72200341396a2d000071722117200341d8006a2d00002209200341186a2d0000220a712009200a72200341386a2d000071722116200341d7006a2d00002209200341176a2d0000220a712009200a72200341376a2d000071722115200341d6006a2d00002209200341166a2d0000220a712009200a72200341366a2d000071722114200341d5006a2d00002209200341156a2d0000220a712009200a72200341356a2d000071722113200341d4006a2d00002209200341146a2d0000220a712009200a72200341346a2d000071722112200341d3006a2d00002209200341136a2d0000220a712009200a72200341336a2d000071722111200341d2006a2d00002209200341126a2d0000220a712009200a72200341326a2d000071722110200341d1006a2d00002209200341116a2d0000220a712009200a72200341316a2d00007172210f200341d0006a2d00002209200341106a2d0000220a712009200a72200341306a2d00007172210e200341cf006a2d000022092003410f6a2d0000220a712009200a722003412f6a2d00007172210d200341ce006a2d000022092003410e6a2d0000220a712009200a722003412e6a2d00007172210c200341cd006a2d000022092003410d6a2d0000220a712009200a722003412d6a2d00007172210b200341cc006a2d000022092003410c6a2d0000220a712009200a722003412c6a2d00007172210a200341cb006a2d000022092003410b6a2d0000221e712009201e722003412b6a2d000071722109200341ca006a2d0000221e2003410a6a2d0000221f71201e201f722003412a6a2d00007172211e200341c9006a2d0000221f200341096a2d0000222071201f202072200341296a2d00007172211f200341c8006a2d00002220200341086a2d00002221712020202172200341286a2d000071722120200341c7006a2d00002221200341076a2d00002222712021202272200341276a2d000071722121200341c6006a2d00002222200341066a2d00002223712022202372200341266a2d000071722122200341c5006a2d00002223200341056a2d00002224712023202472200341256a2d000071722123200341c4006a2d00002224200341046a2d00002225712024202572200341246a2d000071722124200341c3006a2d00002225200341036a2d00002226712025202672200341236a2d000071722125200341c2006a2d00002226200341026a2d00002227712026202772200341226a2d000071722126200341c1006a2d00002227200341016a2d00002228712027202872200341216a2d000071722127200341c0006a2d0000222820032d00002230712028203072200341206a2d000071722128202c41800c460d01200141086a202c202d410574202b41096e41e0006c6b6a6a220341ff006a201d3a0000200341fe006a201c3a0000200341fd006a201b3a0000200341fc006a201a3a0000200341fb006a20193a0000200341fa006a20183a0000200341f9006a20173a0000200341f8006a20163a0000200341f7006a20153a0000200341f6006a20143a0000200341f5006a20133a0000200341f4006a20123a0000200341f3006a20113a0000200341f2006a20103a0000200341f1006a200f3a0000200341f0006a200e3a0000200341ef006a200d3a0000200341ee006a200c3a0000200341ed006a200b3a0000200341ec006a200a3a0000200341eb006a20093a0000200341ea006a201e3a0000200341e9006a201f3a0000200341e8006a20203a0000200341e7006a20213a0000200341e6006a20223a0000200341e5006a20233a0000200341e4006a20243a0000200341e3006a20253a0000200341e2006a20263a0000200341e1006a20273a0000200341e0006a20283a0000202c41e0006a212c202d212b202e41016a222e4111490d000b0b41002103202a0d000b0b2000201d3a001f2000201c3a001e2000201b3a001d2000201a3a001c200020193a001b200020183a001a200020173a0019200020163a0018200020153a0017200020143a0016200020133a0015200020123a0014200020113a0013200020103a00122000200f3a00112000200e3a00102000200d3a000f2000200c3a000e2000200b3a000d2000200a3a000c200020093a000b2000201e3a000a2000201f3a0009200020203a0008200020213a0007200020223a0006200020233a0005200020243a0004200020253a0003200020263a0002200020273a0001200020283a000020020d020c030b410121040b20004200370000200041186a4200370000200041106a4200370000200041086a42003700002002450d010b200410200b200141b00d6a24000f0b1024000b410141011023000b419a88c00041331039000b203041011023000b202e41011023000bcf0301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02402000418080014f0d00200320004106763a000141022104200320004102744101723a00000c010b024020004180808080044f0d00200320004116763a000320032000410e763a0002200320004106763a0001200320004102744102723a0000410421040c010b200341033a0000200320003a0001200320004118763a0004200320004110763a0003200320004108763a0002410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d012000200320021084041a200341e0006a24000f0b20022001102e000b2003200341086a36024020032003410c6a360244200341c8006a41146a4100360200200341286a41146a4104360200200341346a4105360200200341106a41146a4103360200200341c8d7c4003602582003420137024c200341d0d2c4003602482003410536022c20034203370214200341fcd1c4003602102003200341c8006a3602382003200341c4006a3602302003200341c0006a3602282003200341286a360220200341106a418cd3c4001048000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10d3032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001109a02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b2004418001102d000b2004418001102d000ba30201047f024020002802082201450d0020002802002102200141f8006c21034100210003400240200220006a22012d0000417b6a220441064b0d00024002400240024020040e0700010404020403000b200141086a2d00004101470d03200141146a280200450d03200141106a28020010202003200041f8006a2200470d040c050b200141046a2d00004103470d0202402001410c6a280200450d00200141086a28020010200b200141186a280200450d02200141146a28020010202003200041f8006a2200470d030c040b200141086a280200450d01200141046a28020010202003200041f8006a2200470d020c030b200141086a2d00004105490d00200141306a280200450d002001412c6a28020010200b2003200041f8006a2200470d000b0b0b13002000410636020420004198cfc0003602000bce0101047f230041206b2200240002400240024041cec6c000411041c8d7c400410041001001417f460d00200041003602104101210141cec6c0004110200041106a41044100100141016a41044d0d022000280210210241cec6c000411010090c010b410021010b200041106a41086a2203420037030020004200370310418bc7c0004115200041106a1002200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041003200041206a24000f0b419a88c00041331039000b13002000410b360204200041a0cfc0003602000b5f01017f230041206b22022400200241003602082002420837030020024100360218200242013703102002410036021c2002411c6a200241106a103e200041086a2002280218360200200020022903103702002002108f02200241206a24000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010222206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011023000b7901027f230041106b2202240020024100360208200242013703000240410110222203450d00200341003a00002002428180808010370204200220033602002002410036020c2002410c6a2002103e200041086a200241086a28020036020020002002290300370200200241106a24000f0b410141011023000b931206037f017e057f017e037f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b001418bc7c0004115200141b0016a1002200141f0006a41086a22032002290300370300200120012903b001370370200141f0006a4110100920024200370300200142003703b00141a0c7c0004117200141b0016a100220032002290300370300200120012903b001370370200141f0006a41101009200141cdc8c000410d10e001200129030821042001280200210520024200370300200142003703b0014183cec0004111200141b0016a100220032002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041c8d7c400410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b410821064200210a200141b0016a41086a22024200370300200142003703b00141c0c8c000410d200141b0016a1002200141f0006a41086a2002290300370300200120012903b0013703700240200141f0006a411041c8d7c400410041001001417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a108a0220012802b0012206450d0420012902b401210a200141f0006a411010090b200141b0016a41086a22024200370300200142003703b00141dac8c0004115200141b0016a1002200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041c8d7c400410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a1013200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a41202004420020051b2204427f7c200141f0006a1014450d0620014190016a41186a2205200229030037030020014190016a41106a220c200329030037030020014190016a41086a220d20092903003703002001200129037037039001200220052903003703002003200c2903003703002009200d29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220ea72202200aa7470d00200241016a22032002490d05200ea74101742209200320032009491bad220f42287e220e422088a70d05200ea722034100480d052002450d012006200241286c200310212206450d020c070b200a210f0c070b2003102222060d050b200341081023000b419a88c00041331039000b419a88c00041331039000b1024000b419a88c00041331039000b200a422088220ea721020b2006200241286c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200241216a200128009001360000200241246a20014193016a280000360000200f42ffffffff0f83200e4220864280808080107c84210a0b2000200129031037001420002004370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000bad12010e7f23004190016b22032400024002400240024002400240024002400240024002400240411410222204450d00200441106a41002800bce342360000200441086a41002900b4e342370000200441002900ace34237000020044114413410212204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f0006a41186a22054200370300200341f0006a41106a22064200370300200341f0006a41086a220742003703002003420037037020044134200341f0006a1000200341d0006a41186a2005290300370300200341d0006a41106a2006290300370300200341d0006a41086a2007290300370300200320032903703703500240024002400240200341d0006a412041c8d7c400410041001001417f460d00200342203702742003200341d0006a360270200341206a200341f0006a108e012003280220450d0320032802242106200341186a200341f0006a108e012003280218450d03200328021c2107200341106a200341f0006a108e012003280210450d032003280214210841002109200341003a0030200341f8006a22052005280200220520032802702003280274200341306a41012005100141016a41014b22056a3602002005450d03024020032d00302205450d004101210920054101470d040b200341086a200341f0006a108e012003280208450d03200328020c2205417f4c0d0b2005450d0120051076220a450d06200341f8006a220b200b280200220b2005410020032802702003280274200a2005200b1001220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b41022109200410204102210441024102460d070c080b4101210a2003280270200328027441014100200341f8006a28020010011a41002005460d050b2005450d00200a10200b419a88c00041331039000b411441011023000b413441011023000b200541011023000b200341cc006a41026a220b200341306a41026a2d00003a0000200320032f00303b014c200341f0006a41026a200b2d00003a0000200320032f014c3b0170200410204102210420094102470d010b4101210b41d4e0c0002106411121070c010b200341d0006a20046a200341f0006a20046a2d00003a0000200320032f01703b01504100210b0b2003412c6a20046a200341d0006a20046a2d00003a0000200320032f01503b012c0240200b450d002000200636020420004101360200200041086a200736020020034190016a24000f0b200341286a41026a220c2003412c6a41026a2d00003a0000200320032f012c3b0128024002400240024002400240024002400240024002400240024002400240200228024020064d0d00411510222204450d05410021062004410d6a41002900a4e342370000200441086a410029009fe34237000020044100290097e34237000020044115413510212204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f0006a41186a22074200370300200341f0006a41106a22094200370300200341f0006a41086a220b42003703002003420037037020044135200341f0006a1000200341d0006a41186a2007290300370300200341d0006a41106a2009290300370300200341d0006a41086a200b29030037030020032003290370370350200341d0006a412041c8d7c400410041001001417f460d01200342203702742003200341d0006a3602702003200341f0006a108e012003280200450d042003280204220b417f4c0d0f200b450d02200b10762206450d07200341f8006a220720072802002207200b4100200328027020032802742006200b2007100122072007417f461b22072007200b4b1b22076a3602002007200b470d030c080b200521042005210e200a21020c120b2004102041000d070c080b410121062003280270200328027441014100200341f8006a28020010011a4100200b460d050b200b450d00200610200b419a88c00041331039000b411541011023000b413541011023000b200b41011023000b200410202006450d010b2006410020061b210d200341f0006a2006200b2002109802200341f0006a41086a28020021072003280274210620032802704101470d042000200636020420004101360200200041086a2007360200200b450d01200d102020050d020c030b200041e5e0c00036020420004101360200200041086a411a3602000b2005450d010b200a10200b20034190016a24000f0b200341d0006a41026a220f2003418f016a2d00003a0000200320032f008d013b01502003418c016a2d0000210920034188016a280200210420034184016a280200210e20034180016a2802002102200341fc006a280200210802402005450d00200a10200b200341286a41026a200f2d00003a0000200320032f01503b01282004417f4c0d004101210502402004450d00200410222205450d040b200520022004108404210a200341306a41146a2004360200200341306a41106a20043602002003200836023820032007360234200320063602302003200a36023c2003200941ff01714101463a0048411410222205450d01200541106a41002800bce342360000200541086a41002900b4e342370000200541002900ace34237000020054114413410212205450d02200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f0006a41186a22014200370300200341f0006a41106a220f4200370300200341f0006a41086a221042003703002003420037037020054134200341f0006a1000200341d0006a41186a2001290300370300200341d0006a41106a200f290300370300200341d0006a41086a201029030037030020032003290370370350200341d0006a200341306a105b2005102002402004450d00200a10200b200b450d04200d10200c040b1031000b411441011023000b413441011023000b200441011023000b20002006360204200020032f01283b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200e360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200c2d00003a000020034190016a24000be6db0123087f017e1a7f017e0d7f017e067f017e027f017e037f017e017f017e087f017e017f017e027f017e037f017e177f017e017f017e177f017e757f017e147f017e067f027e0f7f230041e0056b2204240041002105200441003602a0022004200236029c0220042001360298020240024002400240024002400240024002400240024002400240200241034b0d00200441013a008002200441e4046a4101360200200441013602bc01200442013702d404200441f8cac4003602d004200420044180026a3602b8012004200441b8016a3602e004200441c0036a200441d0046a102b20042802c803210620042802c403210720042802c0032108410521094100210a4101450d010c090b200441a0026a41043602000240024020012800004180c2cdeb06470d002002417c714104470d01200441013a008002200441e4046a4101360200200441013602bc01200442013702d404200441f8cac4003602d004200420044180026a3602b8012004200441b8016a3602e004200441c0036a200441d0046a102b20042802c803210620042802c403210720042802c003210841052109410021054100210a41010d0a0c040b4101210941010d09410021010c060b200241074d0d0320044198026a41086a4108360200024002400240024002400240200128000422084101470d00200441d0046a20044198026a104e20042802d0044101470d01410421074100210d4100210620042d00d4040d020c0a0b4102210941010d0d0c060b200441d0046a410572211441042107200441d0046a412c6a211b200441f4046a2117200441f0046a211e200441ec046a211a200441e8046a2122200441e4046a211d200441e0046a2123200441dc046a2124200441d8046a21264100210e4128210b4100210d410021064100210a034020044180026a41026a2209201441026a2d00003a0000200420142f00003b018002201b2802002119200441f8046a280200211120172802002118201e280200211c201a280200211f20222802002116201d280200218301202328020021840120242802002185012026280200218601024020042d00d4042215417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22130d00024020010e0b00070405020809060b030a000b200a41ff0171222541014d0d0c0c0b0b200a41ff0171222541004b0d0a0c0b0b200a41ff0171222541054d0d0a0c090b200a41ff01712225410a4d0d090c080b200a41ff0171222541034d0d080c070b200a41ff0171222541044d0d070c060b200a41ff0171222541084d0d060c050b200a41ff0171222541024d0d050c040b200a41ff0171222541064d0d040c030b200a41ff0171222541074d0d030c020b200a41ff01712225410b4d0d020c010b200a41ff0171222541094d0d010b411321092015410d4b0d010c020b02400240024002400240024002400240024002400240024020130d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421092015410d4d0d010b0240208501450d0020860110200b02402016450d00201f450d00201610200b0240024002402011450d0020181020200d0d020c010b410321010c0f0b410521010c0e0b410421010c0d0b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020150e0e0005060200000009040c08010307000b410221010c300b208401450d0b411821cd0120860120840141186c6a21ce01410421cf01411421d001411021d101410c21d201410921d301410821d40141ffffffff0321d501417021d60120860121d7014104210f0c1e0b208401450d0b20840141286c210b208601210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200b41586a220b0d000c0d0b0b208401450d0c411c21d801208601208401411c6c6a21d901410c21da01410821db01411421dc01410421dd01411021de01410921df0141ffffffff0321e001417021e10120860121e2014105210f0c1d0b208401450d0c20840141146c210b208601210103400240200141046a280200450d00200128020010200b200141146a2101200b416c6a220b0d000c0e0b0b0240208501450d0020860110200b2016450d112083011020200d0d160c150b208401450d0c208401410474210b208601210103400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000c0e0b0b20860141ff017122014102460d0320014101460d02208401450d102085011020200d0d120c110b208401450d0c411c21e301208601208401411c6c6a21e401410c21e501410821e601411421e701410421e801411021e901410921ea0141ffffffff0321eb01417021ec0120860121ed014106210f0c190b208401450d0c410421ee012086012084014104746a21ef01411021f001410921f101410821f20141ffffffff0321f301417021f40120860121f5014107210f0c190b2016450d122016410c6c210b2084012101034002402001280200220e450d00200141046a280200450d00200e10200b2001410c6a2101200b41746a220b0d000c140b0b2016450d13410421f60120840120164104746a21f701411021f801410c21f901410821fa01417421fb0120840121fc014108210f0c180b410321010c240b410221010c230b410221010c220b410221010c210b410221010c200b410221010c1f0b410221010c1e0b410221010c1d0b410221010c1c0b410221010c1b0b410221010c1a0b410321010c190b410321010c180b410521010c170b410421010c160b410521010c150b410421010c140b410821010c130b410821010c120b410821010c110b410921010c100b410921010c0f0b410921010c0e0b410921010c0d0b410921010c0c0b0240024002400240024002400240024002400240024020130d00024020010e0b00070405020809060b030a000b4101210a0c0b0b4100210a0c0a0b4105210a0c090b410a210a0c080b4103210a0c070b4104210a0c060b4108210a0c050b4102210a0c040b4106210a0c030b4107210a0c020b410b210a0c010b4109210a0b200441c0036a41026a221320092d00003a0000200420042f0180023b01c0030240200d2006470d00200d41016a2201200d490d0c200e20012001200e491b2206ad422c7e2227422088a70d0c2027a722014100480d0c0240200d450d002007200b41586a2001102122070d010c040b200110222207450d030b2007200b6a220141586a20153a0000200120193602002001417c6a2011360200200141786a2018360200200141746a201c360200200141706a201f3602002001416c6a2016360200200141686a208301360200200141646a208401360200200141606a2085013602002001415c6a2086013602002001415b6a20132d00003a0000200141596a20042f01c0033b0000200e41026a210e200b412c6a210b200d41016a210d200441d0046a20044198026a104e20042802d0044101470d000b20042d00d404450d080b20042902d4042227a7220941107621052009410876210a2027422088a72108200441d0046a41106a280200218701200441dc046a280200218801200d0d020c010b200141041023000b410521010c060b410421010c050b410021010c040b410021010c030b410021010c020b41082002102e000b200d412c6c2101200741606a210b0240024003402001450d01200141546a2101200b41206a210e200b412c6a2214210b200e2d0000410b470d000b201428020021150c010b410021150b200d412c6c2101200741586a210b0240024002400340410021092001450d01200141546a2101200b41286a210e200b412c6a2214210b200e2d00004104470d000b200441b0016a2014109803201520042802b401460d010c020b20154100470d010b4101210841e100210a41f3da01210541000d04410021010c010b0240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b4119210902402006450d00200710200b41010d03410021010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0a00010203040506070817170b0240024002400240200441a0026a2802002002470d002005ad42ffff0383421086200aad42ff0183420886842009ad42ff018384210c2007200d412c6c6a210e200721010340200e2001460d0220012d0000210b2001412c6a220f2101200b4102470d000b200441a8016a200f41586a1098034104211020042802a801210b024020042802ac012211450d00201141047422014100480dd601200110222210450d1a0b410021124100211302402011450d002011410474210f41002113201021010340200b41086a280200220e417f4c0d0e200b410c6a2d00002114200b280200211502400240200e450d00200e102222160d010c130b410121160b20162015200e10840421152001410d6a200b410d6a2d00003a00002001410c6a20143a0000200141086a200e360200200141046a200e36020020012015360200200141106a2101201341016a2113200b41106a210b200f41706a220f0d000b0b2010450d02201121120c030b200441003a008002200441e4046a4101360200200441013602bc01200442013702d404200441f8cac4003602d004200420044180026a3602b8012004200441b8016a3602e004200441c0036a200441d0046a102b20042802c403210e20042802c00321080240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b4105210902402006450d00200710200b41e2abc30021014116210b200e450dd8010cd7010b410021120b41042110410021130b2007200d412c6c6a210e20072101024002400240024003404100210f41c8d7c4002114200e2001460d0120012d0000210b2001412c6a22152101200b4103470d000b200441a0016a201541586a10980341002101024020042802a001220b450d0020042802a4012101200b21140b410421172001450d020c010b41002101410421174100450d010b200141286c21112014411c6a2101410421184100210f410021194101211a4100210e4100211b4104211c410021144100211d4104211e4100210b410021154100211f4100212041012121034002400240024002400240024002400240024002400240024002402001417c6a2d000022164101460d00024020164102460d0020164103470d022001417e6a22162d000021222001417d6a22232d00002124200f2019470d08200f41016a2219200f490de201200f4101742225201920192025491b221920196a22262019490de20120264100480de201200f450d07201a202520261021221a0d080c210b200441d0046a41086a2216200141086a280200360200200420012902003703d0042014201d470d03201441016a22222014490de1012014410174221d20222022201d491b221dad420c7e2227422088a70de1012027a722224100480de1012014450d02201e2014410c6c20221021221e0d030c1e0b200441d0046a41086a2216200141086a280200360200200420012902003703d004200e201b470d04200e41016a221b200e490de001200e4101742222201b201b2022491b221bad420c7e2227422088a70de0012027a722224100480de001200e450d03201c200e410c6c20221021221c0d040c1e0b2001280200211602402015200b470d00200b41016a2222200b490de001200b4101742223202220222023491b2223ad4202862227422088a70de0012027a722224100480de001200b450d072018200b4102742022102122180d080c200b201521220c080b20221022221e450d1b0b201e2014410c6c6a222220042903d004370200202241086a2016280200360200201441016a2114200141286a2101201141586a22110d090c0b0b20221022221c450d1a0b201c200e410c6c6a222220042903d004370200202241086a2016280200360200200e41016a210e200141286a2101201141586a22110d070c090b20261022221a450d190b201a200f4101746a222620224101713a0001202620243a000020162d0000211620232d000021222020201f470d04201f41016a2220201f490dd901201f4101742224202020202024491b222020206a22232020490dd90120234100480dd901201f450d03202120242023102122210d040c1a0b202210222218450d180b200b21222023210b0b201820224102746a2016360200201541016a2115200141286a2101201141586a22110d020c040b202310222221450d160b200f41016a210f2021201f4101746a222320164101713a0001202320223a0000201f41016a211f200141286a2101201141586a22110d000c020b0b4101211a41042118410021194100210e4100211b4104211c410021144100211d4104211e4100210b410021154100211f41002120410121210b2007200d412c6c6a21112007210102400240034020112001460d0120012d000021162001412c6a2222210120162017470d000b20044198016a202241586a109803200428029c012216450d0020042802980121012016410274211603402001280200211102400240024002402015200b470d00200b41016a2217200b490dd801200b4101742222201720172022491b2222ad4202862227422088a70dd8012027a722174100480dd801200b450d012018200b4102742017102122180d020c130b200b2122201521170c020b201710222218450d110b200b21172022210b0b200141046a2101201820174102746a2011360200201541016a21152016417c6a22160d000c020b0b200b21220b2007200d412c6c6a2116200721010240024002400240034020162001460d0120012d0000210b2001412c6a22112101200b4105470d000b20044190016a201141586a109803200428029401410c6c2223450d002004280290012101200e4101742111200e410c6c210b200441e4046a2126200441e0046a21250340200141086a21170240200141046a2802004101470d002004201728020022163602a8032001280200222420164d0d0020044198026a410c6a41023602002026410236020020044198026a41086a20044180026a3602002004410236029c022004202436028002202520044198026a360200200442023702d404200441ccaac4003602d0042004200441a8036a36029802200441c0036a200441d0046a102b20042802c00322160d030b20012902002127200441d0046a41086a22162017280200360200200420273703d0040240200e201b470d00200e41016a221b200e490dd7012011201b201b2011491b221bad420c7e2227422088a70dd7012027a722174100480dd7010240200e450d00201c200b20171021221c0d010c140b20171022221c450d130b2001410c6a2101201c200b6a221720042903d004370200201741086a2016280200360200201141026a2111200b410c6a210b200e41016a210e202341746a22230d000b0b2007200d412c6c6a211620072101024002400240034020162001460d0120012d0000210b2001412c6a22112101200b4106470d000b20044188016a201141586a109803200428028c01220b450d002004280288012101200b410c6c2117201441017421112014410c6c210b0340200441d0046a2001109a0320042802d00422160d0220012902002127200441d0046a41086a2216200141086a280200360200200420273703d00402402014201d470d00201441016a221d2014490dd9012011201d201d2011491b221dad420c7e2227422088a70dd9012027a722234100480dd90102402014450d00201e200b20231021221e0d010c1c0b20231022221e450d1b0b2001410c6a2101201e200b6a222320042903d004370200202341086a2016280200360200201141026a2111200b410c6a210b201441016a2114201741746a22170d000b0b2007200d412c6c6a2116200721010240034020162001460d0120012d0000210b2001412c6a22112101200b4107470d000b20044180016a201141586a109803200428028401220b450d002004280280012201200b4104746a2123200f410174210b200441d0046a41086a2124200441e4046a21260340200441d0046a20012021201f109b0302400240024020042d00d0044101470d002024290300212720042802d4042216450d010c060b200420042d00d10422163a00a80320162001410c6a2d00002211460d0120044198026a410c6a41233602002026410236020020044198026a41086a200441a8036a3602002004412336029c02200420113a008002200441d0046a41106a20044198026a360200200442023702d404200441e0abc4003602d004200420044180026a36029802200441c0036a200441d0046a102b20042902c403212720042802c00322160d050b2001410c6a2d000021160b2001410d6a2d000021110240200f2019470d00200f41016a2219200f490dd901200b20192019200b491b221920196a22172019490dd90120174100480dd9010240200f450d00201a200b20171021221a0d010c1d0b20171022221a450d1c0b201a200b6a221720163a0000201741016a20114101713a0000200b41026a210b200f41016a210f200141106a22012023470d000b0b200441f8036a2015360200200441f4036a2022360200200441c0036a412c6a2013360200200441e8036a2012360200200441e0036a200f360200200441dc036a2019360200200441d4036a200e360200200441d0036a201b360200200420183602f003200420103602e4032004201a3602d8032004201c3602cc03200420143602c8032004201d3602c4032004201e3602c0032007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b4104470d000b200441f8006a200f41586a109803200428027c21140c010b410021140b200420143602cc012007200d412c6c6a210e200721010240024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b410b470d000b2004200f41606a28020022013602d00120142001460d020c010b200441003602d00120144100460d010b200441a4026a4102360200200441e4046a41023602002004410236029c02200442023702d404200441ace1c0003602d0042004200441d0016a3602a0022004200441cc016a36029802200420044198026a3602e00420044180026a200441d0046a102b2004290284022127200428028002211620042802c4030dcc010ccd010b2014450d1c2007200d412c6c6a210e200721010340200e2001460d0f20012d0000210b2001412c6a220f2101200b4104470d000b2007200d412c6c6a211420072101034020142001460d1020012d0000210b2001412c6a220e2101200b410b470d000b200441f0006a200f41586a10980320042802742201450d1c410221282004280270222920014102746a212a200e41606a212b200e41586a212c20044189056a212d4100212e4114212f200441d0046a41146a2130410121314102213241102133200441d0046a41106a21344201213541a4e2c00021364104213741182138412c2139200441c0036a412c6a213a200441e4036a213b42ff01213c4120213d4108213e4228213f20044188056a214020044184056a21414180800121424281808080102143200441f8046a214442808080808080102145410c2146200441d0046a410c6a21474170214820044180056a2149200441ec046a214a4124214b4103214c4125214d4203214e41f088c000214f4220215041782151412621524202215341ace2c000215441d8aec4002155410021564100210f0c86010b20042902d40421270b2020450d020c010b20042902c40321272020450d010b202110200b0240201d450d00201e10200b0240201b450d00201c10200b02402019450d00201a10200b02402013450d002013410474210b2010210103400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000b0b02402012450d00201010200b2022450dc801201810200cc8010b200441e4046a4101360200200420793602ac032004207a3602a803200441033602bc01200442013702d404200441ece2c0003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044180026a200441d0046a102b20042902840221272004280280022116208101450dbe010cc4010b208501450d792086011020410321010cce010b200d450d79410421010ccd010b200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b410521010ccc010b02402006450d00200710200b2087012106208801210741010dce010c700b200441e4046a4101360200200441023602ac03200442023702d404200441c8aec4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0cb8010b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d404200441d8aec4003602d004200420044180026a3602a80320044198026a200441d0046a102b0cb7010b208301450d722084011020200d0d760c750b1031000b41bce1c000411e1039000b41dae1c00041c8001039000b200e41011023000b201741041023000b201741041023000b202241041023000b202241041023000b202641011023000b202241041023000b202341011023000b202341041023000b201741011023000b200141041023000b0240200f0e0a00020708090a0b0c0d18180b200420563602d401202b2802002101202c280200210b203020313602002004203236028402203420044180026a360200200420353702d404200420363602d0042004200441d4016a3602800220044198026a200441d0046a102b200429029c0221272004280298022116200120564d0da80102402027a7450d00201610200b20042029280200220136028002024002400240024002400240203a28020020014d0d00200b205620386c6a220b2802142218450d01203b28020020012037746a220e2d000d2115200e2802002119200b28020c2101200b2802002116200e2802082211210f0240200b280208221f450d00201f204c7421142011210b2016210e0340200b200e2802006a220f200b490d04200e203e6a210e200f210b201420516a22140d000b0b203e1022220b450d2e200b2015ad203c83203f8637020020044180026a20286a220e20044198026a20286a2d00003a0000200420042f0098023b018002204020153a000020412042360200200441d0046a20396a221420433702002044200b360200200441d0046a203d6a2045370300200441d0046a20386a221520353703002030200f3602002034201f36020020472016360200200441d0046a203e6a2011360200202d20042f0180023b0000202d20286a200e2d00003a0000200420193602d4042018203774210e2004200441c0036a3602d0044100210b03402004200b3602e801200420013602ec01200441b8016a200441d0046a2001109e03024020042802b801450d00200441a8036a203e6a200441b8016a203e6a280200360200200420042903b8013703a80320044198026a202f6a204b36020020044198026a20466a203236020020044180026a202f6a204c36020020044198026a20336a200441a8036a36020020044198026a203e6a200441e8016a3602002004204d36029c0220044180026a20336a20044198026a3602002004204e370284022004204f360280022004200441ec016a36029802200441f0016a20044180026a102b024020042802ac03450d0020042802a80310200b20042802f001220f0d050b200120336a2101200b20316a210b200e20486a220e0d000b20492802000d2f0240204a280200450d00201528020010200b2014280200450d0520442802001020205620316a2156202920376a2229202a470d450c060b20302031360200200420323602ac032034200441a8036a360200200420533702d404200420553602d004200420044180026a3602a80320044198026a200441d0046a102b200429029c022227205088a721012027a7210b200428029802220f0d030c040b203d1022220f450d2f200f20386a202e2900e58840370000200f20336a202e2900dd8840370000200f203e6a202e2900d58840370000200f202e2900cd88403700004120210b41202101200f0d020c030b203d1022220f450d2d200f20386a202e2900a8b144370000200f20336a202e2900a0b144370000200f203e6a202e290098b144370000200f202e290090b1443700004120210b41202101200f0d010c020b20042902f40121270240204a280200450d00201528020010200b2027205088215702402014280200450d00204428020010200b2057a721012027a7210b0b2004200f3602800220042001ad205086200bad8437028402200420044180026a3602a80320044198026a20466a20523602002030202836020020044198026a203e6a200441a8036a3602002004203236029c02203420044198026a360200200420533702d404200420543602d0042004200441d4016a36029802200441d8016a200441d0046a102b0240200428028402450d0020042802800210200b20042802d80122160d050b205620316a2156202920376a2229202a470d3e0b2007200d412c6c6a210e2007210102400340200e2001460d0120012d0000210b2001412c6a220f2101200b4109470d000b2004200f41586a28020022013602b801200441f8036a28020020014d0d022004200441f0036a28020020014102746a280200220136028002200441ec036a28020020014d0d03200441e4036a28020020014104746a22013502084200520d05200131000d4220864280808080f000834280808080c000520d050b2007200d412c6c6a210e200721010340200e2001460da20120012d0000210b2001412c6a220f2101200b4108470d000b200441e8006a200f41586a2201109803200441d0046a200428026c10ec02411021584114215920044198026a41106a225a200441d0046a41146a225b2802003602004108215c20044198026a41086a225d200441d0046a410c6a290200370300200420042902d40437039802200441e0006a200110980320042802642201450da0012004280260225e200141146c6a215f410421604105216141b9f3ddf1792162417c2163410321644101216541022166417e216741ff0121684119216941fffdfb77216a417f216b418081828478216c4100216d20044198026a410c6a216e4220216f410221704202217141f8adc4002172200441e0036a2173200441d8036a2174200441f8036a2175200441f0036a2176200441ec036a21774101210f0c6c0b205e2278450d9f014100210b2078280208227921012078280200227a210e024020792060490d004100210b207a21012079210e03402001280000200b2061777320626c210b200120606a2101200e20636a220e20644b0d000b207920636a22012001206371220e6b2101207a200e6a20606a210e0b024002400240200120654d0d00200e20666a2114200b206177200e2f00007320626c210b200120676a450d020c010b200e21142001450d010b200b20617720142d00007320626c210b0b207820596a215e200b20617720687320626c227b206976227c205c74207c722201205874200172217d205d280200217e4100217f200428029802218001200428029c02218101207b218201410021010c8d010b200441e4046a4101360200200441023602ac03200442023702d404200441c8aec4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0ca4010b200441e4046a4101360200200441023602ac03200442023702d404200441d8aec4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0ca3010b20042902dc01212720042802c4030daa010cab010b412d10222216450d32201641256a41002900e1e240370000201641206a41002900dce240370000201641186a41002900d4e240370000201641106a41002900cce240370000201641086a41002900c4e240370000201641002900bce24037000042ad808080d005212720042802c4030da9010caa010b208b01450d9c012004208b01280200220136028002208d0128020020014d0d07200441d0046a208b01208e016a209001280200208f01280200109b0320042d00d004209101460d0820042d00d1040d09200441c0006a208b01109f03024020042802442201450d002004280240210b200120920174210e209301280200211403402004200b28020022013602b801201420014d0d6320042094012802002001209201746a28020022013602800220950128020020014d0d64200b208e016a210b200e2096016a220e0d000b0b208b01208a016a228b01208c01470d390c9c010b209b01209c01460d0541a4afc300210b412d2101209b01280208209d01470d120240209b01280200220e209e01460d00200e209e01209d011086040d130b02400240209b012d00182201209f01460d00209b01209a016a210e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200120a001460d002001209d01460d2641e7adc300210b41362101209701209b0128021c220f4d0d39209801200f20a401746a2214450d39209b012802142115209b0128020c210f20a5012d00000d01201520a601470d0141d8aec300210b41382101200f20a701460d39200f20a70120a601108604450d390c020b41d1afc300210b412f2101209b0128021420a201470d380240209b0128020c220f20a301460d00200f20a30120a2011086040d390b20cc010d32209b0120a1016a21cc01200e219b014103210f0ca4010b41b2aec300210b41262101201520ac016a221520ad014b0d3720150e14013737370c0e370d000b0a06050f070837370910010b200f20a801460d0120a801200f20a601108604450d01200f20ab01460d0220ab01200f20a601108604450d020240200f20a701460d0020a701200f20a6011086040d2f0b20a00110222215450d5320152099013b000020142d000c20a901470d2d201428020820a001470d2d201428020021164100210103402001209f014b0d04201520016a210b201620016a210f2001209f016a2101200f2d0000200b2d0000460d000c2e0b0b200f20ae01460d35200f20ae01209d01108604450d3520ae01200f209d011086040d35209f0110222216450d5120162099013a000020142d000c20a901470d362014280208209f01470d36201428020021114100210b0340200b0d172016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c370b0b41b2aec300210b4126210120142d000c20a901470d3420142802080d34200e219b01201420aa016a2d000020a401460d710c340b41b2aec300210b4126210120142d000c20a901470d3320142802080d33200e219b01201420aa016a2d000020a401460d6f0c330b201420aa016a2d0000210120151020200e219b01200120a401460d6d0c2a0b200f20bc01460d0b20bc01200f20bd01108604450d0b200f20be01460d1620be01200f20bd01108604450d160240200f20bf01460d0020bf01200f20bd011086040d320b41b2aec300210b4126210120142d000c20a901470d3120142802080d31200e219b01201420aa016a2d000020a401460d680c310b200f20b901460d0b20b901200f20ba01108604450d0b0240200f20bb01460d0020bb01200f20ba011086040d310b209d0110222216450d4820162099013a000220162099013b000020142d000c20a901470d3a2014280208209d01470d3a201428020021114100210b0340200b20a0014b0d182016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c3b0b0b200f20c301460d0b20c301200f20c401108604450d0b0240200f20c501460d0020c501200f20c4011086040d300b20a00110222216450d4220162099013b000020142d000c20a901470d38201428020820a001470d38201428020021114100210b0340200b209f014b0d182016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c390b0b0240200f20c601460d0020c601200f20c7011086040d2f0b41b2aec300210b4126210120142d000c20a901470d2e20142802080d2e200e219b01201420aa016a2d000020a401460d550c2e0b0240200f20c801460d0020c801200f20c9011086040d2e0b41b2aec300210b4126210120142d000c20a901470d2d20142802080d2d200e219b01201420aa016a2d000020a401460d5d0c2d0b0240200f20b801460d0020b801200f20aa011086040d2d0b41b2aec300210b4126210120142d000c20a901470d2c20142802080d2c200e219b01201420aa016a2d000020a401460d5e0c2c0b0240200f20b601460d0020b601200f20b7011086040d2c0b41b2aec300210b4126210120142d000c20a901470d2b20142802080d2b200e219b01201420aa016a2d000020a401460d5c0c2b0b0240200f20af01460d0020af01200f20b0011086040d2b0b41b2aec300210b4126210120142d000c20a901470d2a20142802080d2a200e219b01201420aa016a2d000020a401460d590c2a0b200f20b201460d0620b201200f20b301108604450d06200f20b401460d0f20b401200f20b301108604450d0f0240200f20b501460d0020b501200f20b3011086040d2a0b41b2aec300210b4126210120142d000c20a901470d2920142802080d29200e219b01201420aa016a2d000020a401460d5c0c290b0240200f20b101460d00200f290000208901520d290b20b00110222211450d4320112099013600032011209f013a000220112099013b000020142d000c20a901470d26201428020820b001470d262014280200211f4100210f0340200f20a2014b0d082011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c270b0b200f20c001460d0520c001200f20c101108604450d050240200f20c201460d0020c201200f20c1011086040d280b209d0110222216450d3c20162099013a000220162099013b000020142d000c20a901470d322014280208209d01470d32201428020021114100210b0340200b20a0014b0d112016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c330b0b0240200f20ca01460d0020ca01200f20cb011086040d270b20a00110222211450d3820112099013b000020142d000c20a901470d25201428020820a001470d252014280200211f4100210f0340200f209f014b0d072011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c260b0b20a40110222216450d3c201620990136000020142d000c20a901470d2c201428020820a401470d2c201428020021114100210b0340200b209d014b0d082016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c2d0b0b41b2aec300210b4126210120142d000c20a901470d2420142802080d24201420aa016a2d0000220f20a401460d24200e219b01200f20a4017220a401460d500c1c0b20a00110222216450d3720162099013b000020142d000c20a901470d2b201428020820a001470d2b201428020021114100210b0340200b209f014b0d072016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c2c0b0b20b00110222211450d3c20112099013600032011209f013a000220112099013b000020142d000c20a901470d28201428020820b001470d282014280200211f4100210f0340200f20a2014b0d072011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c290b0b41b2aec300210b4126210120142d000c20a901470d2120142802080d21201420aa016a2d0000220f20a401460d21200e219b01200f20a4017220a401460d4b0c190b201420aa016a2d0000220f20a401460d1e20111020200e219b01200f20a4017220a401460d560c200b201420aa016a2d0000210120111020200e219b01200120a401460d470c170b201420aa016a2d0000210120161020200e219b01200120a401460d580c160b201420aa016a2d0000210120161020200e219b01200120a401460d560c150b201420aa016a2d0000210120161020200e219b01200120a401460d4a0c140b201420aa016a2d0000220f20a401460d2120111020200e219b01200f20a4017220a401460d500c1b0b209f0110222211450d3020112099013a000020142d000c20a901470d262014280208209f01470d262014280200211f4100210f0340200f0d052011200f6a2115201f200f6a2116200f209f016a210f20162d000020152d0000460d000c270b0b20a00110222216450d3220162099013b000020142d000c20a901470d26201428020820a001470d26201428020021114100210b0340200b209f014b0d052016200b6a210f2011200b6a2115200b209f016a210b20152d0000200f2d0000460d000c270b0b201420aa016a2d0000210120161020200e219b01200120a401460d430c100b201420aa016a2d0000210120161020200e219b01200120a401460d440c0f0b201420aa016a2d0000210120161020200e219b01200120a401460d3f0c0e0b201420aa016a2d0000220f20a401460d2120111020200e219b01200f20a4017220a401460d4d0c150b201420aa016a2d0000210120161020200e219b01200120a401460d480c0c0b4114210120004190afc3003602040cad010b411521012000419daec3003602040cac010b024020d70120cf016a280200450d0020d70128020010200b024020d70120d0016a280200220b450d0020d70128020c2101200b20cf0174210b0340024020012d000020d301470d00200120d4016a28020020d50171450d00200120cf016a28020010200b200120d1016a2101200b20d6016a220b0d000b0b20d70120cd016a2101024020d70120d1016a280200450d0020d70120d2016a28020010200b200121d701200120ce01470d4f0c560b024020e20120da016a280200220b450d0020e2012802042101200b20dd0174210b0340024020012d000020df01470d00200120db016a28020020e00171450d00200120dd016a28020010200b200120de016a2101200b20e1016a220b0d000b0b024020e20120db016a280200450d0020e20120dd016a28020010200b20e20120d8016a2101024020e20120dc016a280200450d0020e20128021010200b200121e201200120d901470d4f0c560b024020ed0120e5016a280200220b450d0020ed012802042101200b20e80174210b0340024020012d000020ea01470d00200120e6016a28020020eb0171450d00200120e8016a28020010200b200120e9016a2101200b20ec016a220b0d000b0b024020ed0120e6016a280200450d0020ed0120e8016a28020010200b20ed0120e3016a2101024020ed0120e7016a280200450d0020ed0128021010200b200121ed01200120e401470d4f0c560b024020f501280208220b450d0020f5012802002101200b20ee0174210b0340024020012d000020f101470d00200120f2016a28020020f30171450d00200120ee016a28020010200b200120f0016a2101200b20f4016a220b0d000b0b20f50120f0016a2101024020f50120ee016a280200450d0020f50128020010200b200121f501200120ef01470d4f0c560b20fc01221420f8016a21fc01024020142802042201450d000240201420f9016a280200220b450d00200b20f9016c210b034002402001280200220e450d00200120f6016a280200450d00200e10200b200120f9016a2101200b20fb016a220b0d000b0b201420fa016a280200450d00201420f6016a28020010200b20fc0120f701470d4f410821010cac010b024020cc01450d0020cc01280204450d0620cc0128020022fd0120cc0141086a28020022fe014d0d082000419fb0c30036020441c90021010ca7010b410021fd01410021fe010c080b200441e4046a4101360200200441023602ac03200442023702d404200441a8aec4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0c98010b200441d8046a290300212720042802d404211620042802c4030d9f010ca0010b412010222216450d2c201641186a41002900a4e340370000201641106a410029009ce340370000201641086a4100290094e3403700002016410029008ce34037000042a08080808004212720042802c4030d9e010c9f010b201510200b41262101200041b2aec3003602040ca1010b200041a9b1c300360204413221010ca0010b411f210120004180b0c3003602040c9f010b20fe0120032802484d0d00200041e8b0c30036020441c10021010c9e010b200441d0046a41086a220b420037030020044180e5c2003602d404200420032903083e02e004200420032903103e02d004200441d0046a4104722201410d10a0032001410c10a0032001410710a0032001410f10a003200441c8016a20042802e004360200200441b8016a41086a200b290300370300200420042903d0043703b8012007450d22200441d0046a410c6a200dad4220862006ad84370200200420073602d80420042008ad422086200c843703d00420044198026a200441d0046a10a103410110222201450d23200141003a0000200420042f01d0043b01c003200441e0046a41e0083b0100200441d8046a428180808010370300200420013602d404200441013602d004200420042f01c0033b01e20420044198026a200441d0046a10a203211541031022220b450d24200b41026a41002d008cb7443a0000200b41002f008ab7443b000041031022220e450d25200e41026a41002d008fb7443a0000200e41002f008db7443b0000200441c0036a41026a2216200441d0046a41026a22112d00003a0000200420042f00d0043b01c003200441ac026a2214280200210f20044198026a41106a2802002101201120162d00003a0000200420042f01c0033b01d004200f2001470d07200141016a220f2001490da30120014101742216200f200f2016491b2216ad42287e22ff01422088a70da30120ff01a7220f4100480da3012001450d05200441a4026a280200200141286c200f10212201450d080c060b2080022d00002088026a22012089024b0d78024002400240024020010e0400030102000b20800228020c2201450d7b2001208a026c210b208002280204208b026a2101034002402001208c026a2802000d002001280200220e208102490d002001200e208d026a3602000b2001208a026a2101200b208e026a220b0d000c7c0b0b20800228020c2201450d7a20800228020422a2022001208f026c6a21a302410121010c790b20800228020c2201450d7920800228020422a40220012091026c6a21a5020c770b2080022802042201208102490d782080022085026a2001208d026a3602002080022083026a228002208402470d450c790b20111020200041b2aec3003602040c9b010b201110200b2000200b3602040c99010b20161020200041b2aec3003602040c98010b200f10222201450d020b200441a8026a2016360200200441a4026a2001360200200441ac026a280200210f0b200441a4026a280200200f41286c6a220141003a00182001200e36020c20014283808080303702042001200b360200200141106a4283808080303702002001411b6a200441d2046a2d00003a0000200141196a20042f01d0043b00002001411c6a20153602002014201428020041016a360200200441d0046a20044198026a418c011084041a200441a8036a200441d0046a10a303200441a8036a41106a2802002216412c6c210120042802b00322800241586a210b024003404100210e2001450d01200141546a2101200b41286a210f200b412c6a2214210b200f2d00004103470d000b201441086a2802002201450d00200141286c210b201428020041186a21014100210e0340200e20012d0000456a210e200141286a2101200b41586a220b0d000b0b2016412c6c210120800241586a210b200e417f6a218102024003404100210e2001450d01200141546a2101200b41286a210f200b412c6a2214210b200f2d00004103470d000b201441086a2802002201450d00200141286c210b201428020041186a21014100210e0340200e20012d0000456a210e200141286a2101200b41586a220b0d000b0b2016412c6c210120800241606a210b024002400340410021142001450d01200141546a2101200b41206a210f200b412c6a2215210b200f2d00004104470d000b2015280200210120160d010c750b410021012016450d740b2001200e6a218202412c2183022080022016412c6c6a2184024104218502200441b8016a4104722186024100218702417821880241032189024114218a024110218b02417c218c024101218d02416c218e02411c218f0241022190024118219102410c2192024108219302428080808010219402412d219502422021ff01417f219602410b2197024170219802417e21990241ec00219a024203219b024202219c0241ff01219d024105219e024106219f02410021a002410021a1024109210f0c6d0b200f41041023000b20111020200041b2aec3003602040c93010b20161020200041b2aec3003602040c92010b20161020200041b2aec3003602040c91010b20161020200041b2aec3003602040c90010b20161020200041b2aec3003602040c8f010b20161020200041b2aec3003602040c8e010b20111020200041b2aec3003602040c8d010b20161020200041b2aec3003602040c8c010b410841041023000b418889c000102f000b412041011023000b412041011023000b410241011023000b410241011023000b410241011023000b410341011023000b410141011023000b410441011023000b410341011023000b410241011023000b410741011023000b410741011023000b410141011023000b410241011023000b412d41011023000b41abadc30041361039000b410141011023000b410341011023000b410341011023000b412041011023000b4100210f0c2c0b4100210f0c2c0b4102210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4103210f0c2d0b4104210f0c2e0b4105210f0c2e0b4106210f0c2e0b4107210f0c2e0b4108210f0c2e0b4109210f0c2f0b410021010c5a0b410221010c590b410221010c580b410221010c570b410221010c560b410321010c550b410321010c540b410521010c530b410521010c520b410421010c510b410621010c500b410721010c4f0b410921010c4e0b410921010c4d0b410921010c4c0b410921010c4b0b410921010c4a0b410921010c490b410921010c480b410921010c470b410921010c460b410921010c450b410921010c440b410921010c430b410921010c420b410921010c410b410921010c400b410921010c3f0b410921010c3e0b410921010c3d0b410921010c3c0b410921010c3b0b410921010c3a0b410921010c390b410921010c380b410921010c370b410921010c360b410921010c350b410921010c340b410921010c330b410921010c320b410921010c310b410921010c300b410921010c2f0b410921010c2e0b410921010c2d0b410921010c2c0b410921010c2b0b410221010b034002400240024002400240024002400240024002400240024002400240024020010e03000102020b02402080012082012081017122016a280000220e207d73220b206b73200b206a6a71206c71220b450d00034002402079207e200b6820647620016a208101712064746a221420606a280200470d00207a20142802002214460d08207a20142079108604450d070b200b206b6a200b71220b0d000b0b207f20606a227f20016a218201200e200e20657471206c71450d030240205a2802000d0020044198026a10ed02200428029802218001200428029c022181010b208101207b71210b410421010340200b220e20016a20810171210b200120606a2101208001200e6a280000206c71220f450d000b0240208001200f68206476200e6a2081017122016a2c0000220b206d480d00208001208001280200206c716820647622016a2d0000210b0b20800120016a207c3a0000208001200120636a208101716a20606a207c3a0000205a205a280200200b2065716b360200206e206e28020020656a360200205d28020020012064746a2079ad206f86207aad8437020002400240024002400240024002400240207828020c22012065460d00024020012066460d0020012064470d022004207828021022013602f001207328020020014d0d06207428020020012065746a2d0001450d030c070b2004207828021022013602b801200441c0036a205c6a28020020014b0d02205b2065360200200420703602ac03200441d0046a20586a200441a8036a360200200420713702d404200420723602d0042004200441b8016a3602a80320044180026a200441d0046a102b2004280280022216450d020c110b2004207828021022013602b801200441c0036a20596a28020020014b0d010c030b2004207828021022013602f001207528020020014d0d012004207628020020012066746a28020022013602b801207728020020014d0d050b205e205f470d0b0c250b200441e4046a4101360200200441023602ac03200442023702d404200441c8aec4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d310c2b0b200441e4046a4101360200200441023602ac03200442023702d404200441a8aec4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d300c2a0b200441e4046a4101360200200441023602ac03200442023702d404200441f8aec4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d2f0c290b200441e4046a4101360200200441023602ac03200442023702d40420044198afc4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a102b200429028402212720042802800221162081010d2e0c280b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d404200441d8aec4003602d0042004200441b8016a3602a80320044180026a200441d0046a102b200429028402212720042802800221162081010d2d0c270b20a2022201208f026a21a20202402001280218220b450d0020012802102101200b20900274210b034002402001280200220e208102490d002001200e208d026a3602000b20012085026a2101200b208c026a220b0d000b0b20a20220a302470d010c0e0b20a1022122024020a40228021420850274220b450d0020a40228020c21010340024020012d0000209702470d0020012085026a220e2802002214208102490d00200e2014208d026a3602000b2001208b026a2101200b2098026a220b0d000b0b20930210222201450d06200120940237020020850210222219450d0520a4022092026a210e201920870236020020a402208a026a221a280200221e450d084100210b41012116410121154101211f4101211402400240024002404100201e22114f0d0002400340200b208d026a211102400240024002400240024002400240200e280200200b208502746a2d0000220b2099026a2089024f0d00200b10a40321a602200441b8016a2093026a28020021a70220860221a8020c010b0240024002400240024002400240200b209e02460d00200b209f02470d012014450d0f20142096026a21140c0a0b2014450d0e20162015470d012016208d026a220b2016490d4a2016208d02742218200b200b2018491b2218ad209b0286222720ff0188a70d4a2027a7220b208702480d4a2016450d022001201620890274200b102122010d030c040b200b10a40321a902200441b8016a2093026a28020021aa0220860221ab020c060b201621180c010b200b10222201450d010b20012015208902746a220b208d02360204200b2011360200024002400240201f20142096026a2216470d00201f208d0274220b20142014200b491b221cad209c0286222720ff0188a70d492027a7220b208702480d49201f450d012019201f20900274200b102122190d020c040b201f211c0c010b200b10222219450d020b2015208d026a210b20192016209002746a20153602002011201e4f0d180c080b200b41041023000b200b41041023000b4100210b0c010b4101210b0b02400240034002400240200b0e020001010b20a802280200221c2093026a2117201c2f010621184100210b02400240024003402018200b460d01208702209602208d022017200b6a2d0000221320a602209d0271221b4b1b2013201b461b2213450d02200b208d026a210b2013208d02460d000b200b2096026a21180b024020a702450d0020a7022096026a21a702201c2018209002746a209a026a21a8024100210b0c040b200441b8016a211820142096026a220b2014490d010c0b0b200441b8016a21180240201c200b208902746a208a026a220b450d00200b280200221c208d02460d0b201c209002470d00200b2085026a21180b20142096026a220b20144f0d0a0b200b20144b0d0920152019200b209002746a280200220b4d0d092001200b208902746a221c280204220b20182802006a2218200b490d09201c2085026a2018360200024020162015470d002016208d026a220b2016490d462016208d02742218200b200b2018491b2218ad209b0286222720ff0188a70d462027a7220b208702480d462016450d062001201620890274200b102122010d070c0c0b201621180c060b20ab02280200221c2093026a2117201c2f010621184100210b024003402018200b460d01208702209602208d022017200b6a2d0000221320a902209d0271221b4b1b2013201b461b2213450d03200b208d026a210b2013208d02460d000b200b2096026a21180b024020aa02450d0020aa022096026a21aa02201c2018209002746a209a026a21ab024101210b0c010b0b200441b8016a211820142096026a220b2014490d010c070b200441b8016a21180240201c200b208902746a208a026a220b450d00200b280200221c208d02460d07201c209002470d00200b2085026a21180b20142096026a220b20144f0d060b200b20144b0d0520152019200b209002746a280200220b4d0d052001200b208902746a221c280204220b20182802006a2218200b490d05201c2085026a20183602000b201621182015210b201f211c2011201e490d020c120b200b10222201450d050b20012015208902746a220b208d02360204200b2011360200024002400240201f2014470d00201f208d026a220b201f490d41201f208d02742216200b200b2016491b221cad209c0286222720ff0188a70d412027a7220b208702480d41201f450d012019201f20900274200b102122190d020c080b201f211c0c010b200b10222219450d060b2015208d026a210b20192014209002746a20153602002014208d026a21142011201e4f0d100b20182116200b2115201c211f2011220b201a2802002211490d000c020b0b02402016450d00200110200b410121a0020240201f450d0020191020202221a1022080022083026a228002208402470d040c130b202221a1020c110b4190b7c400200b201110b501000b200b41041023000b200b41041023000b4109210f410921010c360b410121010c0b0b410021010c0a0b410121010c330b410121010c320b4101210f410921010c310b410441041023000b410841041023000b20042902840221272081010d230c1d0b20012093026a21154101211c410121180c010b200b450d012001200b208902746a21150b200121164101210b03402001290200212720042095023a00d0042004202720ff01883e02d404200e200b2027a76a22142096026a200441d0046a10a50320042097023a00d00420042081023602d404200e2014200441d0046a10a503200b2090026a210b201520012093026a2201470d000b201621010b02402018450d00200110200b0240201c450d00201910200b20a4022091026a21a40202400240200441b8016a208b026a280200450d00201a280200220b450d00200e2802002101200b20850274210b4100210e0340024020012d0000208302470d0020012097023a000020012085026a208202360200200e208d026a210e0b2001208b026a2101200b2098026a220b0d000b410121a102200e0d010b202221a1020b20a40220a502460d01410221010c000b0b2080022083026a228002208402470d0d0b024020a002410171450d00200441b4036a280200210720042802b003210e0240200441b8036a2802002201450d002001412c6c210b200e210103402001104d2001412c6a2101200b41546a220b0d000b0b02402007450d00200e10200b20042802bc01200441c0016a280200200441c4016a2802001055200041dbb1c300360204411a21010c030b024020a102410171450d00200441d0046a41106a200441a8036a41106a280200360200200441d0046a41086a200441a8036a41086a290300370300200420042903a8033703d004200441c0036a200441d0046a10a10341101022220b450d08200b41063a0000410110222201450d09200141003a0000410110222207450d0a200720012d00003a00002001102041101022220e450d0b200e41063a000041f00010222201450d0c200141063a00602001412c3b015020012081023602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441c8016a2802003602240240200e2d00004109470d00200e28020841ffffffff0371450d00200e28020410200b200e10200240200b2d00004109470d00200b28020841ffffffff0371450d00200b28020410200b200b1020200441f4046a4287808080f000370200200441f0046a2001360200200441ec046a4100360200200441d0046a410c6a4281808080800c370200200441d8046a4101360200200441003602fc04200442043702e404200420073602d404200441013602d004200441c0036a200441d0046a10a603200441d0046a200441c0036a418c011084041a20044180026a200441d0046a10a30320044190026a280200211420044180026a410c6a2802002101200428028802218002200428028402210b200428028002210e0c020b200441b8036a280200211420042802b0032180020b200441b4036a280200210120042802ac03210b20042802a803210e0b20042802bc01200441c0016a280200200441b8016a410c6a2802001055208002450d02200441c0036a410c6a2014ad4220862001ad8437020020042080023602c8032004200bad422086200ead843703c003200441d0046a200441c0036a200328024410a70320042802d0044101470d010240200441d8046a280200450d0020042802d40410200b200041f5b1c300360204412321010b20004101360200200041086a2001360200200441e0056a24000f0b200441dc046a2802002221450d01200441e4046a280200210b200441e0046a280200218401200441d8046a280200210d20042802d4042107200328024021860120044100360288022004420137038002410410222201450d02200441043602840220044188026a220e200e280200220f41046a36020020042001360280022001200f6a20073600000240024002402004280284022207200e28020022016b41044f0d00200141046a220e2001490d2720074101742201200e200e2001491b22014100480d272007450d01200428028002200720011021220e450d020c0c0b200428028002210e0c0c0b20011022220e0d0a0b200141011023000b41abadc30041361039000b41abadc30041361039000b410441011023000b411041081023000b410141011023000b410141011023000b411041081023000b41f00041081023000b4109210f410921010c1a0b20042001360284022004200e3602800220044188026a28020021010b20044180026a41086a200141046a360200200e20016a200d3600002021200b412c6c22016a210702400240024002400240200b450d00200141546a2116200441d0046a410172210b200441d0046a41276a210d200441d0046a41206a210f200441d0046a41186a2102200441d0046a41106a2114200441d0046a41086a211520212101034020012d0000210e200d200141286a280000360000200f200141216a2900003703002002200141196a2900003703002014200141116a2900003703002015200141096a2900003703002004200141016a2900003703d004200e410f460d02200441c0036a41276a2206200d280000360000200441c0036a41206a2211200f290300370300200441c0036a41186a22202002290300370300200441c0036a41106a2285012014290300370300200441c0036a41086a2283012015290300370300200420042903d0043703c003200b20042903c003370000200b41086a208301290300370000200b41106a208501290300370000200b41186a2020290300370000200b41206a2011290300370000200b41276a20062800003600002004200e3a00d00420044198026a200441d0046a20044180026a104920042d009802220e411a470d05201641546a21162001412c6a22012007470d000b200722012007470d020c030b202122012007470d010c020b2001412c6a22012007460d010b200441d0046a410172210b200441d0046a41276a210d200441d0046a41206a210f200441d0046a41186a2102200441d0046a41106a2114200441d0046a41086a2115034020012d0000210e200d200141286a280000360000200f200141216a2900003703002002200141196a2900003703002014200141116a2900003703002015200141096a2900003703002004200141016a2900003703d004200e410f460d01200441c0036a41276a2216200d280000360000200441c0036a41206a2206200f290300370300200441c0036a41186a22112002290300370300200441c0036a41106a22202014290300370300200441c0036a41086a2285012015290300370300200420042903d0043703c003200b20042903c003370000200b41086a208501290300370000200b41106a2020290300370000200b41186a2011290300370000200b41206a2006290300370000200b41276a20162800003600002004200e3a00d004200441d0046a104d2001412c6a22012007470d000b0b0240208401450d00202110200b20044180026a41086a280200210120042903800221ff012000411c6a41003a0000200041186a2001360200200041106a20ff013702002000410c6a20fe01360200200041086a20fd013602002000208601360204200041003602002000411d6a20042f00d0043b00002000411f6a200441d2046a2d00003a0000200441e0056a24000f0b20044198026a41086a280200218601200428029c02211f02402016450d002001412c6a2101200441d0046a410172210b200441d0046a41276a210f200441d0046a41206a2102200441d0046a41186a2114200441d0046a41106a2115200441d0046a41086a2116034020012d0000210d200f200141286a2800003600002002200141216a2900003703002014200141196a2900003703002015200141116a2900003703002016200141096a2900003703002004200141016a2900003703d004200d410f460d01200441c0036a41276a2206200f280000360000200441c0036a41206a22112002290300370300200441c0036a41186a22202014290300370300200441c0036a41106a2285012015290300370300200441c0036a41086a2283012016290300370300200420042903d0043703c003200b20042903c003370000200b41086a208301290300370000200b41106a208501290300370000200b41186a2020290300370000200b41206a2011290300370000200b41276a20062800003600002004200d3a00d004200441d0046a104d2001412c6a22012007470d000b0b0240208401450d00202110200b0240200428028402450d0020042802800210200b0240200e4105470d00208601450d00201f10200b20004198b2c30036020420004101360200200041086a4125360200200441e0056a24000f0b200428029c022201450d000240200141016aad4203862227422088a70d00200141086a417c71220b200141056a490d00200b2027a76a2201200b490d002001417c4b0d002004200b3602d804200441043602d404200420013602d0040b20042802980210200b2007200d412c6c6a210e2007210102400340200e2001460d0120012d0000210b2001412c6a220f2101200b4103470d000b200441d8006a200f41586a109803200428025c2201450d002004280258210f200141286c211441002101200441a4026a2111200441e4046a211f200441a0026a2118200441e0046a2119200441ec036a21150340024002400240200f20016a220b41186a2d0000220e4101460d000240200e4102460d00200e4103470d02200b411a6a2d0000450d030c090b200441d0046a200b411c6a109a0320042802d0042216450d020c060b200b41206a2802004101470d01200b411c6a280200210e2004200b41246a280200220b3602b801200e200b4d0d0120114102360200201f41023602002018200441a8036a3602002004410236029c022004200e3602a803201920044198026a360200200442023702d404200441ccaac4003602d0042004200441b8016a3602980220044180026a200441d0046a102b2004280280022216450d010c0c0b2004200b411c6a280200220b360280022015280200200b4d0d050b2014200141286a2201470d000b0b0240200441c0036a41146a28020022014102490d00200441d0046a41146a41013602002004410236028402200420013602a803200442013702d404200441fce2c0003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a102b0c050b0240200441c8036a280200220141014d0d00200441e4046a41013602002004410236028402200420013602a803200442013702d40420044184e3c0003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a102b0c050b2007200d412c6c6a210e2007210102400340200e2001460d0120012d0000210b2001412c6a220f2101200b410c470d000b200441d0006a200f41586a109803200428025022012004280254411c6c6a210e200441c8036a210f200441e0036a2114200441c0036a41186a2115200441e4046a2111200441e0046a211f03402001200e460d0120042001280200220b360280020240200f280200200b4b0d0020114101360200200441023602ac03201f200441a8036a360200200442023702d404200441f8adc4003602d004200420044180026a3602a80320044198026a200441d0046a102b20042802980222160d0a0b200441d0046a200141046a220120152802002014280200109b0320042d00d0044101460d08200141186a210120042d00d104450d000b412010222216450d0a201641186a41002900a4e340370000201641106a410029009ce340370000201641086a4100290094e3403700002016410029008ce34037000042a08080808004212720042802c4030d0d0c0e0b2007200d412c6c6a210e200721010340200e2001460d0120012d0000210b2001412c6a220f2101200b410a470d000b200441c8006a200f41586a109803200428024c2201450d00411c218a012004280248228b012001411c6c6a218c01200441d4036a218d014104218e01200441e0036a218f01200441d8036a21900141012191014102219201200441f8036a219301200441f0036a219401200441ec036a219501417c2196014102210f0c0a0b024020042802c403450d0020042802c00310200b0240200441d0036a280200450d00200441cc036a28020010200b0240200441dc036a280200450d00200441d8036a28020010200b0240200441ec036a280200220b450d00200441e4036a2802002101200b410474210b03400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000b0b0240200441e8036a280200450d00200441e4036a28020010200b0240200441f4036a280200450d00200441f0036a28020010200b2020450d0e2021102020070d0f0c120b20042902d404212720042802c4030d0a0c0b0b200441e4046a4101360200200441023602ac03200442023702d404200441d8aec4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0c010b200b410c6a2802002101200b41146a280200210b200441d0046a41146a41013602002004200b360284022004200136028002200441033602ac03200442013702d404200441f4e2c0003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a102b0b200429029c02212720042802980221160b20042802c403450d070c060b200441d8046a290300212720042802d404211620042802c4030d050c060b200429029c02212720042802c4030d040c050b200429028402212720042802c4030d030c040b412041011023000b410921010c0b0b024020810141016aad420386228901422088a70d0020810141086a417c71220120810141056a490d002001208901a76a220b2001490d00200b417c4b0d00200420013602d804200441043602d4042004200b3602d0040b208001102020042802c403450d010b20042802c00310200b0240200441d0036a280200450d00200441cc036a28020010200b0240200441dc036a280200450d00200441d8036a28020010200b0240200441ec036a280200220b450d00200441e4036a2802002101200b410474210b03400240200141046a280200450d00200128020010200b200141106a2101200b41706a220b0d000b0b0240200441e8036a280200450d00200441e4036a28020010200b0240200441f4036a280200450d00200441f0036a28020010200b2020450d00202110202016450d010c0a0b20160d090b2007450d030b2007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b4102470d000b200441386a200f41586a10980320042802382101200428023c210b0c010b410021010b200b410020011b2118200141c8d7c40020011b21192007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a220f2101200b4108470d000b200441306a200f41586a109803200428023021012004280234210b0c010b410021010b200b410020011b2116200141c8d7c40020011b210f2007200d412c6c6a210e20072101024002400340200e2001460d0120012d0000210b2001412c6a22142101200b4104470d000b200441286a201441586a10980320042802282101200428022c210b0c010b410021010b200b410020011b2111200141c8d7c40020011b211f2007200d412c6c6a21142007210102400240024003404100210b20142001460d0120012d0000210e2001412c6a22152101200e4103470d000b200441206a201541586a10980320042802244100200428022022011b220e0d010c020b410021014100410041001b220e450d010b200e41286c210e200141c8d7c40020011b41186a21014100210b0340200b20012d0000456a210b200141286a2101200e41586a220e0d000b0b200f201641146c6a2116410021134100211c024002400240024002400340200f2016460d01200f28020021144138210141f8abc300210e02400240200f41086a28020022154106460d0020154104470d0741012113201441bdb2c300460d01201428000041e3c2b1e306460d010c070b4101211c201441fbb2c300460d00201441fbb2c30041061086040d060b200f410c6a2802000d02200f41106a2802002201200b6b221420014b0d034181b3c300210e41262101201120144d0d05201f20144102746a2214450d0541a7b3c300210e412021012018201428020022144d0d05201920144104746a2214450d05411f210141edacc300210e20142802080d05200f41146a210f20142d000d4104460d000c050b0b2013201c71410171450d022007200d412c6c6a210e200721010340200e2001460d0620012d0000210b2001412c6a220f2101200b4106470d000b200441186a200f41586a109803200428021c450d052000418cadc300360204411f21010c040b4113210141b0acc300210e0c020b412a210141c3acc300210e0c010b411c411e201c410171220b1b210141c1b2c30041ddb2c300200b1b210e0b2000200e3602040b20004101360200200041086a20013602002007450d0a0240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b2006450d0a20071020200441e0056a24000f0b2007200d412c6c6a210e200721010340200e2001460d0220012d0000210b2001412c6a220f2101200b4102470d000b200441106a200f41586a109803200428021021012004280214210b0c020b41abadc30041361039000b410021010b200b410020011b219701200141c8d7c40020011b2198012007200d412c6c6a210e200721010240024003404100219901200e2001460d0120012d0000210b2001412c6a220f2101200b4103470d000b200441086a200f41586a10980320042802082101200428020c210b0c010b410021010b4128219a01200141c8d7c40020011b229b01200b410020011b41286c6a219c014103219d01418ab7c400219e014101219f01410221a001411c21a101410621a20141e1adc30021a301410421a401200341cc006a21a501410b21a60141fda4c40021a701419da3c40021a80141e00021a901410d21aa0141c1a3c40021ab01417d21ac01411321ad01418db7c40021ae0141f0a3c40021af01410721b00141f7a2c40021b10142e5f0d1fbb5ac98b6ec0021890141ffa2c40021b201410a21b3014189a3c40021b4014193a3c40021b50141b5a3c40021b601410c21b70141a8a3c40021b8014188a4c40021b901410e21ba014196a4c40021bb0141d9a2c40021bc01410f21bd0141e8a2c40021be0141e1a3c40021bf0141a4a4c40021c001411021c10141b4a4c40021c20141f7a3c40021c301411121c40141c4a4c40021c50141eba4c40021c601411221c70141cca3c40021c801411521c90141d5a4c40021ca01411621cb01410021cc014103210f410921010c000b0b1024000b02402027a7450d00201610200b0240200d450d00200d412c6c210b2007210103402001104d2001412c6a2101200b41546a220b0d000b0b41cfabc30021014113210b2006450d02200710200c020b41e2abc30021014116210b2007450d010b200941ff01714105470d00200810200b2000200136020420004101360200200041086a200b3602000b200441e0056a24000bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001109a02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b2004418001102d000b2004418001102d000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e2208410174418ad8c4006a2f00003b00002005417e6a2008419c7f6c20076a410174418ad8c4006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff0371410174418ad8c4006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a2005410174418ad8c4006a2f00003b00000b2002200141c8d7c4004100200341096a20046a412720046b109b022104200341306a240020040be60601067f0240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b200020072002200310f2030d012000280218200420052000411c6a28020028020c1100000f0b0240024002400240024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b2101410120002d0030220920094103461b2209410371450d0220094102460d034100210b200121090c040b200020072002200310f2030d0b2000280218200420052000411c6a28020028020c1100000f0b41012101200041013a003020004130360204200020072002200310f2030d0a200920086b21014101200041306a2d0000220920094103461b2209410371450d0320094102460d0441002108200121090c050b410021092001210b0c010b20014101762109200141016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110400450d000c050b0b200041046a280200210a41012101200020072002200310f2030d07200041186a2209280200200420052000411c6a220328020028020c1100000d0720092802002100417f2109200328020041106a21030340200941016a2209200b4f0d06410121012000200a2003280200110400450d000c080b0b41002109200121080c010b20014101762109200141016a41017621080b417f2101200041046a210a200041186a21032000411c6a21020340200141016a220120094f0d022003280200200a2802002002280200280210110400450d000b0b410121010c030b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1100000d0220092802002100417f2109200328020041106a21030340200941016a220920084f0d02410121012000200a2003280200110400450d000c030b0b41000f0b41000f0b20010b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a41273602002004412c6a4102360200200441033602342004420237021c200441b8d4c4003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41c8d4c4001048000b110020002802002000280204200110b4020b1c00200128021841db81c500410e2001411c6a28020028020c1100000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b20012802002002200410212203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d0620012802002002200410212203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d0720012802002002200410212203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a20012802002002200410212203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004102222030d0b0b200441011023000b2004102222030d070b200441011023000b2004102222030d090b200441011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d0120012802002002200010212202450d020c030b200128020021020c030b2000102222020d010b200041011023000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d0120012802002002200010212202450d020c030b200128020021020c030b2000102222020d010b200041011023000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d0120012802002002200010212202450d020c030b200128020021020c030b2000102222020d010b200041011023000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d0120012802002002200010212202450d020c040b200128020021020c040b2000102222020d020b200041011023000b1024000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bd20503027f037e017f230041206b220424004101210502402001a74101470d00200041086a2205427f2005290300220620037c2000290300220720027c22082007542205ad7c22072005200720065420072006511b22051b3703002000427f200820051b370300410021050b0240024002400240024002400240024020014201510d004200210620014200510d03200441106a41086a2200420037030020044200370310418feec0004116200441106a1002200441086a22052000290300370300200420042903103703002004411041c8d7c400410041001001417f460d01200442003703182004420037031020044110200441106a4110410010012209417f460d062009410f4d0d06200441186a2903002101200429031021060c020b2005450d02200441106a41086a2200420037030020044200370310418feec0004116200441106a1002200441086a22052000290300370300200420042903103703002004411041c8d7c400410041001001417f460d03200442003703182004420037031020044110200441106a4110410010012209417f460d062009410f4d0d06200441186a2903002101200429031021060c040b420021010b2000420037030020044200370310418feec0004116200441106a100220052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030b200441206a24000f0b42002106420021010b2000420037030020044200370310418feec0004116200441106a100220052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a41101003200441206a24000f0b419a88c00041331039000b419a88c00041331039000b1300200041023602042000419cf1c0003602000bbe0904027f017e037f077e230041f0006b2202240002400240024002400240411010222203450d00200341086a41002900f6f940370000200341002900eef94037000020034110413010212203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220742003703002002420037035020034130200241d0006a1000200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a200729030037030020022002290350370330024002400240024002400240200241306a412041c8d7c400410041001001417f460d002002420037035820024200370350200241306a4120200241d0006a4110410010012205417f460d052005410f4d0d05200241d8006a2903002108200229035021092002420037035820024200370350200241306a4120200241d0006a4110411010012205417f460d052005410f4d0d05200241d0006a41086a290300210a2002290350210b20031020411410222203450d09200341106a41002800a5ef40360000200341086a410029009def4037000020034100290095ef4037000020034114413410212203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220142003703002002420037035020034134200241d0006a1000200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a2205200129030037030020022002290350370330200241306a412041c8d7c400410041001001417f460d012002420037035820024200370350200241306a4120200241d0006a4110410010012206417f460d082006410f4d0d08200241d8006a290300210c2002290350210d0c020b200310204200210c0c020b4200210d4200210c0b20031020200142003703002002420037035041cdc8c000410d200241d0006a100220052001290300370300200220022903503703300240200241306a411041c8d7c400410041001001417f460d0020024200370350200241306a4110200241d0006a41084100100141016a41084d0d02200229035021040b4200210e200242004200200b4200108804200241106a200a420020044200108804200241206a20044200200b42001088044200210402404200420052200a42005271200229030842005272200229031842005272200241286a290300220b200229030020022903107c7c220a200b54720d002008200a2002290320220e200954200a200854200a2008511b22011b200a7d2009200e20011b220a200e54ad7d2104200a200e7d210e0b2004200c200d200e56200c200456200c2004511b22011b210c200e200d20011b21040b200020043703002000200c370308200241f0006a24000f0b419a88c00041331039000b419a88c00041331039000b411041011023000b413041011023000b419a88c00041331039000b411441011023000b413441011023000b980204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1000200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041c8d7c400410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012201417f460d022001410f4d0d02200341286a290300210820032903202109200341201009420121040c010b0b2000200437030020002009370308200041106a2008370300200341c0006a24000f0b419a88c00041331039000bf61a010f7f230041a0036b220124000240024002400240024002400240024002400240024002400240024002400240411210222202450d00200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf4337000020024112413210212202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141d0026a41186a22004200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00220024132200141d0026a1000200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a00202400240200141a0026a412041c8d7c400410041001001417f460d002001422037026c2001200141a0026a360268200141d0026a200141e8006a10d90220012d00dc0222054102460d0420014188016a41086a200141e5026a29000037030020014188016a41106a200141ed026a29000037030020014188016a41186a200141f5026a290000370300200141d8016a41086a20014186036a290100370300200141d8016a41106a2001418e036a290100370300200141d8016a41186a20014196036a290100370300200120012900dd02370388012001200141fe026a2901003703d801200141fd026a2d0000210020012802d402210620012802d0022107200141a0026a412010090c010b410221050b200141286a41186a20014188016a41186a290300370300200141286a41106a220320014188016a41106a290300370300200141286a41086a220420014188016a41086a290300370300200141086a41086a2208200141d8016a41086a290300370300200141086a41106a2209200141d8016a41106a290300370300200141086a41186a200141d8016a41186a2903003703002001200129038801370328200120012903d8013703082002102020054102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2003290300370300200141e8006a41086a2004290300370300200141c8006a41086a2008290300370300200141c8006a41106a2009290300370300200141c8006a41186a200141086a41186a29030037030020012001290328370368200120012903083703484100210a0240200041ff01714101470d00411210222202450d06200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf433700002002411241321021220a450d07200a2001290348370012200a412a6a200141e0006a290300370000200a41226a200141c8006a41106a290300370000200a411a6a200141c8006a41086a2903003700000b0240024002400240024020054101470d00411210222202450d0c200241106a41002f00bbcf433b0000200241086a41002900b3cf43370000200241002900abcf433700002002411241321021220b450d0d200b2001290368370012200b412a6a200141e8006a41186a290300370000200b41226a200141e8006a41106a290300370000200b411a6a200141e8006a41086a290300370000200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d002200b4132200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a002200141a0026a412041c8d7c400410041001001417f460d0e200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10d90220012d00dc0222024102460d0f20014188016a41086a2203200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001084041a200120023a00940120014188016a410d6a200141d8016a41c3001084041a200141b5016a20003a0000200141b6016a2001290348370100200141be016a200141c8006a41086a290300370100200141c6016a200141c8006a41106a290300370100200141ce016a200141c8006a41186a290300370100200141d0026a41186a22024200370300200141d0026a41106a22004200370300200c4200370300200142003703d002200b4132200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d002200128028801210d2001200328020022023602d801200141d8016a200141d0026a103e02402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d4022108200d210203400240200820046a411f4b0d00200041206a22032000490d052008410174220f20032003200f491b22034100480d05024002402008450d00200e200820031021220e0d010c090b20031022220e450d080b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a10b70220012802d4022102200141a0026a412020012802d0022200200c280200100302402002450d00200010200b0240200128028c01450d00200d10200b200b10204101210d200a0d010c110b200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00241c29bc400411a200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a0020240200041ff01714101470d00412010222202450d1020022001290348370000200241186a200141c8006a41186a290300370000200241106a200141c8006a41106a290300370000200241086a200141c8006a41086a290300370000200141a0026a4120200241201003200210204100210b4100210d200a0d010c110b200141a0026a412010094100210b4100210d200a450d100b200141d0026a41186a22024200370300200141d0026a41106a22004200370300200141d0026a41086a22034200370300200142003703d002200a4132200141d0026a1000200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a2003290300370300200120012903d0023703a002200141a0026a412041c8d7c400410041001001417f460d06200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10d90220012d00dc024102460d0720014188016a41086a2202200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001084041a20014188016a410d6a200141d8016a41c30010840420012903683700002001419d016a200141e8006a41086a290300370000200141a5016a200141e8006a41106a290300370000200141ad016a200141e8006a41186a290300370000200120053a009401200141d0026a41186a22004200370300200141d0026a41106a22034200370300200c4200370300200142003703d002200a4132200141d0026a1000200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d00220012802880121052001200228020022023602d801200141d8016a200141d0026a103e02402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d40221082005210203400240200820046a411f4b0d00200041206a22032000490d032008410174220f20032003200f491b22034100480d03024002402008450d00200e200820031021220e0d010c060b20031022220e450d050b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a10b70220012802d4022102200141a0026a412020012802d0022200200c280200100302402002450d00200010200b0240200128028c01450d00200510200b200a102041012102200d200b45720d110c100b1024000b200341011023000b200341011023000b411241011023000b413241011023000b419a88c00041331039000b4189eec30041d3001039000b419a88c00041331039000b411241011023000b413241011023000b411241011023000b413241011023000b4189eec30041d3001039000b419a88c00041331039000b412041011023000b41002102200d200b45720d010b200b10200b02400240200a45200272450d002006450d020c010b200a10202006450d010b200710200b200141a0036a24000b130020004108360204200041fef9c0003602000b13002000410a36020420004188fac0003602000b3901017f0240411010222202450d002002420037000820024200370000200042908080808002370204200020023602000f0b411041011023000bc60807057f017e087f047e017f017e017f230041e0006b220224000240024002400240024002400240024002400240410e10222203450d00200341066a41002900f6ef40370000200341002900f0ef403700002003410e412e10212204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1000200241086a41186a2001290300370300200241086a41106a2003290300370300200241086a41086a2005290300370300200220022903383703080240024002400240200241086a412041c8d7c400410041001001417f460d002002422037022c2002200241086a3602282002200241286a108e012002280200450d0b20022802042206ad42287e2207422088a70d032007a72201417f4c0d032001450d01200110222208450d062006450d020c070b20004100360208200042083702000c080b4108210820060d050b4100210e420021072008450d080c050b1031000b410e41011023000b412e41011023000b200141081023000b200241286a41086a22032802002109200228022c21052002280228210a2002413b6a210b420021074100210c4100210d410021012006210e03402002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382110200242003703402002420037033820034100200a2005200241386a411020091001220f200f417f461b220f4110200f4110491b20096a2209360200200f410f4d0d03200241386a41086a2903002111200229033821122002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382113200241003a003820032009200a2005200241386a41012009100141016a41014b220f6a2209360200200f450d03200141016a210f20022d003821142002200b28000036005b200220022800383602582002200228005b36003b2002200228025836023802402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002008200d2016102122080d010c080b201610222208450d070b2008200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a200228003b360000200141216a200228023836000020074280808080107c2107200c41026a210c200d41286a210d200f2101200f2006490d000b2008450d030b20002007200ead84370204200020083602000b20041020200241e0006a24000f0b200e450d00200810200b419a88c00041331039000b1024000b201641081023000b8b0404027f017e037f027e230041d0006b2204240020042001103b02400240024002400240024002402004290300200441086a290300844200510d00411410222205450d05200541106a41002800a5ef40360000200541086a410029009def4037000020054100290095ef4037000020054114413410212205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1000200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310200441106a412041c8d7c400410041001001417f460d012004420037033820044200370330200441106a4120200441306a4110410010012207417f460d042007410f4d0d04200441386a290300210a200429033021060c020b200041d5e8c000360204200041086a4122360200410121010c020b4200210a0b200510202001200620027c220b200a20037c200b200654ad7c10af01200041106a2003370300200041086a2002370300410021010b20002001360200200441d0006a24000f0b419a88c00041331039000b411441011023000b413441011023000b8b0604027f017e037f027e230041d0006b220524000240024002400240411410222206450d00200641106a41002800a5ef40360000200641086a410029009def4037000020064100290095ef4037000020064114413410212206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541306a41186a22084200370300200541306a41106a22094200370300200541306a41086a220a42003703002005420037033020064134200541306a1000200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a29030037030020052005290330370310024002400240200541106a412041c8d7c400410041001001417f460d002005420037033820054200370330200541106a4120200541306a4110410010012208417f460d022008410f4d0d02200541386a290300210b200529033021070c010b4200210b0b20061020024002400240200720027d220c200756200b20037d2007200254ad7d2207200b562007200b511b450d00200041f7e8c000360204200041086a411d3602000c010b200541306a41086a220642003703002005420037033041a5eec000411b200541306a1002200541106a41086a2006290300370300200520052903303703100240200541106a411041c8d7c400410041001001417f460d002005420037033820054200370330200541106a4110200541306a4110410010012206417f460d062006410f4d0d06200c20052903305a2007200541306a41086a290300220b5a2007200b511b0d0020004194e9c000360204200041086a411a3602000c010b200541086a20012004200c200710ae0120052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200c200710af01200041106a2003370300200041086a2002370300410021060c040b419a88c00041331039000b411441011023000b413441011023000b419a88c00041331039000b20002006360200200541d0006a24000b830803037f047e077f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e00102400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e001370318411510222204450d012004410d6a41002900ceef40370000200441086a41002900c9ef40370000200441002900c1ef4037000020044115413510212204450d0220042002290318370015200420093a00342004412c6a2002412f6a220a290000370000200441256a200241186a41106a220b2903003700002004411d6a200241186a41086a290300370000200241e0016a41186a220c4200370300200241e0016a41106a220d4200370300200241e0016a41086a220e4200370300200242003703e00120044135200241e0016a1000200241e0006a41186a220f200c290300370300200241e0006a41106a220c200d290300370300200241e0006a41086a200e290300370300200220022903e001370360200241e0016a200241e0006a105920022d0081024102460d03200241e0006a200241e0016a41e3001084041a200241386a41206a220d200241e0006a41206a2d00003a0000200241386a41186a220e200f290300370300200241386a41106a220f200c290300370300200241386a41086a220c200241e0006a41086a29030037030020022002290360370338200241e0016a200241e0006a41216a41c2001084041a200141046a220141206a200241e0016a41c1006a2d00003a0000200141186a200241e0016a41396a290000370000200141106a200241e0016a41316a290000370000200141086a200241e0016a41296a290000370000200120022900810237000020002002290318370001200041096a200241186a41086a290300370000200041116a200b290300370000200041186a200a290000370000200041206a20093a0000200041013a0000200041216a2002290338370000200041296a200c290300370000200041316a200f290300370000200041396a200e290300370000200041c1006a200d2d00003a000020041020200324000f0b200041003a0000200324000f0b411541011023000b413541011023000b41f1d1c20041d7001039000ba10802097f027e230041d0006b2202240002400240410e10222203450d00200341066a41002900f6ef40370000200341002900f0ef403700002003410e412e10212204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1000200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a103e02400240024002400240024002402000450d00200041286c210720052802002108200228022c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802282000200a102122030d020c080b200841086a2109200228022821030c020b200a10222203450d060b2002200a36022c20022003360228200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a102122030d020c090b200941106a21080c020b200a10222203450d070b2002200a36022c20022003360228200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009102122030d010c090b200910222203450d080b2002200936022c200220033602280b2005200841086a360200200320086a200b3700000240024002400240200228022c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228022820032000102122090d020c0b0b200228022821090c020b200010222209450d090b2002200036022c200220093602280b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228022c2100200228022821090b200241086a412020092008100302402000450d00200910200b200410200240200141046a280200450d00200128020010200b200241d0006a24000f0b1024000b200a41011023000b200a41011023000b200941011023000b200041011023000b410e41011023000b412e41011023000b13002000410c360204200041f893c1003602000b13002000410936020420004195a1c1003602000b130020004110360204200041a0a1c1003602000bb70101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002400240412010222206450d0020062002290300370000200641186a2003290300370000200641106a2004290300370000200641086a20052903003700002006412041c00010212206450d01200042c0808080900437020420002006360200200641003a0020200241206a24000f0b412041011023000b41c00041011023000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a2002103e200041086a200228020836020020002002290300370200200241106a24000b8b0401047f230041e0006b2202240002400240410f10222203450d00200341076a410029008def4037000020034100290086ef403700002003410f412f10212203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412f200241c0006a1000200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041c8d7c400410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031020200241e0006a24000f0b419a88c00041331039000b410f41011023000b412f41011023000b95140f017f017e027f017e057f017e0a7f037e077f037e027f027e027f027e027f230041a0016b2206240042002107200641086a41086a220842003703002006420037030841cdc8c000410d200641086a1002200641f8006a41086a200829030037030020062006290308370378024002400240024002400240024002400240200641f8006a411041c8d7c400410041001001417f460d0020064200370308200641f8006a4110200641086a41084100100141016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210a20064201370308200641f8006a200110a8022006280278210b200628027c210c200628028001220d450d02200641f8006a41186a220e2000460d01200d41286c210f4201210a200b21050340200541086a2903002104200541106a2903002102200541186a290300210320052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a2003370300200641f8006a41106a22112002370300200641f8006a41086a2004370300200620103703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378211042014201520d030c020b200641e8006a41086a200941086a290300370300200629030821044200210a2006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310211020044201510d010c020b42004201520d010b200541286a2111200a21040c050b200541286a2105200f41586a220f0d000c030b0b419a88c00041331039000b200d41286c2105200b41286a2111200641206a290300210220062903182103200629031021102006290308210a0340200641e8006a41086a200941086a290300370300420021042006420037030820062009290300370368200a4201510d02201141286a21114200210a200541586a22050d000b0b4100210e0240200c450d00200b10200b4108211241002113200a4201510d010c040b200641d8006a41086a2205200641e8006a41086a29030037030020062006290368370358200641c8006a41086a220f200529030037030020062006290358370348200641386a41086a2205200f290300370300200620062903483703380240024002400240412810222212450d00201220062903383703182012201037030020122003370308201241206a2005290300370300201241106a2002370300024002402011200b200d41286c6a460d00200641f8006a41186a220f2000460d0141282114200b200d41286c6a221541586a21164101211741202118411021194108211a4201211b4228211c4220211d4100211e4101210e41012113410021050c030b4101210e41012113200c0d030c040b41282122200b200d41286c6a222341586a2124200641086a41186a290300212520062903182126200629031021272006290308210441012128410821294200212a4201212b4110212c200641f8006a41106a212d4228212e4220212f41002130412021314101210e41012113410121050c010b412841081023000b03400240024002400240024020050e020001010b201121050340200641f8006a20186a221f200520186a290300370300200f200541186a290300370300200641f8006a20196a220d200520196a290300370300200641f8006a201a6a22202005201a6a290300370300200620052903003703780240024002400240200f2900002000290000510d00200d2903002007580d01200641e8006a201a6a200f201a6a2903003703002006200f290300370368200d29030021022006290380012103200629037821104201201b520d030c020b200641e8006a201a6a2009201a6a2903003703002006290308210a420021042006420037030820062009290300370368200641086a41186a29030021022006290318210320062903102110200a201b510d010c020b4200201b520d010b200641d8006a201a6a2211200641e8006a201a6a29030037030020062006290368370358200641c8006a201a6a2221201129030037030020062006290358370348200d2002370300200f2006290348370300200f201a6a202129030037030020062003370380012006201037037802402013200e470d00200e20176a2211200e490d0b200e2017742213201120112013491b2213ad201c7e2202201d88a70d0b2002a72211201e480d0b0240200e450d002012200e20146c2011102122120d010c060b201110222212450d050b200520146a21112012200e20146c6a22212006290378370300202120186a201f290300370300202141186a200f290300370300202120196a200d2903003703002021201a6a2020290300370300200e20176a210e20162005460d03410021050c060b2015200520146a2205470d000c020b0b2011210502400340200641e8006a20296a2211200920296a2903003703002006202a370308200620092903003703682004202b510d01420021042023200520226a2205470d000c020b0b200641d8006a20296a220d201129030037030020062006290368370358200641c8006a20296a2211200d29030037030020062006290358370348202d2025370300200f2006290348370300200f20296a201129030037030020062026370380012006202737037802402013200e470d00200e20286a2211200e490d08200e202874220d20112011200d491b2213ad202e7e2204202f88a70d082004a722112030480d080240200e450d002012200e20226c2011102122120d010c030b201110222212450d020b200520226a21112012200e20226c6a220d2006290378370300200d20316a200641f8006a20316a290300370300200d41186a200f290300370300200d202c6a202d290300370300200d20296a200641f8006a20296a290300370300200e20286a210e4200210420242005470d020b200c450d040c030b201141081023000b410121050c000b0b200b10200b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a220f200841186a290300370300200641f8006a41106a2200200841106a290300370300200641f8006a41086a221a200841086a29030037030020062008290300370378200e2013470d01200e41016a2205200e490d00200e4101742211200520052011491b2213ad42287e2204422088a70d002004a722054100480d0002400240200e450d002012200e41286c200510212212450d010c030b2005102222120d020b200541081023000b1024000b2012200e41286c6a22052006290378370300200541206a2009290300370300200541186a200f290300370300200541106a2000290300370300200541086a201a290300370300200e41016a210e0b2006200e360280012006201336027c200620123602782001200641f8006a10ac02200641a0016a24000b931102167f017e230041206b22032400410121040240200228021841222002411c6a2802002802101104000d00024002402001450d00200020016a2105200241186a21062002411c6a210720002108410021094100210a024003402008210b200841016a210c024002400240024002400240024002400240024020082c0000220d4100480d00200d41ff0171210d0c010b024002400240200c2005460d00200c2d0000413f71210e200841026a2208210c200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20052108200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020082005460d00200841016a220c211020082d0000413f71200e41067472210e200d41f001490d010c030b200521104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b200c21084102210c200d41776a220f411e4d0d010c020b0240024020102005460d00201041016a210820102d0000413f71210d0c010b4100210d200c21080b200e410674200f411274418080f0007172200d72220d418080c400460d084102210c200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d10f6030d0002400240200d41ffff034b0d00200d4180fe0371410876211141c8ddc4002112410021134100210c0c010b0240200d41ffff074b0d00200d4180fe037141087621164183e3c4002117410021184101210c0c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b0240034002400240200c0e020001010b201241026a2114201320122d0001220c6a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d0520134198dec4006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d01201021132014211220144198dec400470d030c010b201021132014211220144198dec400470d010b200d41ffff0371210e41c7e0c400210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b024020104183e3c400460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41d8dbc400102f000b200f410173210f200c4183e3c400470d000b0b200f410171450d070c0a0b4100210c0c040b4100210c0c030b201041af02102e000b20132010102d000b201741026a2114201820172d0001220c6a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d05201841c5e3c4006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d012010211820142117201441c5e3c400470d030c010b2010211820142117201441c5e3c400470d010b200d41ffff0371210e41e3e4c400210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041e0e7c400460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41d8dbc400102f000b200f410173210f200c41e0e7c400470d000b0b200f410171450d050c080b4101210c0c020b4101210c0c010b0b2010419e01102e000b20182010102d000b200d41017267410276410773ad4280808080d0008421194103210c0b200d210e0b2003200136020420032000360200200320093602082003200a36020c02400240200a2009490d0002402009450d0020092001460d00200920014f0d01200020096a2c000041bf7f4c0d010b0240200a450d00200a2001460d00200a20014f0d012000200a6a2c000041bf7f4c0d010b2006280200200020096a200a20096b200728020028020c1100000d0103400240024002400240024002400240200c4101460d0041dc0021090240200c4102460d00200c4103470d062019422088a741ff0171417f6a220c41044b0d060240200c0e050006040503000b201942ffffffff8f608321194103210c41fd0021090c070b4101210c0c060b4100210c200e21090c050b201942ffffffff8f60834280808080c0008421194103210c0c040b201942ffffffff8f60834280808080208421194103210c41fb0021090c030b201942ffffffff8f60834280808080308421194103210c41f50021090c020b200e2019a7220f410274411c7176410f71220c413072200c41d7006a200c410a491b21090240200f450d002019427f7c42ffffffff0f832019428080808070838421194103210c0c020b201942ffffffff8f60834280808080108421194103210c0c010b4101210c0240200d418001490d004102210c200d418010490d0041034104200d41808004491b210c0b200c200a6a2109200a200b6b20086a210a20052008470d050c060b200628020020092007280200280210110400450d000b200341206a240041010f0b20032003410c6a3602182003200341086a36021420032003360210200341106a10fa03000b200341206a240041010f0b200a200b6b20086a210a20052008470d000b0b2009450d0120092001460d010240200920014f0d00200020096a2c000041bf7f4a0d020b200020012009200110f303000b410021090b200241186a220c280200200020096a200120096b2002411c6a220a28020028020c1100000d00200c2802004122200a28020028021011040021040b200341206a240020040b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce0042001087042002200229031022072006290300220842f0b17f427f108804200241206a20006a2203417c6a200520022903007ca7220941e4006e220a410174418ad8c4006a2f00003b00002003417e6a200a419c7f6c20096a410174418ad8c4006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141f8dac4004102200241206a20006a41800120006b109b022100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141f8dac4004102200241206a20006a41800120006b109b022100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff0371410174418ad8c4006a2f00003b0000200941094a0d030c040b2000418001102d000b2000418001102d000b2003220941094c0d010b200241206a2000417e6a22006a2009410174418ad8c4006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141c8d7c4004100200241206a20006a412720006b109b022100200241a0016a240020000bb81c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b70120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10ff01200041086a200241206a41d8001084041a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10800221010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003102222040d0f200341011023000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e00010222204450d2e20042001410c6a28020010fe01410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10810220004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a1080022101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10820220004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10830220004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310840421012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b1045000b4198afc200102f000b1031000b41b8b3c000102f000b41d0bdc100102f000b41ccb0c200102f000b41f0afc200102f000b41a8a8c300102f000b41e00041081023000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d0320012802002003200410212202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0420012802002003200410212202450d050c060b200128020021020c080b200128020021020c050b2004102222020d050b200441011023000b2004102222020d010b200441011023000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d0120012802002002200310212202450d020c030b200128020021020c030b2003102222020d010b200341011023000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0320012802002003200410212202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d0420012802002003200210212200450d050c060b200128020021020c080b200128020021000c050b2004102222020d050b200441011023000b2002102222000d010b200241011023000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d0120012802002002200310212202450d020c040b200128020021020c040b2003102222020d020b200341011023000b1024000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000b9b11030a7f017e057f230041f0006b22042400200441c8006a41086a220542003703002004420037034841f8bfc1004118200441c8006a1002200441286a41086a2005290300370300200420042903483703284100210502400240024002400240024002400240024002400240024002400240200441286a411041c8d7c400410041001001417f460d00200441003a0048200441286a4110200441c8006a41014100100141016a41014d0d0120042d004821050b0240024002400240200341187441187541077620037341187441808080086a41187520054118744118754c0d004190c0c1002105411d21060c010b411a10222205450d04200541186a41002f00eeef403b0000200541106a41002900e6ef40370000200541086a41002900deef40370000200541002900d6ef403700002005411a413410212205450d052005200236001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041c8d7c4004100410010012106200510200240024002400240024002402006417f460d00200441086a41186a200141186a290000370300200441086a41106a200141106a290000370300200441086a41086a200141086a29000037030020042001290000370308411010222205450d0c200541086a41002900feee40370000200541002900f6ee4037000020054110412010212205450d0d200520023600102005412041c00010212205450d0e200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041c8d7c400410041001001210c20051020200c417f470d05200441086a200210ea012006200141186a2900003703002007200141106a2900003703002008200141086a2900003703002004200129000037034820042802102205200428020c220d470d01200541016a22062005490d0720054101742207200620062007491b220dad420586220e422088a70d07200ea722064100480d072005450d022004280208200541057420061021220f0d030c150b41adc0c1002105412221060c050b2004280208210f0c020b20061022220f450d120b2004200d36020c2004200f3602080b200441086a41086a200541016a2207360200200f20054105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a290300370000411310222206450d0e2006410f6a41002800b39141360000200641086a41002900ac9141370000200641002900a4914137000020064113412610212210450d0f20102002360013200441c8006a41186a22084200370300200441c8006a41106a220c4200370300200441c8006a41086a220642003703002004420037034820104117200441c8006a1000200441286a41186a2008290300370300200441286a41106a200c290300370300200441286a41086a20062903003703002004200429034837032820044100360250200442013703482004200736026c200441ec006a200441c8006a103e024002402007450d00200541057441206a21114100200628020022066b210820042802482112200428024c210c200f210503400240200c20086a411f4b0d00200641206a22072006490d06200c4101742213200720072013491b22074100480d0602400240200c450d002012200c2007102122120d010c090b200710222212450d080b2007210c0b201220066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b200441d0006a20063602002004200c36024c200420123602480c010b20062802002106200428024c210c200428024821120b200441286a41202012200610030240200c450d00201210200b20101020200d450d00200f10200b2009200141186a290000370300200a200141106a290000370300200b200141086a29000037030020042001290000370308411010222205450d09200541086a41002900feee40370000200541002900f6ee4037000020054110412010212205450d0a200520023600102005412041c00010212205450d0b200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1000200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110222206450d0c200620033a0000200441286a41202006410110032006102020051020410021050b2000200636020420002005360200200441f0006a24000f0b1024000b200741011023000b419a88c00041331039000b411a41011023000b413441011023000b411041011023000b412041011023000b41c00041011023000b411041011023000b412041011023000b41c00041011023000b410141011023000b411341011023000b412641011023000b200641011023000bbe0503047f027e057f230041d0006b22022400024002400240411310222203450d002003410f6a410028008df040360000200341086a4100290086f040370000200341002900feef4037000020034113412610212204450d0120042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1000200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a290300210620012903002107411010222203450d02200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a103e02400240024002402003450d0020034105742109200241286a41086a28020021002002280228210a200228022c210b2008210303400240024002400240200b20006b41204f0d00200041206a22052000490d07200b410174220c20052005200c491b220c4100480d07200b450d01200a200b200c1021220a0d020c080b200041206a21050c020b200c1022220a450d060b200c210b0b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b200241306a20053602002002200b36022c2002200a3602280c010b200241306a2802002105200228022c210b2002280228210a0b200241086a4120200a200510030240200b450d00200a10200b200410200240200141146a280200450d00200810200b200241d0006a24000f0b1024000b200c41011023000b411341011023000b412641011023000b411041011023000bb00901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a2002103e0240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d0120022802002003200610212203450d020c030b200441046a2105200228020021030c030b2006102222030d010b200641011023000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a2002103e0240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d0120022802002003200710212204450d020c030b2006410e6a2105200228020021040c030b2007102222040d010b200741011023000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a4100290087a24037000020064100290081a2403700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d0020042003200610212204450d010c020b2006102222040d010b200641011023000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d0020042003200610212204450d010c020b2006102222040d010b200641011023000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41c8003600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d0120022802002005200310212205450d020c030b200228020021050c030b2003102222050d010b200341011023000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41ca003600002002410836020c2002410c6a2002103e200828020021064190a2c00021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009102122030d020c060b200641086a2104200228020021030c020b200910222203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006102122030d010c060b200610222203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a220741f0a2c000470d000b200241106a24002006ad4220862003ad840f0b1024000b200941011023000b200641011023000ba81b05027f017e087f017e027f23004180096b22022400024002402001450d00200220003602180c010b200241c8d7c4003602180b2002200136021c20024198076a200241186a10bc02024002400240024002400240024020022802a007450d00200241206a20024198076a4188011084041a200241a8016a200241206a4188011084041a20022903a801200241bc016a2201200241fc016a2203108902200241086a41e795c200411510e001024020022802084101470d002002290310210420024198076a41086a22004200370300200242003703980741fc95c200411720024198076a1002200241a8036a41086a2205200029030037030020022002290398073703a803200241a8036a411041c8d7c400410041001001417f470d0020004200370300200242003703980741fc95c200411720024198076a10022005200029030037030020022002290398073703a8032002200437039807200241a8036a411020024198076a410810030b024002400240024020022903a8012204500d0020024198076a2004427f7c10dd0120024198076a200141201086040d004100210620022802a0022100024002400240200241a8026a280200220141e8016c41e801490d002001410c6c220510222207450d0b2001210820010d010c020b41042107410021082001450d010b200141e8016c2105200141037441786a2109200721010340200220003602a80320024198076a200241a8036a10bd02200141086a20024198076a41086a28020036020020012002290398073702002001410c6a2101200041e8016a2100200541987e6a22050d000b200941037641016a21060b4104210a410021054100210b02402006410c6c2201410c490d002001410c6e220b41037422004100480d0a20001022220a450d0b0b0240200720016a220c2007460d0041002105200a210120072100034020002802002109200141046a200041086a28020036020020012009360200200141086a2101200541016a21052000410c6a2200200c470d000b0b20024198076a200a200510be020240200b450d00200a10200b02402006450d002006410c6c21002007210103400240200141046a280200450d00200128020010200b2001410c6a2101200041746a22000d000b0b02402008450d00200710200b0240200320024198076a4120108604450d0041c8d0c400410e100f20034120101620024198076a412010160b200320024198076a41201086040d05200241a4026a2802002106200241a8016a41f8006a2802002107200241a8026a2802002105200241b0026a200241a8016a41f8001084041a2007200541e8016c6a210020022903b002210d20072101024002400240024002402005450d00200241a8036a41f8006a210920024198076a41086a210c200721010340200241a8066a200141f0001084041a200141f0006a2903002104200241b8056a200141f8006a41f0001084041a20044203510d02200241a8036a200241a8066a41f0001084041a200241a8036a41f0006a20043703002009200241b8056a41f0001084041a2002200241a8036a3602900520024198076a20024190056a10bd02200c28020021050240200228029c07450d0020022802980710200b20024198076a200241a8036a41e8011084041a200241003602a00520024190056a20024198076a2005200241a0056a109f012002280290054101460d0502402002280294052205450d00200520024190056a41086a280200100f0b200141e8016a22012000470d000b200021010b20012000470d010c020b200141e8016a22012000460d010b200241a0086a210520024198076a41f8006a2109034020024198076a200141f0001084041a200141f0006a2903002104200241a8036a200141f8006a41f0001084041a20044203510d01200241a8066a20024198076a41f0001084041a200241b8056a200241a8036a41f0001084041a20024198076a200241a8066a41f0001084041a20024198076a41f0006a20043703002009200241b8056a41f0001084041a2005109201200141e8016a22012000470d000b0b02402006450d00200710200b109102200d10de0120024198076a1096022002200241b0026a41106a280200220b3602b00520022802b802210a200220024198076a41106a28020022013602b405200b2001470d0702400240200b450d0020022802a007210341002106034002400240200a200641286c22006a22012d00002205200320006a22002d0000470d0002400240024020054101460d0020054102470d01200141086a2802002209200041086a280200470d03200141186a210c2009450d02200c290300200041186a290300520d03200141206a290300200041206a290300520d03200141146a280200220e200041146a280200470d032001410c6a28020022092000410c6a280200220c460d04417f21070340200741016a2207200e4f0d052009200c41201086040d04200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000c040b0b2001410c6a28020022082000410c6a280200470d022008450d03200141046a2802002209200041046a280200220c460d034100210703402009200c41201086040d03200941206a2109200c41206a210c200741016a22072008490d000c040b0b200a2003460d02200141016a200041016a41201086040d010c020b200c290300200041186a290300520d00200141146a280200220e200041146a280200470d002001410c6a28020022092000410c6a280200220c460d01417f21070340200741016a2207200e4f0d022009200c41201086040d01200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000b0b4198a5c0004114100f200241a8036a2001109a0120022802a8032209200241a8036a41086a22052802001016024020022802ac03450d00200910200b200241a8036a2000109a0120022802a803220920052802001016024020022802ac03450d00200910200b20012d0000220520002d0000470d030b024002400240024020054101460d0020054102470d01200141086a2802002205200041086a280200470d06200141186a21092005450d022009290300200041186a290300520d06200141206a290300200041206a290300520d06200141146a2802002207200041146a280200470d062001410c6a28020022012000410c6a2802002200460d03417f21050340200541016a220520074f0d042001200041201086040d07200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c070b0b2001410c6a28020022092000410c6a280200470d052009450d02200141046a2802002201200041046a2802002200460d024100210503402001200041201086040d06200141206a2101200041206a2100200541016a22052009490d000c030b0b200a2003460d01200141016a200041016a4120108604450d010c040b2009290300200041186a290300520d03200141146a2802002207200041146a280200470d032001410c6a28020022012000410c6a2802002200460d00417f21050340200541016a220520074f0d012001200041201086040d04200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c040b0b200641016a2206200b490d000b0b0240200241b0026a41346a220120024198076a41346a22004120108604450d0041c8d0c400410e100f2001412010162000412010160b2001200041201086040d09024020024198076a41106a2802002200450d0020024198076a41086a2802002101200041286c21000340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b0240200241a4076a280200450d00200241a0076a28020010200b0240200241b0026a41106a2802002200450d00200241b0026a41086a2802002101200041286c21000340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b0240200241bc026a280200450d00200241b8026a28020010200b20024180096a240042010f0b41aca5c000102f000b2002280294052202450d0120024103460d0220024104460d0341e8a4c000102f000b41f0a3c000102f000b41b8a4c000102f000b41a0a4c000102f000b41d0a4c000102f000b200241bc036a4101360200200241033602ac01200241b0c1c1003602a801200242013702ac03200241b8c1c1003602a8032002200241a8016a3602b803200241a8036a41c0c1c1001048000b4188a4c000102f000b2002200241b0056a3602a0052002200241b4056a36029005200241a8036a41146a4100360200200241a8066a41146a4104360200200241b4066a4105360200200241b8056a41146a4103360200200241c8d7c4003602b803200242013702ac0320024180a5c0003602a803200241053602ac06200242033702bc05200241fcd1c4003602b8052002200241a8036a3602b806200220024190056a3602b0062002200241a0056a3602a8062002200241a8066a3602c805200241b8056a4188a5c0001048000b41c4a5c000102f000b200541041023000b1024000b200041041023000bfc0609047f017e017f017e037f017e047f017e017f230041a0066b22022400200241d8026a20011056200241e8026a280200210320022802e402210420022802e002210520022903d8022106200241b0056a200241ec026a41e4001084041a024002400240024002400240024002400240024002402005450d00200241106a200241b0056a41e4001084041a200241086a200110bc012002280208450d08200228020c2207ad42e8017e2208422088a70d032008a72209417f4c0d032009450d0120091022220a450d042007450d020c050b20004100360208200241a0066a24000f0b4108210a20070d030b4100210f4200210c200a450d050c030b1031000b200941081023000b200241d8026a41f8006a210b4200210c4100210d410021094100210e2007210f0340200241d8026a200110dc01200241b0056a200241d8026a41f0001084041a200241d8026a41f0006a2903002108200241c0046a200b41f0001084041a20084203510d02200e41016a2110200241e8016a200241b0056a41f0001084041a200241f8006a200241c0046a41f0001084041a0240200e200f470d00200d20102010200d491b220fad42e8017e2211422088a70d052011a722124100480d050240200e450d00200a200920121021220a0d010c070b20121022220a450d060b200a20096a200241e8016a41f000108404220e41f0006a2008370300200e41f8006a200241f8006a41f0001084041a200c4280808080107c210c200d41026a210d200941e8016a21092010210e20102007490d000b200a450d020b200241d8026a200241106a41e4001084041a200041106a20033602002000200436020c2000200536020820002006370300200041146a200241d8026a41e4001084041a200041fc006a200c200fad84370200200041f8006a200a360200200241a0066a24000f0b0240200e450d00200a4188016a211003402010109201201041e8016a2110200941987e6a22090d000b0b200f450d00200a10200b2000410036020802402003450d00200341286c2110200521090340024020092d0000220e450d000240200e4101470d00200941086a280200450d01200941046a2802001020200941286a2109201041586a22100d020c030b200941106a280200450d002009410c6a28020010200b200941286a2109201041586a22100d000b0b02402004450d00200510200b200241a0066a24000f0b1024000b201241081023000b8a1203047f027e097f230041206b22022400024002400240024002400240024002400240024002400240024041ea0110222203450d00200242ea0137020420022003360200200341003b00002002410236020802400240024002400240200128020022032903704202520d0020022802044102470d0120022802004102410410212201450d062002410436020420022001360200200241086a28020021040c020b20022802044102470d0220022802004102410410212201450d062002410436020420022001360200200241086a28020021040c030b41022104200228020021010b200120046a41013a0000200241086a2201200128020041016a3602000c070b41022104200228020021010b200120046a4181013a0000200241086a2201200128020041016a360200200341086a200210970102400240024020022802042204200128020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d0120022802002004200110212204450d020c060b200228020021040c060b2001102222040d040b200141011023000b41ea0141011023000b410441011023000b410441011023000b2002200136020420022004360200200241086a28020021010b200241086a2205200141c0006a360200200420016a220141086a200341346a290000370000200141106a2003413c6a290000370000200141186a200341c4006a290000370000200141206a200341cc006a290000370000200141286a200341d4006a290000370000200141306a200341dc006a290000370000200141386a200341e4006a2900003700002001200329002c3700002003200210960102400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782206420c882207420120074201561b22074200510d0620034180016a290300200780210720022802042204200241086a28020022016b41024f0d01200141026a22052001490d0c20044101742201200520052001491b22014100480d0c2004450d0420022802002004200110212204450d050c090b0240200228020420052802002201470d00200141016a22042001490d0c20014101742205200420042005491b22054100480d0c2001450d0220022802002001200510212204450d030c070b200228020021040c070b200228020021040c080b2005102222040d040b200541011023000b2001102222040d040b200141011023000b41f0c9c100102f000b2002200536020420022004360200200241086a28020021010b200241086a200141016a360200200420016a41003a00000c020b2002200136020420022004360200200241086a28020021010b200241086a200141026a360200200420016a2007a741047420067aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b20034188016a2002109501200241086a22032802002101200241003602182002420137031020022001417e6a36021c2002411c6a200241106a103e024002400240024002402003280200220141014d0d002002280218210520022802102108200228021421092003410036020020022802002103024002400240024002400240024002402001417e6a220a450d004102210b2005450d12200320082d00003a00004101210c200241086a2204200428020041016a36020020054101460d12200820056a210d200320082d00013a00012004200428020041016a3602004102210b200841026a21044100210e2005417e6a2203450d052002280204220b20016b20034f0d01200120036a220c2001490d0d200b4101742201200c200c2001491b220c4100480d0d200b450d022002280200200b200c102122010d030c0a0b0240024002402002280204220120054f0d0020014101742204200520052004491b22044100480d0f2001450d0120032001200410212203450d020c110b4100210b2005450d120c110b2004102222030d0f0b200441011023000b200228020021010c020b200c10222201450d070b2002200c360204200220013602000b200120056a200141026a200a1085041a02402005200241086a220b280200220c460d002002280200200c6a210120052103034020034102460d03200120042d00003a0000200b200b28020041016a360200200141016a2101200441016a2104200c2003417f6a2203470d000b200d20046b2203450d030b20034100480d0820031022220c450d042005210b2003210e0b200d2004460d060c050b2005210b200a0d0b0c0c0b4101210c2005210b200d2004470d030c040b418cb8c400102f000b200341011023000b200c41011023000b200c20042d00003a00004101210f0240200441016a2203200d460d00200c41016a2101200520046b21040340200120032d00003a0000200141016a2101200d200341016a2203470d000b200820046a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22016b200f4f0d002001200f6a22042001490d0520034101742201200420042001491b22014100480d052003450d01200228020020032001102122030d020c060b200228020021030c020b200110222203450d040b20022001360204200220033602000b2003200f200b6a22106a2003200b6a200a1085041a02402010200241086a22042802002203460d00200228020020036a2101200f200b6a20036b2105200c21030340200d2003460d01200120032d00003a00002004200428020041016a360200200341016a2103200141016a21012005417f6a22050d000b0b2010210b0b0240200e450d00200c10200b200a450d060c050b1024000b200141011023000b2002200436020420022003360200200241086a280200210b0b2003200b6a220120082d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2104200841016a2103200141016a21010340200120032d00003a0000200141016a2101200341016a21032004417f6a22040d000b200b20056a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22012802002203460d002002280200220420036a2004200b6a200a1085041a0b20012003200a6a3602000b02402009450d00200810200b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204102222050d01200441041023000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d1021220a0d020c080b200820046a21070c020b200d1022220a450d060b200d210b0b200a20046a200c20081084041a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031018200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a10200b02402002450d00200510200b200341206a24000f0b1024000b200d41011023000bb40403017f017e017f230041a0026b22022400024002402001450d00200220003602180c010b200241c8d7c4003602180b2002200136021c20024198016a200241186a1056024020022802a001450d00200241206a20024198016a41f8001084041a2002290320200241346a200241f4006a108902200241086a41e795c200411510e001024020022802084101470d002002290310210320024198016a41086a22014200370300200242003703980141fc95c200411720024198016a100220024190026a41086a2200200129030037030020022002290398013703900220024190026a411041c8d7c400410041001001417f470d0020014200370300200242003703980141fc95c200411720024198016a100220002001290300370300200220022903980137039002200220033703980120024190026a411020024198016a410810030b0240200241206a41106a2802002200450d0020022802282101200041286c21000340024020012d00002204450d00024020044101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b02402002412c6a280200450d00200241286a28020010200b200241a0026a240042010f0b200241346a41013602002002410336029402200241bcc2c1003602900220024201370224200241b8c1c100360220200220024190026a360230200241206a41c0c1c1001048000b060010c201000bdc0d01087f230041206b22022400200241003602182002420137031002400240024002400240024002400240410410222203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d0120022802102003200410212205450d020c040b200228021021050c040b2004102222050d020b200441011023000b410441011023000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41043a00004111200241106a10c2024100210302400340200341e88ec0006a280200200341ec8ec0006a280200200241106a10c30202400240024002400240024002400240024002400240024002400240024002400240200341f08ec0006a2802004101470d00200341f48ec0006a280200200341f88ec0006a280200200241106a10c302200341fc8ec0006a22062802004102460d010c020b2002200341f48ec0006a28020011060020022802002002280204200241106a10c302200341fc8ec0006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007102122060d020c040b200228021021060c020b200710222206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a00002003418c8fc0006a22062802004102470d020c030b200741011023000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008102122070d020c0d0b200228021021070c020b200810222207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10c4022003418c8fc0006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008102122070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007102122060d050c0a0b200228021021060c050b200810222207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10c5022003419c8fc0006a22062802004102460d030c080b200710222206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a00002003419c8fc0006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007102122060d020c070b200228021021060c020b200710222206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341c809470d050c060b200841011023000b200841011023000b200741011023000b200741011023000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008102122070d020c070b200228021021070c020b200810222207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10c602200341c8006a220341c809470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a103e02400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d0120022802102005200810212205450d020c050b2002280210220520046a200620031084041a200420036a21032007450d060c050b2008102222050d030b200841011023000b1024000b200841011023000b2002200836021420022005360210200520046a200620031084041a200420036a21032007450d010b200610200b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0520012802002002200410212203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d0820012802002003200210212203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002102122030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102122030d0a0c0e0b2004102222030d110b200441011023000b200128020021030c050b200128020021030c070b2002102222030d0b0b200241011023000b200210222203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b200410222203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002102122030d020c070b200128020021030c020b200210222203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b1024000b200241011023000b200441011023000b200241011023000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0520022802002003200510212204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d0820022802002004200310212204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003102122040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005102122040d0a0c0d0b2005102222040d100b200541011023000b200228020021040c050b200228020021040c070b2003102222040d0a0b200341011023000b200310222204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b200510222204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003102122040d020c060b200228020021040c020b200310222204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b200341011023000b200541011023000b200341011023000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310212204450d020c040b200228020021040c040b2003102222040d020b200341011023000b1024000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a200020011084041a0bff0901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a2802002200200110c2022000450d01200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110c302200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a102122070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a102122070d060c0e0b200128020021070c030b200128020021070c050b200a10222207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10222207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110e30302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110c3020c010b200241106a200041c4006a280200200041c8006a28020028020c11050020022802102209200241106a41086a280200200110c3022002280214450d00200910200b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110e4032004200541e4006a2205470d010c030b2009200041d8006a280200200110e4032004200541e4006a2205470d000c020b0b200241086a200041046a28020011060020022802082103200228020c2200200110c2022000450d00200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110c302200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a102122070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a102122070d060c0f0b200128020021070c030b200128020021070c050b200a10222207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10222207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110e30302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110c3020c010b200241106a200041c4006a280200200041c8006a28020028020c11050020022802102209200241106a41086a280200200110c3022002280214450d00200910200b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110e4032004200541e4006a2205470d010c020b2009200041d8006a280200200110e4032004200541e4006a2205470d000b0b200241206a24000f0b1024000b200a41011023000b200a41011023000b200a41011023000b200a41011023000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110c2022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c3022000410c6a200110e503200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c030b2006200041246a280200200110e40320042005412c6a2205470d000c020b0b200241086a200041046a28020011060020022802082103200228020c2200200110c2022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c3022000410c6a200110e503200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c020b2006200041246a280200200110e40320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110c2022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c302200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110e4030c010b2006200041146a280200200110e4030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c030b2006200041246a280200200110e40320042005412c6a2205470d000c020b0b200241086a200041046a28020011060020022802082103200228020c2200200110c2022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110c302200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110e4030c010b2006200041146a280200200110e4030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110e40320042005412c6a2205470d010c020b2006200041246a280200200110e40320042005412c6a2205470d000b0b200241106a24000be00301017f230041f0056b22022400024002402001450d00200220003602000c010b200241c8d7c4003602000b20022001360204200241f8036a200210dc0102400240024002400240024020022903e8044203510d00200241086a200241f8036a41e8011084041a200241f0016a200241086a41e8011084041a2002200241f0016a3602f803200241d8036a200241f8036a10bd0220022802e0032101200241f8036a200241f0016a41e8011084041a200241e8056a20022802e003360200200220022903d8033703e005200241e8036a200241f8036a2001200241e0056a109f010240024020022802e8034101470d004280828898f01f20022802ec03410374ad88a7210041011022210141010d010c050b20022802ec0341004721004101102221014100450d040b2001450d01200141013a000020014101410210212201450d020c040b20024184026a41013602002002410336020c200241d4c2c100360208200242013702f401200241b8c1c1003602f0012002200241086a36028002200241f0016a41c0c1c1001048000b410141011023000b410241011023000b2001450d01200141003a0000200141014102102122010d00410241011023000b200120003a0001200241f0056a24002001ad428080808020840f0b410141011023000bec1203027f017e0b7f230041c0016b2202240010910220024180016a41086a22034200370300200242003703800141cdc8c000410d20024180016a1002200241086a41086a200329030037030020022002290380013703084200210402400240024002400240024002400240200241086a411041c8d7c400410041001001417f460d00200242003703a001200241086a4110200241a0016a41084100100141016a41084d0d0120022903a00121040b200410de01200342003703002002420037038001418bc7c000411520024180016a100220024190016a41086a200329030037030020022002290380013703900120024190016a411041c8d7c400410041001001417f460d0141002105200241003602084104210641012107024020024190016a4110200241086a41044100100141016a41044d0d0020022802082208450d032008ad420c7e2204422088a70d042004a722034100480d040240200310222206450d00200621094100210a024002400340024002400240024002400240411410222203450d00200341106a41002800bcc840360000200341086a41002900b4c840370000200341002900acc8403700002003411441281021220b450d01200b200a360014200241086a41186a22034200370300200241086a41106a22054200370300200241086a41086a220c420037030020024200370308200b4118200241086a1000200241a0016a41186a2003290300370300200241a0016a41106a2005290300370300200241a0016a41086a200c290300370300200220022903083703a001024002400240200241a0016a412041c8d7c400410041001001417f460d002002422037020c2002200241a0016a3602082002200241086a108e012002280200450d0a20022802042203417f4c0d052003450d01200310762205450d06200c200c280200220d200341002002280208200228020c20052003200d1001220d200d417f461b220d200d20034b1b220d6a360200200d2003470d020c070b42002104410121050c070b410121052002280208200228020c41014100200c28020010011a41002003460d050b2003450d07200510200c070b411441011023000b412841011023000b1031000b200341011023000b2005450d022003ad22044220862004842104200241a0016a412010090b200b1020200941046a2004370200200920053602002009410c6a21092008200a41016a220a470d000c020b0b419a88c00041331039000b41002107200821050c040b200341041023000b419a88c00041331039000b419a88c00041331039000b4100210541012107410421060b410421084100210b4100210d02400240024002402005410c6c2203410c490d002003410c6e220d41037422094100480d04200910222208450d010b0240200620036a220c2006460d004100210b200821032006210903402009280200210a200341046a200941086a2802003602002003200a360200200341086a2103200b41016a210b2009410c6a2209200c470d000b0b200241a0016a2008200b10be020240200d450d00200810200b02402005450d002005410c6c21092006210303400240200341046a280200450d00200328020010200b2003410c6a2103200941746a22090d000b0b024020070d00200610200b200241086a41186a200241a0016a41186a290300370300200241086a41106a200241a0016a41106a290300370300200241086a41086a200241a0016a41086a290300370300200220022903a00137030820024180016a41086a22034200370300200242003703800141dac8c000411520024180016a100220024190016a41086a220b200329030037030020022002290380013703900120024190016a4110200241086a41201003200241086a109602200241003602980120024201370390010240412010222203450d00200242a080808080043702940120022003360290012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a20024190016a1096010240024002402002280294012209200b280200220a6b41204f0d00200a41206a2203200a490d072009410174220b20032003200b491b220c4100480d072009450d012002280290012009200c1021220b450d020c050b200a41206a2103200228029001210b0c050b200c1022220b0d030b200c41011023000b412041011023000b200941041023000b2002200c360294012002200b36029001200c21090b20024190016a41086a220c2003360200200b200a6a220a41086a200241c4006a290200370000200a41106a200241cc006a290200370000200a41186a200241d4006a290200370000200a200229023c3700000240200920036b411f4b0d00200341206a220a2003490d0120094101742205200a200a2005491b220a4100480d010240024002402009450d00200b2009200a1021220b450d010c020b200a1022220b0d010b200a41011023000b2002200a360294012002200b360290010b200c200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602a001200241a0016a20024190016a103e0240200f450d00200f41286c210d20024190016a41086a22072802002103200228029401210c200e210b0340200241a0016a200b109a0120022802a00121050240024002400240200c20036b200241a0016a41086a280200220a4f0d002003200a6a22092003490d06200c4101742208200920092008491b22064100480d06200c450d01200228029001200c2006102122080d020c070b2003200a6a210920022802900121080c020b200610222208450d050b200220063602940120022008360290012006210c0b20072009360200200820036a2005200a1084041a024020022802a401450d00200510200b200b41286a210b20092103200d41586a220d0d000b0240200f450d00200f41286c210b200e21030340024020032d0000220a450d000240200a4101470d00200341086a280200450d01200341046a2802001020200341286a2103200b41586a220b0d020c030b200341106a280200450d002003410c6a28020010200b200341286a2103200b41586a220b0d000b0b200241146a280200450d040c030b20024198016a28020021092002280290012108200241146a2802000d020c030b1024000b200641011023000b200e10200b200241c0016a24002009ad4220862008ad840bc60f03017f037e127f23004180026b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c200241306a200241086a10ca020240024002402002280230450d00200241106a41086a2201200241306a41086a220028020036020020022002290330370310200241206a41086a20012802003602002002200229031037032020024190016a200241206a10cb022002280290014101460d0120024190016a41086a2201290300210320014200370300200242003703900141da95c200410d20024190016a100220002001290300370300200220022903900137033042002104024002400240200241306a411041c8d7c400410041001001417f460d002002420037039001200241306a411020024190016a41084100100141016a41084d0d0120022903900121040b20024190016a41086a22014200370300200242003703900141fc95c200411720024190016a1002200241306a41086a2001290300370300200220022903900137033002400240200241306a411041c8d7c400410041001001417f460d002002420037039001200241306a411020024190016a41084100100141016a41084d0d03200229039001210541e801210141e80110222206450d010c060b4203210541e801210141e801102222060d050b200141081023000b419a88c00041331039000b419a88c00041331039000b200241a4016a41013602002002410336028401200241ecc2c100360280012002420137029401200241b8c1c10036029001200220024180016a3602a00120024190016a41c0c1c1001048000b419d97c200412820022802940120024190016a41086a280200109c02000b200620024190016a41f000108404220742023703702007410036028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241306a41d0001084041a2002280220220821092002280224220a210b41002101037e02400240024020010e020001010b200941086a210020092f0106220d4103742101417f210c02400240024003402001450d01417f410141b08dc00020004108108604220e4100481b4100200e1b220e450d03200141786a2101200c41016a210c200041086a2100200e4101460d000b200b0d010c020b200d210c200b450d010b200b417f6a210b2009200c4102746a41e4016a2802002109410021010c030b4108210f41032110417f21114102211241e401211341b4c5c10021144100211541012116417821170c010b2008200f6a210c20082f0106220d2010742100417f2101024002400240024002400240024003402000450d01200120166a2101201120162014200c200f108604220e2015481b2015200e1b220e450d03200020176a2100200c200f6a210c200e2016460d000b200a0d010c030b200d2101200a450d020b200a20116a210a200820012012746a20136a2802002108410121010c060b200841e0006a2001410c6c6a2216450d002016280208210120162802002116200242003703900120024190016a20162001410820014108491b1084041a200141074d0d01200229039001210320024190016a41086a22014200370300200242003703900141c7b0c000411520024190016a1002200241306a41086a200129030037030020022002290390013703304100210102400240200241306a411041c8d7c400410041001001417f460d0020024210370284012002200241306a3602800120024190016a20024180016a10f4012002280290012200450d0420024198016a2802002101200228029401210f0c010b410821004100210f0b4100211602402001417f6a220c20014b0d00200c20014f0d002000200c4103746a2201450d00200129030020035221160b0240200f450d00200010200b024002402016450d00200741e80141d00310212206450d05200641e8016a20024190016a41f0001084041a200642023703d802200620033703f8022006410a3602f00220062002290380013703e002200641e8026a20024188016a29030037030020064180036a200241306a41d0001084041a4102210e0c010b4101210e0b200228022020022802242002280228104320024100360238200242013703302002200e36029001200e41e8016c210720024190016a200241306a103e2002280234210c2002280238210120024190016a41086a2111410021000240024003402002200620006a3602800120024190016a20024180016a10bd0220022802900121080240024002400240200c20016b2011280200220f4f0d002001200f6a22162001490d05200c4101742215201620162015491b22094100480d05200c450d012002280230200c2009102122150d020c060b2001200f6a2116200228023021150c020b200910222215450d040b20022009360234200220153602302009210c0b200241306a41086a2016360200201520016a2008200f1084041a0240200228029401450d00200810200b201621012007200041e8016a2200470d000b200e41e8016c2100410021010340200620016a4188016a1092012000200141e8016a2201470d000b2006102020024180026a24002016ad4220862015ad840f0b1024000b200941011023000b41c0b5c000412b41bcc5c1004128109c02000b41c0b5c000412b41bcccc4004129109c02000b419a88c00041331039000b41d00341081023000b410121010c000b0b9d0a06027f017e097f017e077f017e23004190026b22022400200241086a200110bc01024002402002280208450d000240024002400240024002400240024002400240024002400240024002400240200228020c2203ad2204421d88a70d002004420386a72205417f4c0d00024002402005450d00200510222206450d032003450d010c040b4101210620030d030b410021054100210b2006450d100c030b1031000b200541011023000b200141046a210741002108410021094100210a2003210b034020024200370330200241306a2001280200220c20072802002205410820054108491b220d1084041a20072005200d6b3602002001200c200d6a360200200541074d0d02200a41016a2105200229033021040240200a200b470d002008200520052008491b220bad420386220e422088a70d09200ea7220d4100480d090240200a450d0020062009200d102122060d010c0b0b200d10222206450d0a0b200620096a2004370000200841026a2108200941086a21092005210a20052003490d000b2006450d0d0b2005ad422086200bad84210e200241306a200110be012002280230220f450d0120022802342110200241306a41086a2802002205200e422088a7470d022002420037021420024180e5c200360210200f2005410c6c6a210b20054103742205450d03200620056a2111200241106a41086a2112200241c4006a2113200241c0006a2114200f21082006210c034020082205200b460d062005410c6a210820052802002215450d05200529020421042002200c290000221637032002400240200228021022054180e5c200460d00200228021421070c010b41e40110222205450d0a41002107200541003b010620054100360200200541086a200241306a41dc011084041a20024100360214200220053602100b200c41086a210c02400340200541086a210d20052f010622034103742109417f210a02400240024003402009450d01200a41016a210a417f4101200241206a200d410810860422014100481b410020011b2201450d05200941786a2109200d41086a210d20014101460d000b20070d010c020b2003210a2007450d010b2007417f6a21072005200a4102746a41e4016a28020021050c010b0b2013201637020020142012360200200241306a410c6a200a360200200241306a41086a200241106a36020020022005360234200241003602302002200437022420022015360220200241306a200241206a103f200c2011470d010c060b2005200a410c6c6a220541e4006a220a2802002109200a2004370200200541e0006a220a2802002105200a201536020002402005450d002009450d00200510200b200c2011470d000c050b0b200b450d0b0c0a0b200ea70d090c0a0b2000410036020002402005450d002005410c6c210a200f210503400240200541046a280200450d00200528020010200b2005410c6a2105200a41746a220a0d000b0b02402010450d00200f10200b200ea7450d0a2006102020024190026a24000f0b200f21080b200ea7450d050c040b200b2108200ea70d030c040b1024000b200d41011023000b41e40141041023000b200610200b02402008200b460d00034020082802002205450d010240200841046a280200450d00200510200b2008410c6a2208200b470d000b0b02402010450d00200f10200b200241306a41086a2205200241106a41086a28020036020020022002290310370330200041086a20052802003602002000200229033037020020024190026a24000f0b200610200b200041003602000b20024190026a24000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d01419fcdc400200641081086042208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b1084041a200141074d0d01200041086a2002290308370300410021010c030b200041d0cdc400360204200041086a41283602000c010b200041a7cdc400360204200041086a41293602000b410121010b20002001360200200241106a24000b933a1b0c7f017e067f017e0b7f017e027f027e017f017e027f037e027f017e017f027e067f017e017f017e027f037e1b7f027e0d7f027e057f230041d0026b22022400024002402001450d00200220003602100c010b200241c8d7c4003602100b20022001360214200241f0006a200241106a10bc020240024002400240024020022802782203450d00200241f0016a2802002104200241ec016a280200210520024180016a2802002106200241fc006a280200210720022802e8012108200241186a200241106a10ca022002280218450d01200241306a41086a2201200241186a41086a220928020036020020022002290318370330200241c0006a41086a200128020036020020022002290330370340200241013b015c2002420037025420024180e5c200360250200241d0006a41086a210a2004450d0241e801210b2008200441e8016c6a210c41f000210d4202210e4117210f41fc95c20021104100211141c8d7c400211241102113417f2114427f2115410321164102211741e401211841b4ccc4002119410c211a41e000211b4107211c418801211d419001211e410d211f200241d0006a410d6a212042f4d2b59bc7ae98b830212141dc01212220024184016a2123420121244281808080102125410921264289808080900121274178212841da95c2002129423c212a428080808070212b4225212c2008212d4100212e0c030b2002412c6a41013602002002410336025420024188c3c1003602502002420137021c200241b8c1c1003602182002200241d0006a360228200241186a41c0c1c1001048000b20024184016a41013602002002410336025420024188c3c10036025020024201370274200241b8c1c1003602702002200241d0006a36028001200241f0006a41c0c1c1001048000b410021010c010b410221010b037e024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b200241f0006a41086a200a290300370300200220022903503703700c200b412f411e2050204f410c6c6a41a07f4622431b215141b88dc0004181cdc40020431b21430c010b02400240202e0e06000103040506060b202d200d6a290300200e520d11202d2802880122010d4a202d29039001212f200241f0006a41086a22304200370300200242003703702010200f200241f0006a1002200920302903003703002002200229037037031802400240200241186a201320122011201110012014460d0020024200370370200241186a2013200241f0006a41082011100141016a41084d0d08200229037021310c010b420321310b2015203120317c223220322031541b2231500d09200241c0006a2133200228024421340c1c0b2044280200225020466a210020502f010622382047742101417f214f02400240024003402001450d01204f204d6a214f2048204d204b200020461086042237204c481b204c20371b2237450d152001204e6a2101200020466a21002037204d460d000b20450d010c020b2038214f2045450d010b204520486a21452050204f2049746a204a6a21444101212e0c130b412f215141b88dc00021430b2002205136026420022043360260200242efcc99e3a6ae99b830370318200241086a200241d0006a200241186a200241e0006a10cd02200228020822510d08200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c1d0b2053205b2059205a6a220120012059491b6a22012053490d432053205a742200200120012000491b2254ad205c862231205d88a70d432031a72201205e480d4302402053450d0020552053205f742001102122550d0b0c050b200110222255450d044103212e0c130b20552053205f746a20583602002053205a6a21532059450d1c0240205720512f01064f0d00205120572060746a20616a21582057205a6a21572059205b6a215920542053460d080c090b41012101024020512f01042200205128020022512f0106490d004101210103402001205a6a210120512f01042200205128020022512f01064f0d000b0b205120002060746a20616a215820512000205f746a20626a2802002151410021572001205a460d1a205a20016b2101034020512802e40121512001205a6a22010d000c1b0b0b2063206a206920646a220120012069491b6a22012063490d4120632064742200200120012000491b2265ad206b862231206c88a70d412031a72201206d480d4102402063450d0020662063206e742001102122660d0c0c040b200110222266450d034105212e0c150b20662063206e746a2068360200206320646a216302402069450d000240206720432f01064f0d0020432067206f6c6a20706a2168206720646a21672069206a6a216920652063460d0a0c0b0b41012101024020432f01042200204328020022432f0106490d00410121010340200120646a210120432f01042200204328020022432f01064f0d000b0b20432000206f6c6a20706a216820432000206e746a20716a28020021434100216720012064460d18206420016b2101034020432802e4012143200120646a22010d000c190b0b206621042053413f4b0d2c0c1d0b419a88c00041331039000b200141041023000b200141041023000b4198b4c000102f000b41f690c20041222051200228020c109c02000b4102212e0c080b4103212e0c080b4103212e0c090b4104212e0c090b4105212e0c090b4105212e0c0a0b410021010c410b410121010c400b410221010c3f0b410221010c3e0b410221010c3d0b410221010c3c0b410221010c3b0b410221010c3a0b410221010c390b410221010c380b410221010c370b41002101034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b2033280200223641086a210020362f010622352016742101410021370240024003402001450d012019200041081086042238450d02200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21350b2034450d03203420146a2134203620352017746a20186a2133410021010c150b2036201b6a2037201a6c6a2200450d02200028020821012000280200210020024200370370200241f0006a20002001410820014108491b1084041a2001201c4d0d03202f20318020022903702239520d05202d201d6a223a28020022010d42202d201e6a2903002132200241f0006a200241c0006a10cb020240024020022802704101470d002030350200213b2002280274213c4101213d20202d0000450d010c100b2030290300213e4200213b20304200370300200242003703702029201f200241f0006a100220092030290300370300200220022903703703180240200241186a201320122011201110012014460d0020024200370370200241186a2013200241f0006a41082011100141016a41084d0d0e2002290370213b0b20304200370300200242003703702010200f200241f0006a10022009203029030037030020022002290370370318024002400240200241186a201320122011201110012014460d0020024200370370200241186a2013200241f0006a41082011100141016a41084d0d112002290370213f2032203e202a7c580d020c010b4203213f2032203e202a7c580d010b2040202b83202c84213b4101213d41f896c200213c20202d0000450d010c100b4100213d2032203f203b7c223b5a0d0220202d00000d0f0b02400240203d450d0020022802502002280254200a28020010432002420037025420024180e5c200360250200220213703180c010b200228025021412002202137031820414180e5c200460d00200228025421420c140b201810222241450d0941002142204141003b010620414100360200204141086a200241f0006a20221084041a20024100360254200220413602500c120b204141086a210020412f010622362016742101417f213702400240024003402001450d01200241186a200041081086042138200120286a2101203741016a2137200041086a21002014410120382011481b201120381b22384101460d000b2038450d0a20420d010c020b203621372042450d010b204220146a2142204120372017746a20186a2802002141410121010c140b20232021370200200241f0006a20136a200a360200200241f0006a201a6a20373602002030200241d0006a36020020022041360274200220113602702009201136020020022024370318410110222101024002400240024002400240203d450d002001450d0f200141013a00002002202537021c200220013602182002203ba72201360260200241e0006a200241186a103e200228021c2237200928020022006b20014f0d01200020016a22382000490d4320374101742236203820382036491b22382011480d432037450d02200228021820372038102122370d030c100b2001450d13200120113a00002002202537021c2002200136021820014101202610212201450d142001203b3700012002202737021c200220013602180c040b200228021821370c020b203810222237450d0d0b2002203836021c200220373602180b2009200020016a360200203720006a203c20011084041a0b200241e0006a41086a200928020036020020022002290318370360200241f0006a200241e0006a103f2020203d3a0000200241d0006a201a6a20113a0000203b2140203d0d060b203a2802004101460d410c420b203942808080807083421c84213141e5ccc40021430c010b203942808080807083422984213141bcccc40021430b2031a721510c010b41312151418fb5c00021430b2002205136026420022043360260200242e1eac98bb68edbb7f4003703182002200241d0006a200241186a200241e0006a10cd02200228020022510d0a200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c100b200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c0f0b41f690c2004122419891c200412d109c02000b41e40141041023000b410141011023000b203841011023000b419a88c00041331039000b419a88c00041331039000b41f690c200412241c591c2004131109c02000b410141011023000b410941011023000b41f690c200412220512002280204109c02000b410121010c010b410121010c000b0b2069206a6a216902400240024020652063470d004104212e0c010b4105212e0c010b410221010c360b410221010c350b2059205b6a215902400240024020542053470d004102212e0c010b4103212e0c010b410221010c350b410221010c340b200228024020022802442002280248104302402006450d00200641286c2143200321510340024020512d00002201450d00024020014101470d00205141086a280200450d01205141046a2802001020205141286a2151204341586a22430d020c030b205141106a280200450d002051410c6a28020010200b205141286a2151204341586a22430d000b0b02402007450d00200310200b02402004450d00200441e8016c214320084188016a215103402051109201205141e8016a2151204341987e6a22430d000b0b02402005450d00200810200b410110222251450d05205120022d007c3a000020514101410210212252450d06205220022d007d3a0001200228027022432151024020022802742200450d002043215120002101034020512802e40121512001417f6a22010d000b2000210103402001417f6a22010d000b0b02400240024020022802782237450d002037417f6a215320512f0106450d01205141086a2138410121000c020b4100215441042155410421564100215320000d030c040b0240024020512f01042200205128020022512f01064f0d00410121010c010b410121010340200141016a210120512f01042200205128020022512f01064f0d000b0b205120004103746a41086a2138205120004102746a41e8016a28020021514100210020014101460d00410120016b2101034020512802e4012151200141016a22010d000b0b417f205341016a220120012053491b2254ad2231421e88a70d042031420286a72201417f4c0d04024002400240024002402001450d00200110222255450d0d205520383602002053450d020c010b41042155410420383602002053450d010b200020512f01064f0d01200041016a2157205120004103746a41086a21580c020b410121530c020b0240024020512f01042200205128020022512f01064f0d00410121010c010b410121010340200141016a210120512f01042200205128020022512f01064f0d000b0b205120004103746a41086a2158205120004102746a41e8016a28020021514100215720014101460d00410120016b2101034020512802e4012151200141016a22010d000b0b2037417e6a21594101215a417f215b4202215c4220215d4100215e4102215f410321604108216141e80121624101215320544101470d0b0c0a0b205521562002280270214320022802742200450d010b20002101034020432802e40121432001417f6a22010d000b03402000417f6a22000d000b0b024002400240200241f8006a2802002263450d002063417f6a216420432f0106450d01204341e0006a2137410121000c020b410021654104216641042104410021632053413f4d0d020c110b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b20432000410c6c6a41e0006a2137204320004102746a41e8016a28020021434100210020014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b417f206441016a220120012064491b2265ad2231421e88a70d012031420286a72201417f4c0d01024002400240024002402001450d00200110222266450d0b206620373602002064450d020c010b41042166410420373602002064450d010b200020432f01064f0d01200041016a216720432000410c6c6a41e0006a21680c020b41012163206621042053413f4b0d110c020b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b20432000410c6c6a41e0006a2168204320004102746a41e8016a28020021434100216720014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b2063417e6a216941012164417f216a4202216b4220216c4100216d4102216e410c216f41e000217041e80121714101216320654101470d0a0c090b4101215a410110222237450d03203720534102743a000020534102742243450d140c0f0b1031000b410141011023000b410241011023000b410141011023000b200141041023000b200141041023000b4102212e0c030b4103212e0c030b4104212e0c030b4105212e0c030b410221010c240b410221010c230b410221010c220b410221010c210b02402053418080014f0d004102215a410210222237450d02203720534102744101723b0000205341027422430d010c060b024020534180808080044f0d004104215a410410222237450d0320372053410274410272360000205341027422430d010c060b410110222251450d03205141033a00004105215a20514101410510212237450d042037205336000120534102742243450d050b4100205a6b2151205a215302400340205628020021010240205a20516a41074b0d00205341086a22002053490d15205a4101742264200020002064491b22004100480d1502400240205a450d002037205a2000102122370d010c040b200010222237450d030b2000215a0b205641046a2156203720536a2001290000370000205141786a2151205341086a21532043417c6a22430d000b2063413f4b0d070c060b200041011023000b410241011023000b410441011023000b410141011023000b410541011023000b205a21532063413f4b0d010b41012143410110222256450d08205620634102743a00004101210120630d010c020b02402063418080014f0d0041022143410210222256450d07205620634102744101723b00000c010b024020634180808080044f0d0041042143410410222256450d06205620634102744102723600000c010b410110222251450d04205141033a00004105214320514101410510212256450d03205620633600010b20634102742164204321010340200428020022512802002163024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020512802082251413f4b0d0020432001470d01204341016a22012043490d2120434101742200200120012000491b22004100480d212043450d05205620432000102122560d060c0f0b2051418080014f0d01204320016b41014b0d02200141026a22002001490d2020434101742238200020002038491b22004100480d202043450d0b205620432000102122560d0c0c0f0b204321000c050b20514180808080044f0d01204320016b41034b0d05200141046a22002001490d1e20434101742238200020002038491b22004100480d1e024020430d00200010222256450d100c070b205620432000102122560d060c0f0b204321000c090b20432001470d05204341016a22012043490d1c20434101742200200120012000491b22004100480d1c0240024020430d00200010222256450d100c010b20562043200010212256450d0f0b204321010c060b200010222256450d090b204321010b205620016a20514102743a00002000200141016a22016b20514f0d060c0c0b204321000b205620016a20514102744102723600002000200141046a22016b2051490d0a0c040b204321000b205620016a41033a000002402000200141016a22436b41034b0d00204341046a22382043490d162000410174222e20382038202e491b22384100480d16024002402000450d00205620002038102122560d010c080b203810222256450d070b203821000b205620436a20513600002000200141056a22016b2051490d080c020b200010222256450d030b205620016a20514102744101723b00002000200141026a22016b2051490d060b200021430c060b200041011023000b200041011023000b203841011023000b200041011023000b200041011023000b200120516a22432001490d0c20004101742238204320432038491b22434100480d0c02402000450d00205620002043102122560d010c040b204310222256450d030b200441046a2104205620016a206320511084041a200120516a21012064417c6a22640d000b0b024002400240205a20536b20014f0d00205320016a22512053490d0c205a4101742200205120512000491b22004100480d0c205a450d012037205a200010212237450d020c090b205320016a2151203720536a205620011084041a2043450d0a0c090b2000102222370d070b200041011023000b204341011023000b410541011023000b410141011023000b410441011023000b410241011023000b410141011023000b2000215a203720536a205620011084041a2043450d010b205610200b02402065450d00206610200b02402054450d00205510200b02402051450d00205141026a22432051490d0120434104204341044b1b22014100480d0120524102200110212252450d02205241026a203720511084041a205a450d040c030b205141026a2143205241026a203720511084041a205a0d020c030b1024000b200141011023000b203710200b20022802702002280274200241f8006a2802001043200241d0026a24002043ad4220862052ad840f0b20014101470d010b202d280290012017460d010b202d200b6a222d200c470d010c030b200241c0006a2144200228024421454108214641032147417f21484102214941e401214a41b08dc000214b4100214c4101214d4178214e0c010b4100212e0c020b4101212e0c020b410021010c020b410221010c010b410221010c000b0bdb0403037f017e047f23004180026b220424000240024020012d000d450d0041c591c2002101413121020c010b2001280200200141046a2205280200200141086a220628020010432005420037020020014180e5c2003602002004200229000022073703100240024041e40110222202450d00200241003b010620024100360200200241086a200441206a41dc011084041a200541003602002001200236020020022f01062208410374210941002105417f210a0240034020092005460d010240417f4101200441106a200220056a41086a4108108604220b4100481b4100200b1b220b450d00200541086a2105200a41016a210a200b4101460d010c040b0b419891c2002101412d21020c030b2008210a0c010b41e40141041023000b20042007370234200420063602302004200a36022c20042001360228200420023602242004410036022020044100360218200442013703102003280200210a2004200328020422023602002004200441106a103e02400240024002400240024020042802142203200428021822056b20024f0d00200520026a220b2005490d0320034101742209200b200b2009491b220b4100480d032003450d0120042802102003200b10212203450d020c040b200428021021030c040b200b102222030d020b200b41011023000b1024000b2004200b360214200420033602100b200441106a41086a220b200520026a360200200320056a200a20021084041a200441086a200b28020036020020042004290310370300200441206a2004103f20014180023b010c410021010b200020023602042000200136020020044180026a24000b7201027f230041206b220224002002108b020240412010222203450d0020032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840f0b412041011023000bb11303027f027e087f230041f0076b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c20024188066a200241086a10dc010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903f8064203510d00200241106a20024188066a41e8011084041a200241f8016a200241106a41e8011084041a2002200241f8016a3602f00420024188066a200241f0046a10bd0220022802900621030240200228028c06450d0020022802880610200b20024188066a200241f8016a41e8011084041a200241f0046a20024188066a10a0010240024002400240024002400240024020022802f0044101470d0020022802f404210320022802f8042201411a460d0120014115470d024102210141f601210020034195a9c000460d1420034195a9c00041151086040d020c140b200241e0036a200241f0046a41086a4190011084041a02400240200241e0036a41086a410020022903e0034201511b2201450d002001450d00410321002001200310a2010d01200110a101210441012100200141206a29030022052004540d01410c10222206450d0b412010222200450d0c20002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c00010212200450d0d20002005370020200642c080808080053702042006200036020041042107410021080240200420055a0d00410c10222207450d10412010222200450d1120002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c00010212201450d1220012005427f7c370020200742c0808080800537020420072001360200410121080b20024190046a10930120024100360290062002420137038806410110222201450d0e20024188066a41086a22002000280200220941016a3602002002410136028c062002200136028806200120096a41013a0000200228028c062209200028020022016b41084f0d05200141086a22002001490d1d20094101742201200020002001491b22014100480d1d2009450d0620022802880620092001102122000d070c120b4176416c20011b21000b20024190046a10930120024100360290062002420137038806410121014101102222030d140c1c0b41002100200341b4c0c000460d0141002101200341b4c0c000411a108604450d120b4100210141810121000c110b410021010c100b20022802880621000c020b200110222200450d0b0b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2209200141086a360200200020016a2003ad370000200220083602f801200241f8016a20024188066a103e02402008450d0020072008410c6c6a210b2007210303402003280200210c2002200341086a28020022013602f801200241f8016a20024188066a103e0240024002400240200228028c06220a200928020022006b20014f0d00200020016a220d2000490d1a200a4101742200200d200d2000491b22004100480d1a200a450d01200228028806200a20001021220a0d020c070b200228028806210a0c020b20001022220a450d050b2002200036028c062002200a36028806200928020021000b2009200020016a360200200a20006a200c20011084041a2003410c6a2203200b470d000b0b200241013602f801200241f8016a20024188066a103e2006280200210a2002200628020822013602f801200241f8016a20024188066a103e0240024002400240200228028c062203200928020022006b20014f0d00200020016a22092000490d1820034101742200200920092000491b22004100480d182003450d0120022802880620032000102122030d020c0e0b20022802880621030c020b200010222203450d0c0b2002200036028c06200220033602880620024190066a28020021000b20024188066a41086a2209200020016a360200200320006a200a20011084041a0240024002400240200228028c062200200928020022016b41084f0d00200141086a22032001490d1820004101742201200320032001491b22014100480d182000450d0120022802880620002001102122000d020c0f0b20022802880621000c020b200110222200450d0d0b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2203200141086a360200200020016a427f37000020032802002101200228028806210041000d1c02402008450d002008410c6c21092007210303400240200341046a280200450d00200328020010200b2003410c6a2103200941746a22090d000b2008450d00200710200b0240200641046a280200450d00200628020010200b200610200c1c0b2002418c026a410136020020024103360214200241a0c3c100360210200242013702fc01200241b8c1c1003602f8012002200241106a36028802200241f8016a41c0c1c1001048000b200041011023000b410c41041023000b412041011023000b41c00041011023000b410141011023000b410c41041023000b412041011023000b41c00041011023000b200141011023000b200041011023000b200141011023000b2002410036029006200242013703880620010d0141012101410110222203450d080b2002200136028c0620024190066a22092009280200220a20016a36020020022003360288062003200a6a41003a00000240200228028c0620092802002201470d00200141016a22032001490d0720014101742209200320032009491b22094100480d072001450d022002280288062001200910212203450d030c0c0b20022802880621030c0c0b410110222201450d072002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41023a0000200228028c0620032802002201470d02200141016a22032001490d0520014101742209200320032009491b22094100480d052001450d032002280288062001200910212203450d040c080b2009102222030d090b200941011023000b20022802880621030c060b2009102222030d040b200941011023000b1024000b200120011023000b410141011023000b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000c020b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000b20024190066a280200210120022802880621000b200241f0076a24002001ad4220862000ad840b6101017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002410336021c200241bcc3c10036021820024201370204200241b8c1c1003602002002200241186a360210200241c0c1c1001048000b890c07027f017e057f017e027f037e037f230041306b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c200241106a200241086a10580240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101460d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2109200141a0016a2200210120092d00004102470d050c010b034020062001460d0720012d00002109200141286a2200210120094102470d000b0b200041606a22082802004101460d020c040b200141d0006a2100200141306a22082802004101460d010c030b200141f8006a2100200141d8006a22082802004101470d020b200021010c000b0b200828020421012008290310210a4108210b410021094100210c0240200828020c220641286c22004128490d0020004100480d032006ad42287e422088a74100470d0320001022220b450d092006210c0b2001200120006a460d01200641286c210641002109200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200941016a2109200141286a2101200641586a22060d000c020b0b4100210b0b20024100360218200242013703104101102221060240024002400240200b450d002006450d08200242818080801037021420022006360210200641013a000020022009360228200241286a200241106a103e200241106a41086a221028020021002002280214210602402009450d00200b200941286c6a2111200b210103400240024002400240200620006b41204f0d00200041206a22092000490d0a20064101742208200920092008491b22124100480d0a2006450d01200228021020062012102122080d020c0b0b200041206a2109200228021021080c020b201210222208450d090b2002201236021420022008360210201221060b20102009360200200820006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a29030021040240024002400240200620096b41084f0d00200941086a22002009490d0a20064101742212200020002012491b22124100480d0a2006450d01200820062012102122080d020c0c0b200941086a21000c020b201210222208450d0a0b2002201236021420022008360210201221060b20102000360200200820096a20043700002011200141286a2201470d000b0b200620006b41084f0d01200041086a22012000490d0420064101742209200120012009491b22014100480d042006450d0220022802102006200110212206450d030c0b0b2006450d08200242818080801037021420022006360210200641003a0000428080808010210420050d0c0c0d0b200228021021060c0a0b2001102222060d080b200141011023000b1024000b201241011023000b201241011023000b200241246a41013602002002410336022c200241d4c3c10036022820024201370214200241b8c1c1003602102002200241286a360220200241106a41c0c1c1001048000b410141011023000b410141011023000b200041081023000b20022001360214200220063602100b200241106a41086a200041086a2201360200200620006a200a3700002001ad42208621040240200b450d00200c450d00200b10200b2005450d010b200541286c2100200321010340024020012d00002209450d00024020094101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b02402007450d00200310200b200241306a240020042006ad840bbc0c07027f017e047f027e027f037e047f230041306b22022400024002402001450d00200220003602080c010b200241c8d7c4003602080b2002200136020c200241106a200241086a105802400240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101470d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2108200141a0016a2200210120082d00004102470d050c010b034020062001460d0720012d00002108200141286a2200210120084102470d000b0b200041606a22082802004101470d020c040b200141d0006a2100200141306a22082802004101470d010c030b200141f8006a2100200141d8006a22082802004101460d020b200021010c000b0b20082802042101200829031821092008290310210a4108210b410021064100210c0240200828020c220841286c22004128490d0020004100480d032008ad42287e422088a74100470d0320001022220b450d0a2008210c0b2001200120006a460d01200841286c210841002106200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200641016a2106200141286a2101200841586a22080d000c020b0b4100210b0b20024100360218200242013703100240024002400240200b450d00410110222201450d08200242818080801037021420022001360210200141013a000020014101410910212201450d09200242898080809001370214200220013602102001200a37000120022006360228200241286a200241106a103e200241106a41086a221028020021112002280214210802402006450d00200b200641286c6a2112200b210103400240024002400240200820116b41204f0d00201141206a22002011490d0a20084101742206200020002006491b22134100480d0a2008450d01200228021020082013102122060d020c0b0b201141206a2100200228021021060c020b201310222206450d090b2002201336021420022006360210201321080b20102000360200200620116a221141186a200141186a290000370000201141106a200141106a290000370000201141086a200141086a29000037000020112001290000370000200141206a29030021040240200820006b41074b0d00200041086a22112000490d0720084101742213201120112013491b22114100480d07024002402008450d00200620082011102122060d010c0b0b201110222206450d0a0b2002201136021420022006360210201121080b2010200041086a2211360200200620006a20043700002012200141286a2201470d000b0b200820116b41084f0d01201141086a22012011490d0420084101742200200120012000491b22014100480d042008450d0220022802102008200110212206450d030c0c0b410110222206450d09200242818080801037021420022006360210200641003a0000428080808010210420050d0d0c0e0b200228021021060c0b0b2001102222060d090b200141011023000b1024000b201341011023000b201141011023000b200241246a41013602002002410336022c200241f4c3c10036022820024201370214200241b8c1c1003602102002200241286a360220200241106a41c0c1c1001048000b410141011023000b410941011023000b410141011023000b200041081023000b20022001360214200220063602100b200241106a41086a201141086a2201360200200620116a20093700002001ad42208621040240200b450d00200c450d00200b10200b2005450d010b200541286c2100200321010340024020012d00002208450d00024020084101470d00200141086a280200450d01200141046a2802001020200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a28020010200b200141286a2101200041586a22000d000b0b02402007450d00200310200b200241306a240020042006ad840bd105020a7f017e230041206b220224000240024002400240410e10222203450d0041002104200341066a410029009893423700002003410029009293423700002003410e411c10212203450d01200341106a41002d00a293423a0000200341002f00a093423b000e024002402003411141c8d7c400410041001001417f460d002002410036021020034111200241106a41044100100141016a41044d0d01200228021021040b200310202002200410d40220024100360218200242013703102002280200210520022002280208220336021c2002411c6a200241106a103e02400240024002402003450d002005200341286c6a2106200241106a41086a22072802002104200228021421082005210303400240024002400240200820046b41204f0d00200441206a22092004490d062008410174220a20092009200a491b220b4100480d062008450d0120022802102008200b1021220a0d020c070b200441206a21092002280210210a0c020b200b1022220a450d050b2002200b3602142002200a360210200b21080b20072009360200200a20046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a290300210c0240024002400240200820096b41084f0d00200941086a22042009490d062008410174220b20042004200b491b220b4100480d062008450d01200a2008200b1021220a0d020c080b200941086a21040c020b200b1022220a450d060b2002200b3602142002200a360210200b21080b20072004360200200a20096a200c3700002006200341286a2203470d000b2002280204450d080c070b200241186a28020021042002280210210a20022802040d060c070b1024000b200b41011023000b200b41011023000b419a88c00041331039000b410e41011023000b411c41011023000b200510200b200241206a24002004ad422086200aad840bc70403017f017e0a7f230041c0006b2202240002400240024002400240024002402001450d002001ad42287e2203422088a70d052003a722044100480d05200410222205450d06200241206a41186a2106200241206a41106a2107200241206a41086a210820052104410021090340410e1022220a450d04200a41066a41002900989342370000200a41002900929342370000200a410e411c1021220a450d05200a200936000e02400240200a411241c8d7c400410041001001417f460d0020064200370300200742003703002008420037030020024200370320200a4112200241206a412041001001220b417f460d05200b4120490d05200241186a220b2006290300370300200241106a220c2007290300370300200241086a220d20082903003703002002200229032037030020024200370320200a4112200241206a41084120100141016a41084d0d05200229032021032006200b2903003703002007200c2903003703002008200d290300370300200220022903003703200c010b42002103200642003703002007420037030020084200370300200242003703200b200a1020200441186a2006290300370300200441106a2007290300370300200441086a200829030037030020042002290320370300200441206a2003370300200441286a21042001200941016a2209470d000b200121040c010b41002104410821050b200020043602082000200136020420002005360200200241c0006a24000f0b419a88c00041331039000b410e41011023000b411c41011023000b1024000b200441081023000be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041fc95c2004117200241106a1002200241086a20032903003703002002200229031037030002400240024002402002411041c8d7c400410041001001417f460d002002420037031020024110200241106a41084100100141016a41084d0d022002290310210441082105410810222203450d010c030b42032104410821054108102222030d020b200541011023000b419a88c00041331039000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b8b0301097f230041206b220224002002109d0120024100360218200242013703102002280200210320022002280208220436021c2002411c6a200241106a103e024002400240024002402004450d0020044105742105200241106a41086a280200210620022802102107200228021421082003210403400240024002400240200820066b41204f0d00200641206a22092006490d062008410174220a20092009200a491b220a4100480d062008450d0120072008200a102122070d020c070b200641206a21090c020b200a10222207450d050b200a21080b200720066a22062004290000370000200641186a200441186a290000370000200641106a200441106a290000370000200641086a200441086a29000037000020092106200441206a2104200541606a22050d000b200241186a200936020020022008360214200220073602102002280204450d040c030b200241186a28020021092002280210210720022802040d020c030b1024000b200a41011023000b200310200b200241206a24002009ad4220862007ad840b8d0202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641077522074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4207862209422088a70d032009a722084100480d032002450d0120002802002002410774200810212202450d020c040b200028020021020c040b2008102222020d020b200841081023000b1024000b20002002360200200041046a2003360200200041086a28020021030b200220034107746a200520061084041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010200b0b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641d8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42d8007e2209422088a70d032009a722084100480d032002450d012000280200200241d8006c200810212202450d020c040b200028020021020c040b2008102222020d020b200841081023000b1024000b20002002360200200041046a2003360200200041086a28020021030b2002200341d8006c6a200520061084041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010200b0bb80a010b7f230041f0016b22022400200220011038024020022802002203450d00200241086a28020021042002280204210541002106200241003a00d00120012802002001280204200241d0016a410120012802081001210720012001280208200741016a41014b22076a220836020802402007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220641002001280200200141046a280200200241d0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d01200241b0016a41186a22072009290300370300200241b0016a41106a2206200a290300370300200241b0016a41086a2209200b290300370300200220022903d0013703b00120024190016a41186a220a200729030037030020024190016a41106a2207200629030037030020024190016a41086a22062009290300370300200220022903b00137039001200241f0006a41186a200a290300370300200241f0006a41106a2007290300370300200241f0006a41086a20062903003703002002200229039001370370410121060b200241d0006a41186a200241f0006a41186a290300370300200241d0006a41106a200241f0006a41106a290300370300200241d0006a41086a200241f0006a41086a2903003703002002200229037037035041002109200241003a00d0012001280200200141046a280200200241d0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220741002001280200200141046a280200200241d0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d01200241b0016a41186a22012009290300370300200241b0016a41106a2207200a290300370300200241b0016a41086a2208200b290300370300200220022903d0013703b00120024190016a41186a2209200129030037030020024190016a41106a2201200729030037030020024190016a41086a22072008290300370300200220022903b00137039001200241f0006a41186a2009290300370300200241f0006a41106a2001290300370300200241f0006a41086a20072903003703002002200229039001370370410121090b200241106a41186a2201200241f0006a41186a290300370300200241106a41106a2207200241f0006a41106a290300370300200241106a41086a2208200241f0006a41086a29030037030020022002290370370310200241306a41186a220a200241d0006a41186a290300370300200241306a41106a220b200241d0006a41106a290300370300200241306a41086a220c200241d0006a41086a29030037030020022002290350370330200020063a000c2000200436020820002005360204200020033602002000412d6a20093a00002000200229033037000d200041156a200c2903003700002000411d6a200b290300370000200041256a200a2903003700002000412e6a2002290310370000200041366a20082903003700002000413e6a2007290300370000200041c6006a2001290300370000200241f0016a24000f0b200041023a000c02402005450d00200310200b200241f0016a24000f0b200041023a000c200241f0016a24000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a102122060d020c070b200541106a21090c020b200a10222206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a102122060d020c080b200941206a21050c020b200a10222206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510032000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100320030d030c040b1024000b200a41011023000b200a41011023000b200610200b200241106a24000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002103e0240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009102122080d020c070b200041206a2107200228020021080c020b200910222208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009102122080d020c080b200741086a21000c020b200910222208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1024000b200941011023000b200941011023000b200810200b200241106a24000bcf0506027f017e0b7f017e027f017e230041d0006b22022400200241086a2001108e010240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d01200510222206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b1031000b200541081023000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001001220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1001220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f102122060d010c060b200f10222206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d00200610200b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b1024000b200f41081023000b13002000410a360204200041f8cac1003602000ba70301047f230041c0006b2202240002400240411610222203450d002003410e6a41002900d3c941370000200341086a41002900cdc941370000200341002900c5c94137000020034116413610212203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041c8d7c400410041001001417f460d002002410036022020024120200241206a41044100100141016a4105490d02200228022021012002410036022020024120200241206a41044104100141016a4105490d02200041086a200228022036020020002001360204200041013602000c010b200041003602000b20031020200241c0006a24000f0b419a88c00041331039000b411641011023000b413641011023000b130020004107360204200041b7e0c1003602000b130020004114360204200041c0e0c1003602000b7801047f230041106b2202240020024100360208200242013703000240410110222203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b410141011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241003600000f0b410441011023000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242053700000f0b410841011023000b3301017f0240410810222202450d0020004288808080800137020420002002360200200242e8073700000f0b410841011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241013600000f0b410441011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241023600000f0b410441011023000b3901017f0240411010222202450d002002420037000820024201370000200042908080808002370204200020023602000f0b411041011023000b3901017f0240411010222202450d002002420037000820024209370000200042908080808002370204200020023602000f0b411041011023000b981705067f017e047f017e047f230041e0006b22042400200441c0006a41086a2205420037030020044200370340419084c2004112200441c0006a1002200441206a41086a200529030037030020042004290340370320410021060240024002400240024002400240200441206a411041c8d7c400410041001001417f460d00200442103702142004200441206a360210200441c0006a200441106a103820042802402207450d02200441c8006a2802002106200428024421080c010b41012107410021080b200441c0006a41086a220542003703002004420037034041e082c2004114200441c0006a1002200441206a41086a22092005290300370300200420042903403703200240200441206a411041c8d7c400410041001001417f460d00419b8ec2002105412e21062008450d040c030b200542003703002004420037034041b884c2004111200441c0006a10022009200529030037030020042004290340370320024002400240200441206a411041c8d7c400410041001001417f460d0020044100360240200441206a4110200441c0006a41044100100141016a41044d0d0220042802402003470d010c040b41002003460d030b41c98ec20021054114210620080d030c040b419a88c00041331039000b419a88c00041331039000b024002402006450d002006200241086a28020022094f0d01419e8fc200210541c500210620080d020c030b41dd8ec200210541c100210620080d010c020b0240024002400240024002400240024002400240024002400240411410222205450d00200541106a41002800a38742360000200541086a410029009b874237000020054100290093874237000020054114413410212205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a2900003700004200210a200441c0006a41186a22064200370300200441c0006a41106a220b4200370300200441c0006a41086a220c42003703002004420037034020054134200441c0006a1000200441206a41186a2006290300370300200441206a41106a200b290300370300200441206a41086a200c29030037030020042004290340370320200441206a412041c8d7c4004100410010012106200510202006417f470d05200441c0006a41086a220542003703002004420037034041f388c2004112200441c0006a1002200441206a41086a20052903003703002004200429034037032002400240200441206a411041c8d7c400410041001001417f460d002004420037034820044200370340200441206a4110200441c0006a4110410010012205417f460d042005410f4d0d04200441c8006a290300210f2004290340210a0c010b4200210f0b200441086a2001200a200f10b001024020042802082205450d00200428020c210620080d0e0c0f0b200441c0006a41086a220642003703002004420037034041b483c200410e200441c0006a1002200441206a41086a20062903003703002004200429034037032041002105024002400240200441206a411041c8d7c400410041001001417f460d00200442103702142004200441206a360210200441c0006a200441106a103820042802402210450d06200441c0006a41086a2206280200210b20042802442105200441c0006a41186a200141186a290000370300200441c0006a41106a200141106a2900003703002006200141086a29000037030020042001290000370340200441c0006a210620052111200b2005460d010c020b200441c0006a41186a200141186a290000370300200441c0006a41106a200141106a2900003703002006200141086a2900003703002004200129000037034041012110200441c0006a21060b200541016a220b2005490d092005410174220c200b200b200c491b2211ad420586220a422088a70d09200aa7220c4100480d0902402005450d002005210b20102005410574200c102122100d010c060b2005210b200c10222210450d050b2010200b410574220c6a22052006290000370000200541186a200641186a290000370000200541106a200641106a290000370000200541086a200641086a290000370000200441c0006a41086a220542003703002004420037034041b483c200410e200441c0006a1002200441206a41086a20052903003703002004200429034037032020044100360248200442013703402004200b41016a2206360210200441106a200441c0006a103e0240024002402006450d00200c41206a210d4100200528020022066b210c200428024021122004280244210e2010210503400240200e200c6a411f4b0d00200641206a220b2006490d0d200e4101742213200b200b2013491b220b4100480d0d02400240200e450d002012200e200b102122120d010c060b200b10222212450d050b200b210e0b201220066a220b2005290000370000200b41186a200541186a290000370000200b41106a200541106a290000370000200b41086a200541086a290000370000200c41606a210c200641206a2106200541206a2105200d41606a220d0d000b200441c8006a20063602002004200e360244200420123602400c010b200528020021062004280244210e200428024021120b200441206a41102012200610030240200e450d00201210200b2011450d0620101020411421064114102222050d070c080b200b41011023000b411441011023000b413441011023000b419a88c00041331039000b419a88c00041331039000b200c41011023000b41142106411410222205450d010b200541106a41002800a38742360000200541086a410029009b874237000020054100290093874237000020052006413410212205450d03200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441c0006a41186a22064200370300200441c0006a41106a220b4200370300200441c0006a41086a220c42003703002004420037034020054134200441c0006a1000200441206a41186a2006290300370300200441206a41106a200b290300370300200441206a41086a200c2903003703002004200429034037032020042003360240200441206a4120200441c0006a41041003200510202002280204210d2002280200210e411310222202450d042002410f6a41002800978e42360000200241086a41002900908e42370000200241002900888e423700002002411341331021220c450d05200c2001290000370013200c412b6a200141186a290000370000200c41236a200141106a290000370000200c411b6a200141086a290000370000200441c0006a41186a22024200370300200441c0006a41106a22054200370300200441c0006a41086a2206420037030020044200370340200c4133200441c0006a1000200441206a41186a2002290300370300200441206a41106a2005290300370300200441206a41086a200629030037030020042004290340370320200441003602482004420137034020042009360210200441106a200441c0006a103e024002402009450d00200441c8006a220b280200210220042802442105200e21060340024002400240024020022005470d00200541016a22012005490d0820054101742203200120012003491b22034100480d082005450d01200428024020052003102122010d020c090b200428024021010c020b200310222201450d070b2004200336024420042001360240200321050b200b200241016a2203360200200120026a20062d00003a000020032102200641016a21062009417f6a22090d000c020b0b200441c8006a280200210320042802442105200428024021010b200441206a412020012003100302402005450d00200110200b200c10200240200d450d00200e10200b4100210502402008450d00200710200b0c080b200641011023000b1024000b200341011023000b413441011023000b411341011023000b413341011023000b200710200b200241046a280200450d00200228020010200b2000200636020420002005360200200441e0006a24000bee0803057f037e037f230041d0006b22032400024002400240024002402002280208220420014d0d0020022802002105200241086a2004417f6a2206360200200520064105746a22072900002108200729000821092007290010210a200520014105746a220141186a200741186a2900003700002001200a37001020012009370008200120083700002002280204210b200341306a41086a220242003703002003420037033041b483c200410e200341306a1002200341086a41086a20022903003703002003200329033037030820034100360238200342013703302003200636022c2003412c6a200341306a103e02400240024002402006450d00200441057441606a2104200228020021062003280230210c200328023421012005210203400240024002400240200120066b41204f0d00200641206a22072006490d072001410174220d20072007200d491b220d4100480d072001450d01200c2001200d1021220c0d020c080b200641206a21070c020b200d1022220c450d060b200d21010b200c20066a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020072106200241206a2102200441606a22040d000b200341386a2007360200200320013602342003200c3602300c010b20022802002107200328023421012003280230210c0b200341086a4110200c2007100302402001450d00200c10200b0240200b450d00200510200b411310222202450d032002410f6a41002800978e42360000200241086a41002900908e42370000200241002900888e4237000020024113413310212202450d04200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a290000370000200341306a41186a22064200370300200341306a41106a22074200370300200341306a41086a220142003703002003420037033020024133200341306a1000200341086a41186a2006290300370300200341086a41106a2007290300370300200341086a41086a200129030037030020032003290330370308200341086a4120100920021020411410222202450d05200241106a41002800a38742360000200241086a410029009b874237000020024100290093874237000020024114413410212202450d06200220002900003700142002412c6a200041186a290000370000200241246a200041106a2900003700002002411c6a200041086a290000370000200341306a41186a22064200370300200341306a41106a22074200370300200341306a41086a220142003703002003420037033020024134200341306a1000200341086a41186a2006290300370300200341086a41106a2007290300370300200341086a41086a200129030037030020032003290330370308200341086a4120100920021020200341d0006a24000f0b1024000b200d41011023000b418084c2002001200410b501000b411341011023000b413341011023000b411441011023000b413441011023000b860301047f230041d0006b22022400024002400240411310222203450d002003410f6a41002800978e42360000200341086a41002900908e42370000200341002900888e4237000020034113413310212203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034133200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041c8d7c400410041001001417f460d002002422037022420022002360220200241306a200241206a108f0120022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031020200241d0006a24000f0b411341011023000b413341011023000b419a88c00041331039000bee0202017e057f024002400240024002402001450d00200141074b0d01200141016a21010c020b200041106a4200370200200041086a4280808080c000370200200041046a41e48fc200360200200041003a00000f0b2001ad4203862202422088a70d022002a7220341076e210142808080801021022003410e490d010b417f2001417f6a677641016aad42208621020b024002402002423d88a70d002002422088a7220141076a417c712203200141046a2204490d0020032002421d88a76a22052003490d002005417d4f0d00200510222206450d012001417f6a22052002422388a741076c20054108491b2107200641ff012004108304220420036a21030240200141034b0d00200420016a418001410420016b1083041a0b200041146a2007360200200041106a41003602002000410c6a2003360200200041086a2005360200200041046a2004360200200041003a00000f0b41e88fc200102f000b200541041023000b41e88fc200102f000baf0f03287f017e137f230041206b220124000240024002400240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b0240200320044101764f0d00200241016a2105410421064103210741fffefdfb07210841072109417f210a4181828408210b4100210c41004101710d020c030b200141086a200310ec0220012d00084101460d062001411c6a280200210d200141086a410c6a280200210e200141106a280200210f200128020c2110417f21114180818284782112410421134101211420002802002215200041046a2802006a41016a21162000410c6a28020021172000280208211841202119417c211a4138211b4105211c41b9f3ddf179211d4103211e4102211f417e212041ff01212141002122411921232015280200417f734180818284787122240d040c030b41e88fc200102f000b410121020c030b410021020c020b410321020c010b410421020b0240024002400340024002400240024002400240024002400240024002400240024020020e050100090304040b200c20076a2202200c4922030d04200220054f0d042005200c20066a20031b200520022005491b210c0c010b200c20054f0d03200c2102200c41016a210c0b200028020020026a220220022802002202200976200a73200b7120022008726a3602004101410171450d09410121020c0a0b201520136a21020340200220164f0d03201820196a211820022802002103200220136a22042102200320127122032012460d000b200320127321242004201a6a2115410421020c090b2018202468201b716a22262802002127410021030240202628020422282013490d00410021032027210220282104034020022800002003201c7773201d6c2103200220136a21022004201a6a2204201e4b0d000b2028201a6a22022002201a7122026b2128202720026a20136a21270b024002400240202820144d0d002027201f6a21022003201c7720272f000073201d6c2103202820206a0d010c020b202721022028450d010b2003201c7720022d000073201d6c21030b202420116a2127410021022003201c77202173201d6c222521030340200220136a22022003200f7122046a2103201020046a2800002012712228450d000b02402010202868201e7620046a200f7122026a2c00002022480d00201028020020127168201e7621020b201020026a202520237622033a000020102002201a6a200f716a20136a20033a0000200e2002201e746a2026290200370200202720247122240d05410321020c080b20002802002102200041046a220428020041016a220341034b0d01200241046a200220031085041a2000280200200428020022026a41016a418001410320026b1083041a0c020b2000200d20176b3602102000410c6a2017360200200041086a200e3602002000280200210320002010360200200041046a220228020021132002200f3602002013450d0a0240201341016aad4203862229422088a70d00201341086a417c712202201341056a490d0020022029a76a22132002490d002013417c4b0d00200120023602102001410436020c200120133602080b200310200c0a0b200220036a20022800003600000b4104212a4101212b200041046a222c28020041016a222d450d054100212e418001212f41032130200041086a21314105213241b9f3ddf1792133417c213441022135417e213641ff0121374180818284782138411921394100213a410221020c040b203a2225202b6a213a0240024002400240202520002802006a2d0000202f460d00203a202d470d050c010b02400340203128020020252030746a223b2802002127410021030240203b2802042228202a490d004100210320272102202821040340200228000020032032777320336c21032002202a6a2102200420346a220420304b0d000b202820346a2202200220347122026b2128202720026a202a6a21270b0240024002402028202b4d0d00202720356a2102200320327720272f00007320336c2103202820366a0d010c020b202721022028450d010b200320327720022d00007320336c21030b202c28020021282000280200212741002102200320327720377320336c223c210303402002202a6a2202200320287122046a2103202720046a2800002038712226450d000b0240202720266820307620046a20287122026a2c0000202e480d0020272802002038716820307621020b02402002203c20287122036b202520036b7320287120304d0d00202720026a22032d000021042003203c20397622263a00002027200220346a2028716a202a6a20263a000020042037460d02203128020020022030746a220229020021292002203b290200370200203b20293702000c010b0b202720256a203c20397622023a000020272028202520346a716a202a6a20023a0000203a202d470d030c010b2000280200220320256a20373a00002003202c280200202520346a716a202a6a20373a0000203128020020022030746a203b290200370200203a202d470d010b200041046a280200221341084f0d070c080b410221020c040b410221020c030b410421020c020b410221020c010b410021020c000b0b417f21130b2013202b6a41037641076c21130b200020132000410c6a2802006b360210200141206a24000f0b200141206a24000b130020004101360204200041c897c2003602000b13002000410f360204200041ff98c2003602000b1300200041023602042000419099c2003602000beb1b09017f027e037f017e017f077e027f037e047f230041a0036b22032400200341a8026a200010c70102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020032d00a802417f6a41ff017141014d0d0020034188016a41086a200341e4026a29020037030020034188016a41106a200341ec026a29020037030020034188016a41186a200341f4026a2902003703002003200341dc026a29020037038801200341a8026a41186a2903002104200341a8026a41106a2903002105200341d8026a2802002106200341d4026a2802002107200341d0026a2802002108200341c8026a2903002109200341a8026a41086a220a290300210b200a4200370300200342003703a80241cdc8c000410d200341a8026a100220034180036a41086a200a290300370300200320032903a802370380034200210c024020034180036a411041c8d7c400410041001001417f460d00200342003703a80220034180036a4110200341a8026a41084100100141016a41084d0d0420032903a802210c0b024042004200200c20017d22012001200c561b220120097d220920092001561b220d500d00200341f8006a200010c401200341f8006a41086a29030021012003290378210e42002109200341a8026a41086a220a4200370300200342003703a8024195e4c200411a200341a8026a100220034180036a41086a200a290300370300200320032903a802370380030240024020034180036a411041c8d7c400410041001001417f460d00200342003703b002200342003703a80220034180036a4110200341a8026a411041001001220a417f460d07200a410f4d0d07024020032903a8022209200341a8026a41086a290300220f84500d00200341e8006a200e20012009200f108704200341e8006a41086a2903002110200329036821090c020b420021090b420021100b200341a8026a41086a220a4200370300200342003703a80241e8e3c2004114200341a8026a100220034180036a41086a200a290300370300200320032903a802370380030240024020034180036a411041c8d7c400410041001001417f460d00200342003703b002200342003703a80220034180036a4110200341a8026a411041001001220a417f460d08200a410f4d0d08200341b0026a290300210f20032903a80221110c010b420021114200210f0b200341386a4200420020107d200b200954ad7d2210200b20097d2209200b5620104200522010501b220a1b2210420020114200108804200341c8006a200f420042002009200a1b22094200108804200341d8006a2009420020114200108804427f20032903582010420052200f42005271200329034042005272200329035042005272200341d8006a41086a2903002209200329033820032903487c7c221120095472220a1b220f427f2011200a1b2211844200510d0042002109200341a8026a41086a220a4200370300200342003703a80241a5eec000411b200341a8026a100220034180036a41086a2212200a290300370300200320032903a8023703800320034180036a411041c8d7c400410041001001417f460d02200342003703b002200342003703a80220034180036a4110200341a8026a4110410010012213417f460d072013410f4d0d07200341b0026a290300211420032903a80221150c030b2007450d00200810200b4100210a0c190b42002115420021140b200a4200370300200342003703a80241fce3c2004119200341a8026a10022012200a290300370300200320032903a802370380030240024020034180036a411041c8d7c400410041001001417f460d00200342003703b002200342003703a80220034180036a4110200341a8026a411041001001220a417f460d06200a410f4d0d06200341b0026a290300211620032903a80221090c010b420021160b200341106a20114200200d4200108804200341206a200f4200200d4200108804200342004200200f4200108804200341306a200041084200200e2005427f20032903202003290318200329030884420052200341206a41086a290300220f200329031020032903007c7c2211200f5472220a1b22102010200556427f2011200a1b220f200456200f2004511b220a1b22117d22052005200e5620012004200f200a1b7d200e201154ad7d220420015620042001511b22121b22054200200420121b220410ae01201620147c200920157c2211200954ad7c21090240200328023022120d00200a0d002005201154200420095420042009511b0d004102210a2002450d16200341a8026a20002010200f410810aa0220032802a8024101460d072003200341b8026a290300220b3703b0012003200341a8026a41086a29030022013703a801200341a8026a200010c70120032d00a8022202410246220a0d064100200341a8026a200a1b220a2d00000d06200a200c370320200a200a290310220c20017d370310200a41186a220a200a290300200b7d200c200154ad7d37030041171022220a450d08200a410f6a41002900cfe342370000200a41086a41002900c8e342370000200a41002900c0e342370000200a411741371021220a450d09200a2000290000370017200a412f6a200041186a290000370000200a41276a200041106a290000370000200a411f6a200041086a29000037000020034188026a41186a2200420037030020034188026a41106a2206420037030020034188026a41086a221242003703002003420037038802200a413720034188026a100020034180036a41186a200029030037030020034180036a41106a200629030037030020034180036a41086a20122903003703002003200329038802370380032003412036028c02200320034180036a36028802200341a8026a20034188026a10f202200a1020024020020d00200341d4026a280200450d00200341d0026a28020010200b200341a8016a10ce014102210a20070d170c180b0240024020120d00200520115a200420095a20042009511b450d00200341a8026a20002010200f410810aa024101210a20032802a8024101460d0b2003200341b8026a2903003703c0012003200341a8026a41086a2903003703b801200341b8016a10ce01200e201154200120095420012009511b450d010c170b024002400240200e201154200120095420012009511b450d00200341e8016a20004200420010cb01200341f0016a210020032903e8014200510d01200010ce014101210a20070d1a0c1b0b200341c8016a20002011200910cb01200341d0016a210a20032903c8014200510d01200a10ce010c020b200010cf014101210a20070d180c190b200a10cf010b200341003602a80220082006200341a8026a1017211720032802a8022113200341a8026a41186a20034188016a41186a290300370300200341a8026a41106a20034188016a41106a290300370300200341a8026a41086a20034188016a41086a29030037030020032003290388013703a80220034100360288032003420137038003200320133602880220034188026a20034180036a103e0240024002402003280284032218200328028803220a6b20134f0d00200a20136a2202200a490d1520184101742212200220022012491b22024100480d152018450d012003280280032018200210212219450d020c0d0b2003280280032219200a6a201720131084041a200a20136a220a450d0d0c0e0b2002102222190d0b0b200241011023000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b41b3e2c20041351039000b41a19bc20041f10020032802ac02200341a8026a41086a280200109c02000b411741011023000b413741011023000b41929cc200412b20032802ac02200341a8026a41086a280200109c02000b20032002360284032003201936028003200221182019200a6a201720131084041a200a20136a220a0d010b410021024101211241012019200a1084041a20180d010c020b200a4100480d05200a2102200a10222212450d0220122019200a1084041a2018450d010b201910200b2002200a6b41074b0d02200a41086a2218200a490d0320024101742219201820182019491b22184100480d03024002402002450d0020122002201810212212450d010c030b2018102222120d020b201841011023000b200a41011023000b201821020b2012200a6a200b3700000240024002402002200a41086a22186b41204f0d00201841206a22192018490d032002410174220a20192019200a491b220a4100480d032002450d0120122002200a10212212450d020c040b200a41286a21190c040b200a102222120d020b200a41011023000b1024000b200a21020b201220186a220a20032903a802370000200a41186a200341a8026a41186a290300370000200a41106a200341a8026a41106a290300370000200a41086a200341a8026a41086a29030037000020034188026a41186a220a420037030020034188026a41106a2218420037030020034188026a41086a221a420037030020034200370388022012201920034188026a100020034180036a41186a200a29030037030020034180036a41106a201829030037030020034180036a41086a201a29030037030020032003290388023703800302402002450d00201210200b02402013450d00201710200b200341c1026a20034198036a290300370000200341b9026a20034190036a290300370000200341b1026a20034188036a2903003700004101210a200341013a00a80220032003290380033700a9022000200341a8026a10cd012008200610150b2007450d010b20081020200341a0036a2400200a0f0b200341a0036a2400200a0b9d0902077f027e230041106b2202240020024100360208200242013703000240024002400240024002400240024002400240024020002d00004101470d00410110222203450d01200242818080801037020420022003360200200341013a000020034101412110212203450d02200242a180808090043702042002200336020020032000290001370001200341096a200041096a290000370000200341116a200041116a290000370000200341196a200041196a2900003700002001280200200128020420034121100341000d0a0c090b410110222203450d02200242818080801037020420022003360200200341003a0000200041286a28020021042002200041306a280200220536020c2002410c6a2002103e02400240024020022802042203200241086a28020022066b20054f0d00200620056a22072006490d0820034101742208200720072008491b22074100480d082003450d0120022802002003200710212203450d020c060b200228020021030c060b2007102222030d040b200741011023000b410141011023000b412141011023000b410141011023000b20022007360204200220033602000b200241086a2207200620056a360200200320066a200420051084041a200041086a29030021090240024002400240024020022802042204200728020022056b41084f0d00200541086a22062005490d0520044101742207200620062007491b22074100480d052004450d0120032004200710212203450d020c030b200541086a21060c030b2007102222030d010b200741011023000b20022007360204200220033602000b200241086a22042006360200200320056a20093700000240024002400240024020022802042205200428020022066b41204f0d00200641206a22042006490d0520054101742207200420042007491b22074100480d052005450d0120032005200710212203450d020c030b200641206a21040c030b2007102222030d010b200741011023000b2002200736020420022003360200200721050b200241086a2004360200200320066a220641186a200041346a220741186a290000370000200641106a200741106a290000370000200641086a200741086a29000037000020062007290000370000200041186a2903002109200041106a290300210a02400240024002400240200520046b41104f0d00200441106a22062004490d0520054101742207200620062007491b22074100480d052005450d0120032005200710212203450d020c030b200441106a21060c030b2007102222030d010b200741011023000b2002200736020420022003360200200721050b200320046a220420093700082004200a370000200241086a22042006360200200041206a2903002109200520066b41074b0d02200641086a22002006490d0020054101742207200020002007491b22004100480d00024002402005450d0020032005200010212203450d010c030b2000102222030d020b200041011023000b1024000b20022000360204200220033602000b2004200641086a360200200320066a2009370000200228020421002001280200200128020420022802002203200428020010032000450d010b200310200b200241106a24000b130020004101360204200041c09cc2003602000b13002000410936020420004198a0c2003602000b130020004104360204200041a4a0c2003602000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242033700000f0b410841011023000bca0c040c7f027e027f087e230041b0036b22022400200241286a2001280200200128020428020c110500024002400240024020022903284201520d0020024184026a41046a2103200241c0026a41106a2104200241c0016a4101722105200241286a41086a2106200241c0026a41206a2107200241e4026a2108200241bc026a2109034020024198026a41186a220a200641186a29000037030020024198026a41106a220b200641106a29000037030020024198026a41086a220c200641086a2900003703002002200629000037039802200241c0016a20024198026a10f80202400240024020022d00c0014101470d0020024190036a41186a200541186a29000037030020024190036a41106a200541106a29000037030020024190036a41086a200541086a2900003703002002200529000037039003200241c0026a20024190036a10b1012007280200220d450d01200241c0026a41086a290300210e20022903c002210f2008280200450d02200d10200c020b200741003602000b4200210f4200210e0b20034200370200200341086a420037020020024190036a41186a220d200a29030037030020024190036a41106a220a200b29030037030020024190036a41086a2210200c290300370300200220022903980237039003200241c0026a41086a22114200370300200b20024184026a41106a280200360200200c20024184026a41086a2902003703002004200229039003370300200441086a2010290300370300200441106a200a290300370300200441186a200d290300370300200242003703c002200220022902840237039802200241c0016a41086a220a4200370300200242003703c001418feec0004116200241c0016a1002200241f0016a41086a220d200a290300370300200220022903c0013703f00102400240200241f0016a411041c8d7c400410041001001417f460d00200242003703c801200242003703c001200241f0016a4110200241c0016a4110410010012210417f460d052010410f4d0d05200241186a20022903c001200a290300427f42001087042002290318221242012012420156200241186a41086a29030022134200522013501b22101b22122013420020101b2213844200520d010c060b42002113420121120b200241086a200f200e201220131087040240024020022903082212500d00200241f0016a41106a200b280200360200200d200c290300370300200a2011290300370300200241c0016a41106a2004290300370300200241c0016a41186a200241c0026a41186a290300370300200241c0016a41206a2007290300370300200241c0016a41286a200241c0026a41286a29030037030020022002290398023703f001200220022903c0023703c001200220092800003600bb01200220022800b9023602b801420021144100210b200f2115200e2116200f2117200e2118201221190c010b4102210b0b200241a0016a41106a200241f0016a41106a280200360200200241a0016a41086a200d290300370300200241f0006a41086a200a290300370300200241f0006a41106a200241c0016a41106a290300370300200241f0006a41186a200241c0016a41186a290300370300200241f0006a41206a200241c0016a41206a290300370300200241f0006a41286a200241c0016a41286a290300370300200220022903f0013703a001200220022903c001370370200220022800bb0136006b200220022802b801360268200b4102470d02200241286a2001280200200141046a28020028020c11050020022903284201510d000b0b200041023a008001200241b0036a24000f0b2000201737031020002015370300200020193703402000410036022820004208370320200020022903a00137022c20002002290370370350200041186a201837030020002016370308200041c8006a2014370300200041346a200241a0016a41086a2903003702002000413c6a200241a0016a41106a280200360200200041d8006a200241f0006a41086a290300370300200041e0006a200241f0006a41106a290300370300200041e8006a200241f0006a41186a290300370300200041f0006a20024190016a290300370300200041f8006a20024198016a2903003703002000200b3a008001200020022802683600810120004184016a200228006b360000200241b0036a24000f0b419a88c00041331039000b41e88dc000102f000b8b0401047f230041e0006b2202240002400240410e10222203450d00200341066a41002900a3cf433700002003410029009dcf433700002003410e412e10212203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412e200241c0006a1000200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041c8d7c400410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031020200241e0006a24000f0b419a88c00041331039000b410e41011023000b412e41011023000b1300200041053602042000418cb3c2003602000b13002000410d360204200041ceb6c2003602000b130020004108360204200041dcb6c2003602000b130020004103360204200041ecbfc2003602000b130020004107360204200041c2c3c2003602000b130020004108360204200041ccc3c2003602000bc20602027f047e230041e0006b22032400200341386a41086a22044200370300200342003703384181e3c2004116200341386a1002200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041c8d7c400410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821050c010b42c0843d21050b42002106200341386a41086a220442003703002003420037033841f0e2c2004111200341386a1002200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041c8d7c400410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821060b0240200520067d20025a0d00200041e2acc20036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841d7e3c2004111200341386a1002200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041c8d7c400410041001001417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010012204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a2005420020024200108804200341286a2002420020064200108804200341086a420042002006420010880402402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c220820075472450d00200041fdacc20036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a200120032903282008410810aa02024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bc70703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903d801370200200141146a22042902002106200420022903d0013702002001410c6a22042902002107200420022903c801370200200241003a00c00120012902042108200120022903c00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241c0016a41176a22042002290038370000200241c0016a41106a220a2002290031370300200241c0016a41086a220b2002290029370300200220022900213703c001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903c001370300411210222204450d01200441106a41002f00bbcf433b0000200441086a41002900b3cf43370000200441002900abcf4337000020044112413210212204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241c0016a41186a220a4200370300200241c0016a41106a220b4200370300200241c0016a41086a220c4200370300200242003703c00120044132200241c0016a100020024190016a41186a200a29030037030020024190016a41106a200b29030037030020024190016a41086a200c290300370300200220022903c0013703900120024190016a412041c8d7c400410041001001417f460d03200242203702b401200220024190016a3602b001200241c0016a200241b0016a10d90220022d00cc014102460d0420024180016a41086a220a200241c0016a41086a280200360200200220022903c00137038001200241206a200241cd016a41c3001084041a20024190016a41086a220b200a280200360200200220022903800137039001200241c0016a200241206a41c1001084041a200141246a20024180026a2d00003a00002001411c6a200241f8016a290000370000200141146a200241f0016a2900003700002001410c6a200241c0016a41286a290000370000200120022900e00137000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200020093a001f200041286a200b280200360200200020022903900137022020041020200324000f0b20004100360220200324000f0b411241011023000b413241011023000b41f1d1c20041d7001039000b419a88c00041331039000bc00703037f047e047f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300411210222204450d01200441106a41002f00cdcf433b0000200441086a41002900c5cf43370000200441002900bdcf4337000020044112413210212204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a1000200241f0006a41186a200a290300370300200241f0006a41106a200b290300370300200241f0006a41086a200c290300370300200220022903a001370370200241f0006a412041c8d7c400410041001001417f460d0320024220370294012002200241f0006a36029001200241a0016a20024190016a10820320022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c7001084041a200241a0016a200241206a41c1001084041a200241206a200241a0016a41c1001084041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a00272000420137030020041020200324000f0b20004200370300200324000f0b411241011023000b413241011023000b41f1d1c20041d7001039000b419a88c00041331039000bf10a03027f027e077f230041e0016b22022400200241186a2001108e01024002402002280218450d00200228021c210320022001108c012002290300a7450d00200241106a29030021042002290308210541002106200241003a00c00120012802002001280204200241c0016a410120012802081001210720012001280208200741016a41014b22076a22083602082007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220641002001280200200141046a280200200241c0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241a0016a41186a22072009290300370300200241a0016a41106a2206200a290300370300200241a0016a41086a2209200b290300370300200220022903c0013703a00120024180016a41186a220a200729030037030020024180016a41106a2207200629030037030020024180016a41086a22062009290300370300200220022903a00137038001200241e0006a41186a200a290300370300200241e0006a41106a2007290300370300200241e0006a41086a20062903003703002002200229038001370360410121060b200241c0006a41186a200241e0006a41186a290300370300200241c0006a41106a200241e0006a41106a290300370300200241c0006a41086a200241e0006a41086a2903003703002002200229036037034041002109200241003a00c0012001280200200141046a280200200241c0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220741002001280200200141046a280200200241c0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241a0016a41186a22012009290300370300200241a0016a41106a2207200a290300370300200241a0016a41086a2208200b290300370300200220022903c0013703a00120024180016a41186a2209200129030037030020024180016a41106a2201200729030037030020024180016a41086a22072008290300370300200220022903a00137038001200241e0006a41186a2009290300370300200241e0006a41106a2001290300370300200241e0006a41086a20072903003703002002200229038001370360410121090b200241c0016a41186a2201200241e0006a41186a290300370300200241c0016a41106a2207200241e0006a41106a290300370300200241c0016a41086a2208200241e0006a41086a290300370300200220022903603703c001200241206a41186a220a200241c0006a41186a290300370300200241206a41106a220b200241c0006a41106a290300370300200241206a41086a220c200241c0006a41086a290300370300200220022903403703202000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290320370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a20022903c001370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a200241a4016a2f01003b0100200041da006a20022801a001360100200241e0016a24000f0b200041023a0018200241e0016a24000f0b200041023a0018200241e0016a24000bd30302047f017e230041d0006b2202240002400240411c10222203450d00200341186a41002800c0d142360000200341106a41002900b8d142370000200341086a41002900b0d142370000200341002900a8d1423700002003411c413c10212203450d012003200129000037001c200341346a200141186a2900003700002003412c6a200141106a290000370000200341246a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003413c200241306a1000200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041c8d7c400410041001001417f460d002002200236022020024120360224200242003703302002410020024120200241306a41084100100122012001417f461b2201410820014108491b360228200141074d0d0220022903302106200241306a200241206a103820022802302201450d022000200229023437020c20002001360208200020063703000c010b200041003602080b20031020200241d0006a24000f0b419a88c00041331039000b411c41011023000b413c41011023000b1300200041023602042000419cd6c2003602000b1300200041043602042000419fd9c2003602000b130020004101360204200041a4d9c2003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010222206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011023000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d01200441012001109a02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b2000418001102d000b2000418001102d000b13002000410536020420004194e6c2003602000b13002000410836020420004190dfc2003602000b130020004116360204200041ecf8c2003602000b3101017f0240410110222202450d00200042818080801037020420002002360200200241003a00000f0b410141011023000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242003700000f0b410841011023000b9a0101017f230041e0006b22022400200241003a004c200241103602482002420137033820024201370330200242013703282002420137032020024201370318200242013703102002420137030820024201370300200242808080808080c00037034020024100360258200242013703502002200241d0006a109901200041086a200228025836020020002002290350370200200241e0006a24000b3401017f0240410810222202450d0020004288808080800137020420002002360200200242c0843d3700000f0b410841011023000b3301017f0240410410222202450d0020004284808080c00037020420002002360200200241e4003600000f0b410441011023000b3301017f0240410810222202450d0020004288808080800137020420002002360200200242af013700000f0b410841011023000b3301017f0240410810222202450d002000428880808080013702042000200236020020024287013700000f0b410841011023000b3901017f0240411010222202450d002002420037000820024215370000200042908080808002370204200020023602000f0b411041011023000be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041f0e2c2004111200141106a1002200141086a220320022903003703002001200129031037030042002104024002402001411041c8d7c400410041001001417f460d002001420037031020014110200141106a41084100100141016a41084d0d01200129031021040b200242003703002001420037031041f0e2c2004111200141106a100220032002290300370300200120012903103703002001200420007c37031020014110200141106a41081003200141206a24000f0b419a88c00041331039000b970e06057f087e037f057e017f057e23004180016b22012400200141306a41086a220242003703002001420037033041a39ec3004118200141306a1002200141106a41086a2002290300370300200120012903303703104100210341102104024002400240200141106a411041c8d7c400410041001001417f460d00200142103702242001200141106a360220200141306a200141206a10900120012d007c22034102460d022001410c6a41026a2202200141ff006a22052d00003a0000200120012f007d3b010c200129033021062001290338210720012903402108200129034821092001290350210a2001290358210b2001290360210c2001290368210d2001280270210e2001280274210f20012802782104200520022d000022023a0000200141206a41026a20023a0000200120033a007c200120043602782001200f3602742001200e3602702001200d3703682001200c3703602001200b3703582001200a37035020012009370348200120083703402001200737033820012006370330200120012f010c22023b007d200120023b01200c010b4201210d41808004210f4100210e4201210c4201210b4201210a420121094201210842012107420121060b200141306a41086a220242003703002001420037033041a5eec000411b200141306a1002200141106a41086a2205200229030037030020012001290330370310024002400240024002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012210417f460d022010410f4d0d02200141386a2903002111200129033021120c010b42002112420021110b200242003703002001420037033041a0a0c3004111200141306a10022005200229030037030020012001290330370310024002400240200141106a411041c8d7c400410041001001417f460d0020014100360230200141106a4110200141306a41044100100141016a41044d0d02200128023021050c010b41e40021050b42002113200141306a41086a220242003703002001420037033041b1a0c3004114200141306a1002200141106a41086a20022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d042002410f4d0d04200141386a2903002113200129033021140c010b421521140b42002115200141306a41086a220242003703002001420037033041c5a0c3004114200141306a1002200141106a41086a221020022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012216417f460d052016410f4d0d05200141386a2903002117200129033021180c010b42002118420021170b200242003703002001420037033041d9a0c3004114200141306a1002201020022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d062002410f4d0d06200141386a2903002119200129033021150c010b420021190b200141306a41086a220242003703002001420037033041eda0c3004114200141306a1002200141106a41086a2002290300370300200120012903303703100240024002400240200141106a411041c8d7c400410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d022001290330211a0c010b428701211a0b200141306a41086a22024200370300200142003703304181a1c3004116200141306a1002200141106a41086a20022903003703002001200129033037031002400240200141106a411041c8d7c400410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d032001290330211b0c010b42af01211b0b20002012370350200020033a004c200020043602482000200f3602442000200e3602402000200d3703382000200c3703302000200b3703282000200a37032020002009370318200020083703102000200737030820002006370300200020012f01203b004d200020053602a001200041d8006a2011370300200041cf006a200141226a2d00003a000020004188016a20193703002000201537038001200041f8006a201737030020002018370370200041e8006a2013370300200020143703602000201b370398012000201a3703900120014180016a24000f0b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000b419a88c00041331039000bf40d050c7f057e017f017e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200220f41086a2110200f2f010622114105742112417f21090240024002400240024003402012450d01200941016a2109417f410120042010412010860422134100481b410020131b2213450d03201241606a2112201041206a211020134101460d000b200c0d010c030b20112109200c450d020b200c417f6a210c200f20094102746a41880b6a210e410021090c090b200f41e8026a200941e0006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a28020028021c110100200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22194101460d0020194102470d0220094180016a21094200211a20172016844200520d030c0d0b200941f0006a21094200211a20172016844200510d0c0c020b200d280200220f201d6a2110200f2f0106220d201e742112417f210902400240024003402012450d01200920196a2109201f201920032010202210860422132023481b202320131b2213450d03201220246a2112201020226a211020132019460d000b201c0d010c050b200d2109201c450d040b201c201f6a211c200f20092020746a20216a210d410121090c060b200f41e8026a200941e0006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941e0006a21094200211a20172016844200510d0a0b200841186a2009290300200941086a290300201720161087042001201a2001290308221720082903187d221620162017562016507222091b37030802402009450d0041f8a9c3002109412221070c090b200a28020022094100480d04200941ffffffff07460d04410121192007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f4102212041880b21214120212241002123416021240c020b200841086a2007411c6a2802002003200741206a28020028021c110100200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d221a201756201620067d2017200554ad7d221720165620172016511b4101470d00419aaac3002109411d21070c070b024020184200520d00200741c0006a2802002209290350200556200941d8006a290300221620065620162006511b450d0041b7aac3002109411f21070c070b200820034102201a201710ae01024020082802002209450d00200828020421070c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041d6aac3002109412d21070c070b4100210920032004460d05200320044120108604450d05200a2003201a201710db01200a20042018201610db01200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22192009490d0320094101742212201920192012491b2212ad42d8007e2216422088a70d032016a722104100480d032009450d01200741286a280200200941d8006c201010212219450d020c070b200741286a28020021190c070b2010102222190d050b201041081023000b1024000b410121090c000b0b10d101000b2007412c6a2012360200200741286a2019360200200741306a28020021090b2019200941d8006c6a2219200829036037000141002109201941003a00002019200829034037002120192008280039360041201941096a200841e0006a41086a290300370000201941116a200841e0006a41106a290300370000201941196a200841e0006a41186a290300370000201941296a200841c0006a41086a290300370000201941316a200841c0006a41106a290300370000201941396a200841c0006a41186a290300370000201941c4006a2008413c6a280000360000201941d0006a200637030020192005370348200741306a2207200728020041016a3602000b0b200020073602042000200936020020084180016a24000f0b418caec200102f000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a1054200141306a24000b160020002001280208360204200020012802003602000b0e00200035020041012001109a020b8c0301037f230041c0006b22022400200141086a280200210320012802042104200220012802002201360210024002400240200141818004490d002002413c6a41013602002002410236021c200241b8aac4003602182002420237022c200241bcaac4003602282002200241186a3602382002200241286a102b2002280200450d010c020b02402004450d00200220033602140240200120034d0d00200241246a41023602002002413c6a41023602002002410236021c2002420237022c200241ccaac4003602282002200241106a3602202002200241146a3602182002200241186a3602382002200241286a102b20022802000d030c020b2003418080044d0d002002413c6a41013602002002410236021c200241b8aac4003602182002420237022c200241dcaac4003602282002200241186a3602382002200241286a102b20022802000d020c010b2002410036020020022802000d010b20004100360200200241c0006a24000f0b20002002290300370200200041086a200241086a280200360200200241c0006a24000bcd0601037f230041c0006b22042400024002400240024002400240024002400240024020012802084102470d00200128020022052d0000416e6a2201411e4b0d0141002106024020010e1f0002020202020202020202020202020202020202020202020202020a030405000b20042005280204220136020c200120034f0d05200220014101746a22012d0001450d06200441346a41013602002004410236023c20044202370224200441d8acc40036022020042004410c6a3602382004200441386a360230200441106a200441206a102b200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b412e10222201450d06200041013a0000200141266a41002900d0ac44370000200141206a41002900caac44370000200141186a41002900c2ac44370000200141106a41002900baac44370000200141086a41002900b2ac44370000200141002900aaac44370000200041086a42ae808080e005370200200041046a2001360200200441c0006a24000f0b412010222201450d06200041013a0000200141186a4100290090ad44370000200141106a4100290088ad44370000200141086a4100290080ad44370000200141002900f8ac44370000200041086a42a08080808004370200200041046a2001360200200441c0006a24000f0b410121060c060b410221060c050b410321060c040b200441346a41013602002004410236023c20044202370224200441e8acc40036022020042004410c6a3602382004200441386a360230200441106a200441206a102b200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b20012d000021060c020b412e41011023000b412041011023000b0240200541106a2d00004106470d00200041003a0000200020063a0001200441c0006a24000f0b0240412910222201450d00200041013a0000200141286a41002d00c0ad443a0000200141206a41002900b8ad44370000200141186a41002900b0ad44370000200141106a41002900a8ad44370000200141086a41002900a0ad4437000020014100290098ad44370000200041086a42a98080809005370200200041046a2001360200200441c0006a24000f0b412941011023000b90010002400240024020002d000022004101460d0020004102460d0120004103470d02200128021841d1cac40041032001411c6a28020028020c1100000f0b200128021841cbcac40041032001411c6a28020028020c1100000f0b200128021841cecac40041032001411c6a28020028020c1100000f0b200128021841c8cac40041032001411c6a28020028020c1100000b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ec81c5003602082002200236021820012000200241086a10d3032101200241206a240020010be0d00103037f037e067f230041f0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d0000417f6a220441aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01f602001b0f01aa01a701a901a301230c13a80104141a9a01531d2454063507a101880172269101a001a60134090e8a01399d01a40105023a43744b73568d01030a4616797b4184017825287a8901080d272e1218940196012298019c01a5015da201179b01601e5c119e019f0120920177750b1044472a1597011c6231930190018b012b193699013c29664d5767644c8001427e308c0187012d8e0195011f48402f8f01713d217f614a7c85012c3332383f6f5e6e83018201378601505181017668637d6b5f3b553e694e456c4f6d596a654958525a5bf6020b200141306a2802002204200141346a22052802004f0dad0120023100012106200141206a350200210720042001412c6a280200470df402200441016a22022004490de60220044101742205200220022005491b2202ad4203862208422088a70de6022008a722054100480de6022004450de401200141286a2802002004410374200510212204450de5010cf3020b200141306a2802002202417f6a220420024f0d9f02200420024b0d9f02200141286a220228020020044103746a22042d00044101470da90120043100052106200341d8006a200141186a200210bf032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110c0032003280258450df30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0da80120022001411c6a280200470def02200241016a22042002490de30220024101742205200420042005491b22044100480de3022002450ddf01200141186a2802002002200410212202450de0010cee020b200341d8006a200141186a2202200141286a2204410010c10320032d00584101470da801200341e0006a2903002106200328025c22010df0010cf1020b200341d8006a2001200241046a2802004102410010c0032003280258450df00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210c2032003280258450def0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010c2032003280258450dee0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ded0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110c2032003280258450dec0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c4032003280258450deb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dea0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360248200441386a28020020024d0da2012003200428023020024102746a28020022023602282004412c6a28020020024d0db801200428022420024104746a22042d000d2109024020042802082202450d002004280200417f6a2104200141286a2105200141186a210a0340200341d8006a200a2005200420026a2d000010c10320032d00584101460de7012002417f6a22020d000b0b20094104460de902200141206a2802002202200141246a22042802004f0df30120022001411c6a280200470de402200241016a22042002490dda0220024101742205200420042005491b22044100480dda022002450d8702200141186a2802002002200410212202450d88020ce3020b200341d8006a2001410110c3032003280258450de80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410010c0032003280258450de70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20023100012106200341d8006a200141186a200141286a2204410010c10320032d00584101470da0012000200329025c370200200041086a200341e4006a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450de50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450de40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450de30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241046a280200210a2001280200210220034100360228200241146a280200450dac01200341d8006a200141186a2204200141286a2205410010c10320032d00584101470daf01200341e0006a2903002106200328025c22010df3010ce2020b200341d8006a200141046a200241046a28020010c60320032d00584101470d9c01200328025c2201450de102200341e0006a29030021060cb3010b200341d8006a2001410010c5032003280258450de00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450ddf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dde0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ddd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c7032003280258450ddc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360248200341d8006a200141046a200210c60320032d00584101470d9701200328025c21012003200341e0006a290300220637022c2003200136022820010daf010cdb020b200141306a2802002204200141346a22052802004f0d970120023100012106200141206a350200210720042001412c6a280200470dd302200441016a22022004490dcb0220044101742205200220022005491b2202ad4203862208422088a70dcb022008a722054100480dcb022004450dcb01200141286a2802002004410374200510212204450dcc010cd2020b200341d8006a2001410010c5032003280258450dd90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a28020022023602202001280200210420032002360254200441206a28020020024d0d9601200428021820024101746a22022d0001450db501200320022d000022023a0027200341d8006a200141186a200141286a410410c10320032d00584101470db801200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d9b020cd8020b200341d8006a2001410310c3032003280258450dd70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450dd60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c7032003280258450dd50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450dd40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450dd30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012d003822024104470d91010cc2020b200341d8006a2001200241046a2802004104410010c2032003280258450dd10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dd00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110c2032003280258450dcf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450dce0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dcd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dcc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dcb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dca0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dc90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dc80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450dc70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450dc60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dc50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dc40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dc30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dc20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110c2032003280258450dc10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310c2032003280258450dc00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c7032003280258450dbf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450dbe0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450dbd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210c0032003280258450dbc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110c0032003280258450dbb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110c8032003280258450dba0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450db90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450db80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110c8032003280258450db70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450db60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450db50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450db40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450db30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110c0032003280258450db20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450db10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210c8032003280258450db00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450daf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dae0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450dad0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410310c8032003280258450dac0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450dab0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012802002102200341003602282002280208450d750c94020b200341d8006a2001410110c5032003280258450da90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450da80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210c8032003280258450da70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410210c8032003280258450da60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450da50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410010c8032003280258450da40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110c8032003280258450da30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360228200441206a28020020024d0d62200141206a2802002205200141246a220a2802004f0d78200428021820024101746a2d0000210220052001411c6a280200470d8b02200541016a22042005490d93022005410174220a20042004200a491b22044100480d93022005450daa01200141186a2802002005200410212205450dab010c8a020b200341d8006a2001200241046a2802004108410110c2032003280258450da10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110c8032003280258450da00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d6020022001411c6a280200470d8602200241016a22042002490d900220024101742205200420042005491b22044100480d90022002450d9201200141186a2802002002200410212202450d93010c85020b200341d8006a2001410110c5032003280258450d9e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010c8032003280258450d9d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310c8032003280258450d9c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210c8032003280258450d9b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310c8032003280258450d9a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450d990220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450d980220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450d970220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110c8032003280258450d960220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450d950220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450d940220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450d930220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010c8032003280258450d920220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450d910220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310c8032003280258450d900220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450d8f0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450d8e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010c8032003280258450d8d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210c8032003280258450d8c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310c8032003280258450d8b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110c8032003280258450d8a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210c8032003280258450d890220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310c8032003280258450d880220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450d870220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450d860220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002202417f6a220420024f0db101200420024b0db101200128022820044103746a220a2802002205200141206a28020022024d0d482001411c6a280200220420026b200520026b22094f0d5d200220096a220b2002490df6012004410174220c200b200b200c491b220b4100480df6012004450d7c200141186a2802002004200b1021220c450d7d0ce6010b200341d8006a2001410210c5032003280258450d840220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010c2032003280258450d830220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d4420022001411c6a280200470de201200241016a22042002490df30120024101742205200420042005491b22044100480df3012002450d77200141186a2802002002200410212202450d780ce1010b20012802002102200341003602282002280208450d4d0cda010b200341d8006a2001410010c5032003280258450d800220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010c8032003280258450dff0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c7032003280258450dfe0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450dfa0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450df90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110c8032003280258450df80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450df70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c5032003280258450df60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450df50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010c8032003280258450df40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450df30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450df20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c3032003280258450df10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c7032003280258450df00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c5032003280258450def0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450dee0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010c2032003280258450ded0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c4032003280258450dec0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410110c0032003280258450deb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dea0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c5032003280258450de90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d2c20022001411c6a280200470dc001200241016a22042002490dd90120024101742205200420042005491b22044100480dd9012002450d61200141186a2802002002200410212202450d620cbf010b200341d8006a2001410210c7032003280258450de70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450de60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450de50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110c2032003280258450de40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c7032003280258450de30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450de20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450de10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c7032003280258450de00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ddf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010c5032003280258450dde0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c3032003280258450ddd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110c7032003280258450ddc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a200141046a200241046a28020010c60320032d00584101470d20200328025c2201450ddb01200341e0006a29030021060c420b200341d8006a2001410210c3032003280258450dda0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dd90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310c0032003280258450dd80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450dd70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310c3032003280258450dd60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110c2032003280258450dd50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010c2032003280258450dd40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dd30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241086a280200210a200241046a280200210420032002410c6a2802002205360240200141306a280200220220054d0d1820022005417f736a220520024f0d83014104210c0240200141286a220d280200220920054103746a22052d00044103460d0020052d0005210c0b2003200c3a0038200a450d34200c41ff0171220e4104470d33200a410274210a0340200320042802002205360240200220054d0d3e20022005417f736a220520024f0d7d0240200920054103746a22052d00044103460d0020052d00054104470d3e0b200441046a2104200a417c6a220a0d000b4104210c0c340b200341d8006a2001200241046a2802004101410010c0032003280258450dd10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210c3032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110c2032003280258450dcf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360240200141306a280200220420024d0d1520042002417f736a220220044f0d8001200141286a220428020020024103746a22022d00044103460d9f0120022d0005220241ff01714104460d9f01200341d8006a200141186a22052004200210c10320032d00584101470d36200328025c2202450d9f01200341e0006a29030021060c9e010b200341d8006a200141186a200141286a410410c10320032d00584101470dcd01200328025c2201450dcd012000200341e0006a29030037020420002001360200200341f0006a24000f0b200241046a2802002102200341d8006a200141186a220a200141286a2205410010c10320032d00584101470d14200341e0006a2903002106200328025c22010d92010ccc010b200141306a2802002202417f6a220420024f0d78200420024b0d78200141286a220a28020020044103746a22042d0005210520042d00044101470d14200541ff01714104460d14200341ec006a41013602002003412936022c2003200441056a3602282003420237025c20034194a6c4003602582003200341286a360268200341086a200341d8006a102b200041086a200341086a41086a28020036020020002003290308370200200341f0006a24000f0b411a10222201450d7d200141186a41002f008fa6443b0000200141106a4100290087a644370000200141086a41002900ffa544370000200141002900f7a5443700002000429a808080a00337020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dc9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dc9012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a20022004410410c10320032d00584101470d16200341e0006a2903002106200328025c22010d470cc8010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dc7012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dc7012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a41013602002003410236023c2003420237025c200341c8aec4003602582003200341c8006a3602382003200341386a360268200341086a200341d8006a102b200329020c2106200328020822010d510cc6010b200141306a2802002202200141346a22052802004f0d15200141206a350200210720022001412c6a280200470d9b01200241016a22052002490db6012002410174220a20052005200a491b2205ad4203862208422088a70db6012008a7220a4100480db6012002450d4920042802002002410374200a10212202450d4a0c9a010b200141206a2802002202200141246a22042802004f0d1520032d0059210420022001411c6a280200470d9801200241016a22052002490db5012002410174220a20052005200a491b22054100480db5012002450d4a200141186a2802002002200510212202450d4b0c97010b200320032d005922023a0038200341d8006a200141186a200141286a410410c10320032d00584101470d16200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d170cc3010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dc2012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dc2012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a4101360200200341023602442003420237025c200341f8aec4003602582003200341d4006a3602402003200341c0006a360268200341086a200341d8006a102b0c1f0b200341d8006a200141186a2205200141286a200210c10320032d00584101470d15200328025c2202450db001200341e0006a29030021060c250b200341ec006a4101360200200341023602442003420237025c200341f8aec4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a102b20032802082201450dbf01200329020c21060c160b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dbe012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dbe012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dbd012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dbd012000200329022c37020420002001360200200341f0006a24000f0b2005200220052002491b21040ca1010b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dbb012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dbb012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a200141186a2205200141286a20032d0059220410c10320032d00584101470d13200328025c2201450dba01200341e0006a29030021060c210b200341086a410c6a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b200328022821022003200329022c37022c2003200236022820032802282202450d7b0c8b010b200341146a4102360200200341ec006a220241023602002003410236020c200320043602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821042003200329022c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b200328020c450d8601200328020810200c86010b200141306a280200210420032002360240200420024d0d1120042002417f736a220220044f0d6b200528020020024103746a22022d00044103460db70120022d0005220241ff01714104460db701200341d8006a200a2005200210c10320032d00584101470d38200328025c2201450db701200341e0006a29030021060c7d0b20024101470d1120012d003822024104470d1f0c83010b200341d8006a41146a41013602002003410236024c2003420237025c200341a8aec4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b200329020c2106200328020822010d460cb5010b200341ec006a41013602002003410236024c2003420237025c200341f8adc4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b20032802082202450d9e01200329020c21060c9f010b200341ec006a41013602002003410236024c2003420237025c200341f8adc4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b20032802082202450d8c01200329020c21060c8d010b20012802002209412c6a28020021022003200a3602282002200a4d0d112009280224200a4104746a220a2d000d21090240200a2802082202450d00200a280200417f6a210a0340200341d8006a20042005200a20026a2d000010c10320032d00584101460d372002417f6a22020d000b0b200941ff01714104460db201200141206a2802002202200141246a22052802004f0d4220022001411c6a280200470d7e200241016a22052002490da3012002410174220a20052005200a491b22054100480da3012002450d5620042802002002200510212202450d570c7d0b200341d8006a2002200420032d0059220510c10320032d00584101470d14200341e0006a2903002106200328025c22010d300cb1010b200341ec006a4101360200200341023602442003420237025c200341d8aec4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a102b200329020c2106200328020822010d3b0cb0010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450daf012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450daf012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450dae012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450dae01200329022c21060b2000200637020420002001360200200341f0006a24000f0b200320032d005922013a004020014104460dac01200241ff01712001460dac01200341086a41146a412b360200200341146a4123360200200341d8006a41146a41033602002003410236020c2003420337025c200341b4a6c4003602582003200341c0006a3602182003200341386a3602102003200341c8006a3602082003200341086a360268200341286a200341d8006a102b200329022c210620032802282201450dac010b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d0e20042001411c6a280200470d74200441016a220a2004490d9b0120044101742209200a200a2009491b220a4100480d9b012004450d3c20052802002004200a10212204450d3d0c730b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450da9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450da901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141186a280200220c200222046a210b20094102490d89010c8a010b200141206a2802002202200141246a220a2802004f0d0c20022001411c6a280200470d6e200241016a220a2002490d970120024101742209200a200a2009491b220a4100480d97012002450d3a20052802002002200a10212202450d3b0c6d0b200341146a4102360200200341ec006a220141023602002003410236020c200320043602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821022003200329022c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b200329022c210620032802282201450da5010c6b0b200341d8006a200141186a2202200a10bf032003280258450d1f20002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002204200141346a22052802004f0d0f200141206a350200210720042001412c6a280200470d68200441016a22052004490d94012004410174220a20052005200a491b2205ad4203862208422088a70d94012008a7220a4100480d94012004450d3b20022802002004410374200a10212202450d3c0c670b200341ec006a41013602002003410236024c2003420237025c20034188afc4003602582003200341d4006a3602482003200341c8006a360268200341086a200341d8006a102b0b200328020821012003200329020c220637022c200320013602282001450da1010c640b200341ec006a41013602002003410236024c2003420237025c200341d8aec4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a102b200329020c2106200328020822010d310ca0010b200320032d005922013a00482001200241ff0171460d9f0120014104460d9f01200341086a41146a412b360200200341146a412b360200200341d8006a41146a41033602002003410236020c2003420337025c200341cca6c4003602582003200341c8006a3602182003200341276a3602102003200341206a3602082003200341086a360268200341286a200341d8006a102b200329022c2106200328022822010d620c9f010b200a410274210a0340200320042802002205360240200220054d0d0a20022005417f736a220520024f0d49200920054103746a22052d00044103460d0920052d0005220b4104460d09200e200b470d09200441046a2104200a417c6a220a0d000b0b200341d8006a200141186a2202200d410010c103024020032d00584101470d00200341306a200341e4006a2802003602002003200329025c370328200328022822020d700c600b200c41ff01714104470d1a0c5e0b200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d5c200441016a220a2004490d8d0120044101742209200a200a2009491b220a4100480d8d012004450d3620022802002004200a10212202450d370c5b0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d8b012003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d8b01200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d99012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d9901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d1720042001411c6a280200470d55200441016a220a2004490d880120044101742209200a200a2009491b220a4100480d88012004450d3320052802002004200a10212204450d340c540b200341d8006a200141186a2205200a200210c10320032d00584101470d18200328025c2202450d63200341e0006a29030021060c250b200341146a4129360200200341ec006a41023602002003200541056a3602102003412936020c2003420237025c200341a4a6c4003602582003200341386a3602082003200341086a360268200341286a200341d8006a102b200328022822020d670c570b200341146a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c20034180b0c4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a102b200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b200328022821022003200329022c37022c20032002360228200328022822020d660c560b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d93012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d93012000200329022c37020420002001360200200341f0006a24000f0b2004102222020d8e010b200441011023000b2005102222040d8e010b200541041023000b2005102222040d86010b200541041023000b2004102222020d720b200441011023000b2004102222020d690b200441011023000b200b1022220c0d690b200b41011023000b2004102222020d5d0b200441011023000b200541ff01714104460d8401200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d40200441016a220a2004490d7520044101742209200a200a2009491b220a4100480d752004450d2a20022802002004200a10212202450d2b0c3f0b200341e0006a2903002106200328025c22010d0e0c83010b200341d8006a2002200d200c10c10320032d00584101470d0e200328025c2202450d432003200341e0006a29030037022c20032002360228200328022822020d540c440b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d81012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d8101200329022c21060b2000200637020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d502003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b200328020c450d4d20032802081020200328022822020d4e0c500b200141206a2802002204200141246a22052802004f0d0b20042001411c6a280200470d38200441016a22052004490d6f20044101742209200520052009491b22054100480d6f2004450d1e200a2802002004200510212204450d1f0c370b200141206a2802002204200141246a22092802004f0d0b20042001411c6a280200470d35200441016a22092004490d6e2004410174220b20092009200b491b22094100480d6e2004450d1f20052802002004200910212204450d200c340b200341e0006a2903002106200328025c22010d0d0c7c0b200a102222020d500b200a41041023000b2005102222020d4c0b200541011023000b2004102222050d5f0b200441011023000b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d752003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d75200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a22052802004f0d0a20042001411c6a280200470d29200441016a22052004490d642004410174220a20052005200a491b22054100480d642004450d1b20022802002004200510212202450d1c0c280b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d722003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d72200329022c21060c380b200341ec006a220241013602002003410236024c200320093602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d3e2003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d3e200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d6f2003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d6f200329022c21060b2000200637020420002001360200200341f0006a24000f0b200a102222040d360b200a41011023000b200a102222020d320b200a41011023000b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d692003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282201450d692000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082204450d292003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d292003200329022c37022c20032002360228200328022822020d3a0c2a0b200a102222020d2b0b200a41041023000b200a102222020d240b200a41011023000b200a102222040d200b200a41011023000b2004102222020d5b0b200441011023000b2005102222040d180b200541011023000b2009102222040d140b200941011023000b2005102222020d260b200541011023000b200a102222020d140b200a41011023000b2005102222020d0c0b200541011023000b41c2b0c400411d1039000b4118102222000d02411841011023000b4118102222000d02411841011023000b4118102222000d02411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c2003200136025841c3a5c4004134200341d8006a10ce03000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c2003200136025841c3a5c4004134200341d8006a10ce03000b41c2b0c400411d1039000b41c2b0c400411d1039000b411a41011023000b41c2b0c400411d1039000b2001411c6a2005360200200141186a2002360200200141206a28020021040b200141186a28020020046a200c3a0000200141206a2202200228020041016a3602000c0a0b2001411c6a2009360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c140b2001411c6a2005360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2201200128020041016a3602000c450b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c430b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c120b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c3f0b20034100360228200328022822020d100b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d382004410174220c200b200b200c491b220b4100480d382004450d02200141186a2802002004200b1021220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1022220c0d020b200b41011023000b02404118102222000d00411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c3d0b2000200637020420002001360200200341f0006a24000f0b2001412c6a2005360200200141286a2002360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080802084370200200141306a2201200128020041016a3602000c3a0b2000200637020420002001360200200341f0006a24000f0b2001411c6a200a360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c370b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c250b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c330b200341d8006a200141186a200a10bf032003280258450d3220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20032802282202450d020b200329022c21060b2000200637020420002002360200200341f0006a24000f0b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d292004410174220c200b200b200c491b220b4100480d292004450d02200141186a2802002004200b1021220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1022220c0d020b200b41011023000b02404118102222000d00411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c2e0b2000200329022c37020420002002360200200341f0006a24000f0b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c2b0b2001412c6a2005360200200141286a2002360200200141306a28020021020b200141286a28020020024103746a200642288620078442808080801084370200200141306a2201200128020041016a3602000c290b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41023a0000200141206a2201200128020041016a3602000c270b0240200141206a2802002202200141246a22042802004f0d0020022001411c6a280200470d05200241016a22042002490d1820024101742205200420042005491b22044100480d182002450d02200141186a2802002002200410212202450d030c040b200341ec006a220141013602002003410236024c200320043602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d262003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d26200329022c21060b2000200637020420002002360200200341f0006a24000f0b2004102222020d010b200441011023000b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c210b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c1f0b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c1a0b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41013a0000200141206a2201200128020041016a3602000c180b2001411c6a2004360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000c160b200341d8006a200141186a2204200141286a410010c103024020032d00584101470d00200328025c2202450d16200341e0006a29030021060c010b0240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d072002410174220a20052005200a491b22054100480d072002450d0220042802002002200510212202450d030c040b200341ec006a220141013602002003410236024c200320053602482003420137025c200341e0b0c4003602582003200341c8006a360268200341086a200341d8006a102b20032802082202450d152003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341a8aac4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a102b0240200328020c450d00200328020810200b20032802282202450d15200329022c21060b2000200637020420002002360200200341f0006a24000f0b2005102222020d010b200541011023000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c100b200141306a2802002202417f6a220420024f0d01200420024b0d010240024002400240200128022820044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d042004410174220c200b200b200c491b220b4100480d042004450d02200141186a2802002004200b1021220c450d030c060b2005200220052002491b21040c090b200141186a280200220c200222046a210b20094102490d050c060b200b1022220c0d030b200b41011023000b1024000b02404118102222000d00411841011023000b2003421837025c20032000360258200341d8006a4100411810cc0320032003280260220041186a3602602000200328025822016a411841e6afc400411810cd032003200329025c37025c200320013602584188a5c400413b200341d8006a10ce03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021083041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c080b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080803084370200200141306a2201200128020041016a3602000c060b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c040b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41033a0000200141206a2201200128020041016a3602000c020b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a2006422886200784370200200141306a2201200128020041016a3602000b20004100360200200341f0006a24000b19002000200141186a280200360204200020012802103602000bb310012e7f230041a0016b220224000240024002400240200028020022034180e5c200460d00200028020421040c010b41ec0010222203450d0141002104200341003b010620034100360200200341086a200241086a41e4001084041a20004100360204200020033602000b200141ff017121050c010b41ec0041041023000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b1085041a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b4103741085041a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec001022220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010840421092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a22071084042109200b41146a200341cc006a2007410374108404210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b1085041a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b4103741085041a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b1085041a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b4103741085041a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b201210222208450d02200820133b010620082013360200200820146a200241086a20151084042106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a2207108404212c2008201d6a2010201c6a2007201e74108404212d200820206a2010201f6a200920216a222e202274108404212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e1085041a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e741085041a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b2022741085041a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b1085041a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e741085041a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b2022741085041a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c0110222207450d03200741003b010620074100360200200741086a200241086a419401108404210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a1085041a2009200c3a0000201041146a220920064103746a200920274103746a2209200a4103741085041a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b4102741085041a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c0141041023000b41ec0041041023000b419c0141041023000b410121070c000b0b200241a0016a24000b8f4701af017f230041f0016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a28020021032001280208210441002105024002400240200141106a2802002206450d0041012107200241c0016a410172210841002109417f210a412c210b4109210c4108210d20024190016a41086a210e4111210f20024190016a41106a2110411921114118211220024190016a41186a21134121211420024190016a41206a21154127211620024190016a41276a2117410f2118417e2119410a211a410d211b4114211c200241c0016a41146a211d200241e4016a211e200241c0016a410c6a211f411c21204104212141ffffffff03212241702123410221244174212541582126416c212741002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021320c010b4100210941002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021010c010b410121010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b410421820120022802002183010240200241086a2802002201450d0020014104742132208301210103400240200141046a280200450d00200128020010200b200141106a2101203241706a22320d000b0b02402002280204450d0020830110200b2002410c6a2802002183010240200241146a2802002201450d00200141286c2132208301210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101203241586a22320d000b0b0240200241106a280200450d0020830110200b02402002411c6a280200450d00200241186a28020010200b0240200241286a280200450d00200241246a28020010200b0240200241346a280200450d00200241306a28020010200b2002413c6a280200218301200241c4006a2802002201450d01410421840120830120014104746a21850141102186014109218701410821880141ffffffff032189014170218a01208301218b01410121320c2d0b0240024020320e050001030507070b200e20042006200a6a2206200b6c6a2201200c6a29000037030020102001200f6a2900003703002013200120116a2900003703002015200120146a2900003703002017200141286a2800003600002002200129000137039001024020012d000022332018460d0020082002290390013700002008200d6a200e290300370000200841106a2010290300370000200820126a2013290300370000200841206a2015290300370000200820166a2017280000360000200220333a00c00141012134203320196a2235201a4b22360d3c02400240024002400240024002400240024002400240024002400240024002400240024020350e0b000102030405060708090a000b201f2802002137200241c0016a200d6a280200213820022802c40121392030450d0a0240203a450d00203a202174213b2030210103400240200120216a280200450d00200128020010200b200141106a2101203b20236a223b0d000b0b4100213b0240203c450d00203010200b2037213a2038213c203921300c4e0b201f2802002137200241c0016a200d6a280200213820022802c4012139202f450d0a0240203d450d00203d41286c213b202f210103400240200120216a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101203b20266a223b0d000b0b4100213e0240203f450d00202f10200b2037213d2038213f2039212f4101213b0c4e0b201f2802002140200241c0016a200d6a280200210120022802c401213302402041450d00202e450d00202e10200b2033212e2001214120060d200c2f0b201f2802002142200241c0016a200d6a280200210120022802c401213302402043450d00202d450d00202d10200b2033212d2001214320060d1e0c2d0b201f2802002144200241c0016a200d6a280200210120022802c401213302402045450d00202c450d00202c10200b2033212c2001214520060d1c0c2b0b201f2802002146200241c0016a200d6a280200214720022802c4012148202b450d072049450d42202b20492021746a214a202b214b4100214c0c4b0b201f2802002137200241c0016a200d6a280200213820022802c4012139202a450d0702402052450d002052201c6c213b202a210103400240200120216a280200450d00200128020010200b2001201c6a2101203b20276a223b0d000b0b4100214f02402053450d00202a10200b20372152203821532039212a4101213b4101213e4101214d41012150410121512036450d430c420b4101213120022802c401215420060d130c220b201f2802002155200241c0016a200d6a280200215620022802c40121572029450d062058450d422029205820206c6a21592029215a4101214c0c490b201f280200215c200241c0016a200d6a280200215d20022802c401215e2028450d06205f450d422028205f20126c6a2160202821614102214c0c490b201f2802002163200241c0016a200d6a280200216420022802c40121652009450d062066450d422009206620206c6a2167200921684103214c0c490b203921302038213c2037213a20060d190c280b2039212f2038213f2037213d20060d170c260b2048212b2047214e2046214920060d120c210b2039212a203821532037215220060d100c1f0b205721292056215b2055215820060d0e0c1d0b205e2128205d2162205c215f20060d0c0c1b0b20652109206421692063216620060d0a0c190b20062105410021010c430b0240208b012802082232450d00208b01280200210120322084017421320340024020012d0000208701470d0020012088016a28020020890171450d0020012084016a28020010200b20012086016a21012032208a016a22320d000b0b208b012086016a21010240208b012084016a280200450d00208b0128020010200b2001218b012001208501470d120b0240200241c0006a280200450d0020830110200b200241c8006a280200218c010240200241d0006a2802002201450d00200141146c2132208c01210103400240200141046a280200450d00200128020010200b200141146a21012032416c6a22320d000b0b0240200241cc006a280200450d00208c0110200b200241dc006a280200218c01200241e4006a2802002201450d01411c218d01208c012001411c6c6a218e01410c218f014108219001411421910141042192014110219301410921940141ffffffff032195014170219601208c01219701410221320c2d0b0240209701208f016a2802002232450d00209701280204210120322092017421320340024020012d0000209401470d0020012090016a28020020950171450d0020012092016a28020010200b20012093016a210120322096016a22320d000b0b02402097012090016a280200450d002097012092016a28020010200b209701208d016a210102402097012091016a280200450d0020970128021010200b20012197012001208e01470d110b0240200241e0006a280200450d00208c0110200b200241e8006a280200219801200241f0006a2802002201450d014118219901209801200141186c6a219a014104219b014114219c014110219d01410c219e014109219f01410821a00141ffffffff0321a101417021a20120980121a301410321320c2d0b024020a301209b016a280200450d0020a30128020010200b024020a301209c016a2802002232450d0020a30128020c21012032209b017421320340024020012d0000209f01470d00200120a0016a28020020a10171450d002001209b016a28020010200b2001209d016a2101203220a2016a22320d000b0b20a3012099016a2101024020a301209d016a280200450d0020a301209e016a28020010200b200121a3012001209a01470d100b0240200241ec006a280200450d0020980110200b41800121a401200241f4006a28020021a501200241fc006a2802002201450d01411c21a60120a5012001411c6c6a21a701410c21a801410821a901411421aa01410421ab01411021ac01410921ad0141ffffffff0321ae01417021af0120a50121b001410421320c2d0b024020b00120a8016a2802002232450d0020b0012802042101203220ab017421320340024020012d000020ad01470d00200120a9016a28020020ae0171450d00200120ab016a28020010200b200120ac016a2101203220af016a22320d000b0b024020b00120a9016a280200450d0020b00120ab016a28020010200b20b00120a6016a2101024020b00120aa016a280200450d0020b00128021010200b200121b001200120a701470d0f0b200220a4016a21010240200241f8006a280200450d0020a50110200b2066410020091b21322069410020091b218601205f410020281b218a012062410020281b2187012058410020291b219d01205b410020291b21960120524100202a1b21940120534100202a1b21930120494100202b1b21a201204e4100202b1b219f0120444100202c1b21af0120454100202c1b21ad0120424100202d1b21ac0120434100202d1b21890120404100202e1b21880120414100202e1b218301203d4100202f1b219001203f4100202f1b21a901203a410020301b219501203c410020301b218401200920820120091b21a101202820820120281b21a001202920820120291b21ae01202a208201202a1b219201202b208201202b1b218b01202c208201202c1b219b01202d208201202d1b219701202e208201202e1b21ab01202f208201202f1b21a301203020820120301b21b001200110e103024020024184016a2201280200450d0020024180016a28020010200b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2032360200200241f8006a208601360200200241f4006a20a101360200200241f0006a208a01360200200241ec006a208701360200200241e8006a20a001360200200241e4006a209d01360200200241e0006a209601360200200241dc006a20ae01360200200241d8006a2054360200200241d4006a2031360200200241d0006a209401360200200241cc006a209301360200200241c8006a209201360200200241c4006a20a201360200200241c0006a209f013602002002413c6a208b01360200200241386a20af01360200200241346a20ad01360200200241306a209b013602002002412c6a20ac01360200200241286a208901360200200241246a209701360200200241206a2088013602002002411c6a208301360200200241186a20ab01360200200241146a209001360200200241106a20a9013602002002410c6a20a301360200200241086a2095013602002002208401360204200220b00136020020002002418c011084041a200241f0016a24000f0b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410121320c1a0b410221320c1b0b410321320c1c0b410421320c1d0b410021010c2b0b410021010c2a0b410021010c290b410021010c280b410021010c270b410021010c260b410021010c250b410021010c240b410021010c230b410021010c220b410021010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410121010c1b0b410121010c1a0b410121010c190b410121010c180b410121010c170b410121010c160b410121010c150b410121010c140b410121010c130b410121010c120b410121010c110b410121010c100b410121010c0f0b410121010c0e0b410021010c0c0b410821010c0b0b410121010c0a0b410221010c090b410321010c080b410421010c070b410521010c060b410621010c050b410721010c040b410921010c030b410921010c020b410921010c010b410921010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0a00010203040f10111234340b4100214d0240204e450d00202b10200b204621492047214e2048212b4101213b4101213e4101214f410121504101215120360d70410121010c87010b024020350e0b00040506070809720a0b0c000b203b450d4220022802c40121360240201f2802002201450d00200120217421332036210103400240200120216a280200450d00200128020010200b200141106a2101203320236a22330d000b0b200241c0016a200d6a280200450d422036102020060d160c210b410021500240205b450d00202910200b205521582056215b205721294101213b4101213e4101214d4101214f410121512036450d6d0c6c0b4100215102402062450d00202810200b205c215f205d2162205e21284101213b4101213e4101214d4101214f410121502036450d6a0c690b410021342069450d09200910202063216620642169206521094101213b4101213e4101214d4101214f4101215041012151410021342036450d670c660b203e450d3e20022802c40121360240201f2802002201450d00200141286c21332036210103400240200120216a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101203320266a22330d000b0b200241c0016a200d6a280200450d3e2036102020060d110c1c0b200241c0016a200d6a280200450d3d20022802c401102020060d0f0c1a0b200241c0016a200d6a280200450d3c20022802c401102020060d0d0c180b200241c0016a200d6a280200450d3b20022802c401102020060d0b0c160b204d450d3a20022802c401216a201f2802002201450d2b206a20012021746a216b206a216c4104214c0c6e0b204f450d3920022802c40121360240201f2802002201450d002001201c6c21332036210103400240200120216a280200450d00200128020010200b2001201c6a2101203320276a22330d000b0b200241c0016a200d6a280200450d392036102020060d080c130b2050450d3820022802c401216d201f2802002201450d2b206d200120206c6a216e206d216f4105214c0c6e0b2051450d3720022802c4012170201f2802002201450d2c2070200120126c6a2171207021724106214c0c6f0b2034450d3620022802c4012173201f2802002201450d2d2073200120206c6a2174207321754107214c0c700b206321662064216920652109410521010c790b4101213b410621010c780b4101213e410721010c770b4101214d4101214f41012150410121512036450d60410821010c760b024002400240024002402033201b4b0d000240024020330e0e0001020202020202023803040506000b200241c0016a200d6a280200450d3720022802c401102020060d0f0c1a0b0240200241c0016a200d6a280200450d0020022802c40110200b201d280200450d36200241c0016a41106a280200102020060d0d0c180b0240200241c0016a200d6a280200450d0020022802c40110200b0240201d2802002201450d00200241c0016a20126a280200450d00200110200b201e280200450d35200241c0016a41206a280200102020060d0e0c190b20022802c4012176201f2802002201450d2d2076200120206c6a2177207621784108214c0c700b20022802c4012179201f2802002201450d2e2079200120126c6a217a2079217b4109214c0c710b20022802c401217c201f2802002201450d2f207c200120206c6a217d207c217e410a214c0c720b02400240024020022d00c40122012024460d0020012007460d0120010d02201f280200450d34200241c0016a200d6a280200102020060d0a0c150b201f280200217f201d2802002201450d32207f20012021746a218001207f218101410b214c0c750b201f28020021350240201d2802002201450d002001410c6c2133203521010340024020012802002236450d00200120216a280200450d00203610200b2001410c6a2101203320256a22330d000b0b200241c0016a41106a280200450d322035102020060d070c120b201f280200450d31200241c0016a200d6a28020010200c310b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021010c6a0b410021010c690b410021010c680b410021010c670b410021010c660b410021010c650b410021010c640b410021010c630b410021010c620b410021010c610b410021010c600b410121010c5f0b410121010c5e0b410121010c5d0b410121010c5c0b410121010c5b0b410121010c5a0b410121010c590b410121010c580b410121010c570b410121010c560b410121010c550b02400240024002400240204c0e0c000102030406080a0c0e1012120b0240204b2802082237450d00204b2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b204b41106a21010240204b20216a280200450d00204b28020010200b2001214b2001204a470d2e410021010c570b0240205a410c6a2802002237450d00205a2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b0240205a200d6a280200450d00205a20216a28020010200b205a20206a21010240205a201c6a280200450d00205a28021010200b2001215a20012059470d2e410221010c560b0240206120216a280200450d00206128020010200b02402061201c6a2802002237450d00206128020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b206120126a21010240206141106a280200450d002061410c6a28020010200b2001216120012060470d2e410321010c550b02402068410c6a2802002237450d0020682802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b02402068200d6a280200450d00206820216a28020010200b206820206a210102402068201c6a280200450d00206828021010200b2001216820012067470d2e410421010c540b0240206c2802082237450d00206c2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b206c41106a21010240206c20216a280200450d00206c28020010200b2001216c2001206b470d2e0b200241c0016a200d6a280200450d0e206a102020060d120c1b0b0240206f410c6a2802002237450d00206f2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b0240206f200d6a280200450d00206f20216a28020010200b206f20206a21010240206f201c6a280200450d00206f28021010200b2001216f2001206e470d2d0b200241c0016a200d6a280200450d0c206d102020060d0f0c180b0240207220216a280200450d00207228020010200b02402072201c6a2802002237450d00207228020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b207220126a21010240207241106a280200450d002072410c6a28020010200b2001217220012071470d2c0b200241c0016a200d6a280200450d0a2070102020060d0c0c150b02402075410c6a2802002237450d0020752802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b02402075200d6a280200450d00207520216a28020010200b207520206a210102402075201c6a280200450d00207528021010200b2001217520012074470d2b0b200241c0016a200d6a280200450d082073102020060d090c120b02402078410c6a2802002237450d0020782802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b02402078200d6a280200450d00207820216a28020010200b207820206a210102402078201c6a280200450d00207828021010200b2001217820012077470d2a0b200241c0016a200d6a280200450d062076102020060d0b0c140b0240207b20216a280200450d00207b28020010200b0240207b201c6a2802002237450d00207b28020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b207b20126a21010240207b41106a280200450d00207b410c6a28020010200b2001217b2001207a470d290b200241c0016a200d6a280200450d042079102020060d0a0c130b0240207e410c6a2802002237450d00207e2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a28020010200b200141106a2101203720236a22370d000b0b0240207e200d6a280200450d00207e20216a28020010200b207e20206a21010240207e201c6a280200450d00207e28021010200b2001217e2001207d470d280b200241c0016a200d6a280200450d02207c102020060d090c120b208101223941106a218101024020392802042201450d0002402039410c6a2802002237450d002037410c6c21370340024020012802002238450d00200120216a280200450d00203810200b2001410c6a2101203720256a22370d000b0b2039200d6a280200450d00203920216a28020010200b208101208001470d270b200241c0016a41106a280200450d00207f102020060d080c110b2006450d08410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021010c3b0b410021010c3a0b410021010c390b410021010c380b410021010c370b410021010c360b410021010c350b410021010c340b410021010c330b410121010c320b410121010c310b410121010c300b410121010c2f0b410121010c2e0b410121010c2d0b410121010c2c0b410121010c2b0b410121010c2a0b4100214c0c140b4101214c0c140b4102214c0c140b4103214c0c140b4104214c0c150b4105214c0c160b4106214c0c170b4107214c0c180b4108214c0c190b4109214c0c1a0b410a214c0c1b0b410b214c0c1c0b410821010c1c0b410121010c1b0b410821010c1a0b410121010c190b410821010c180b410121010c170b410821010c160b410121010c150b410821010c140b410921010c130b410921010c120b410921010c110b410921010c100b410921010c0f0b410921010c0e0b410921010c0d0b410921010c0c0b410921010c0b0b410921010c0a0b410921010c090b410921010c080b410921010c070b410921010c060b410921010c050b410921010c040b410921010c030b410921010c020b410921010c010b410921010c000b0b0b9a0c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a200010980320022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d10212209450d020c120b200028020021090c120b201d102222090d100b201d41041023000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b20011020200241106a2400200b0f0b1024000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a360200200220001098032002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c10222207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e10212207450d020c040b2009210d0c040b200e102222070d020b200e41041023000b412c41041023000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310212207450d020c030b410021140c040b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310212207450d010c020b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310212207450d020c030b410021190c040b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210212207450d020c030b4101211e0c040b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210212207450d010c020b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310212207450d010c020b2013102222070d010b201341041023000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210212207450d010c020b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210212207450d020c030b4101212a0c040b2012102222070d010b201241041023000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c202810212207450d010c020b2028102222070d010b202841041023000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c203010212207450d020c040b200920016a21010c040b2030102222070d020b203041041023000b1024000b202e210d0b20072009412c6c6a200e202d1084041a0240202c450d00200e10200b0240024002400240024041c00510222209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10e103200910202028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c00541041023000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e20131020410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a28020010200b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a28020010200b203b20316a21010240203b20356a280200450d00203b28021010200b2001213b20012032470d09410021010c150b02402047203f6a280200450d00204728020010200b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a28020010200b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a28020010200b200121472001203e470d090b2026450d00202710200b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a28020010200b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a28020010200b205220486a210102402052204c6a280200450d00205228021010200b2001215220012049470d070b2023450d00202410200b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d00200128020010200b200141146a21012009416c6a22090d000b0b201f450d00202010200b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a28020010200b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a28020010200b2001215a20012054470d050b201a450d00201b10200b02402017410047201941017371450d00201810200b02402015410047201141017371450d00201610200b0240200f410047201441017371450d00201010200b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d00200128020010200b0240200141106a280200450d002001410c6a28020010200b200141286a2101200941586a22090d000b0b200a450d00200b10200b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d00200128020010200b200141106a2101200941706a22090d000b0b2003450d00200410200b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d0120002802002003410474200810212205450d020c050b200341016a2104200028020021050c050b2008102222050d030b200841081023000b1024000b41c0b8c400102f000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b4104741085041a200541086a200241086a29030037030020052002290300370300200041086a20043602000b9e0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10a2032103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a2802002004410274200810212205450d020c030b200041186a28020021050c030b2008102222050d010b200841041023000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c200610212205450d020c040b200041e8006a28020021050c040b2006102222050d020b200641041023000b1024000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000b9e900117097f017e5a7f037e047f017e117f017e187f017e1c7f027e127f037e497f027e017f017e107f047e107f017e1e7f23002203210420034180096b41607122032400024002400240024002400240024002400240411010222205450d00200541063a0000412010222206450d01200641063a001020064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410200b20051020200141106a2802002207412c6c21052001280208220841586a210902400240024002400240024003402005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004107470d000b200320032f01a0033b01c005200b41046a280200200b41086a2802002205470d01200541016a22092005490d0e2005410174220a20092009200a491b220aad420486220c422088a70d0e200ca722074100480d0e2005450d04200b2802002005410474200710212209450d050c0b0b411010222209450d0720094180023b010c200942828080802037020420092006360200200920032f01a0033b010e2001410c6a2802002007470d09200741016a22052007490d0d2007410174220a20052005200a491b2205ad422c7e220c422088a70d0d200ca7220a4100480d0d2007450d0120082007412c6c200a10212208450d020c080b200b28020021090c0a0b200a102222080d060b200a41041023000b2007102222090d060b200741041023000b411041081023000b412041081023000b411041041023000b2001410c6a2005360200200141086a20083602000b200141106a200741016a220d36020020082007412c6c6a220520032f00b0043b0001200541073a0000200542818080801037000820052009360004200520032902c005370210200541036a200341b2046a2d00003a0000200541186a200341c8056a290200370200200541206a200341c0056a41106a290200370200200541286a200341c0056a41186a2802003602004100210e0c020b200b2009360200200b41046a200a360200200b41086a28020021050b200920054104746a22054180023b010c200542828080802037020420052006360200200520032f01c0053b010e200b41086a2205200528020041016a360200200341c0006a200b1098032003280244417f6a210e200141106a280200210d200141086a28020021080b200d412c6c2105200841586a210902400340410021062005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004103470d000b200b41086a2802002205450d00200541286c2109200b28020041186a2105410021060340200620052d0000456a2106200541286a2105200941586a22090d000b0b200d412c6c2105200841586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b200d412c6c2105200841606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b02402005200a6a220fad220c421e88a70d00200c420286a72205417f4c0d0002400240024002400240024002402005450d00200510762208450d02200f0d010c030b41042108200f450d030b2008200f4102746a2110410021114101211241042113200141106a2114412c211541082116200141086a211741582118415421194128211a410b211b4118211c4103211d2008211e4100211f0c030b200541041023000b410021050c020b410021050c010b410121050b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e020001010b200141086a2802002121412c2123200141106a2802002220450d370c010b024002400240024002400240024002400240201f0e050001030405050b024020112006490d002014280200222020156c220a21052017280200222120186a220b210902400340410021072005450d01200520196a21052009201a6a210d200920156a22222109200d2d0000201d470d000b202220166a2802002205450d002005201a6c21092022280200201c6a2105410021070340200720052d0000456a21072005201a6a2105200920186a22090d000b0b201120076b220720114b0d060340200a450d03200a20196a210a200b201a6a2105200b20156a2209210b20052d0000201b470d000b200920166a28020020074d0d0720092802002007201c6c6a2802082109200341c0056a2007200110d40320032802c405210520032802c0052012460d08201e200520096a3602000b201120126a2111201e20136a221e2010470d0c410021050c430b20212d0000202a470d3c202128020c2205450d3c202128020422702005202b6c6a2171410021720c1f0b412c10222205450d07200541286a41002800a6b344360000200541206a410029009eb344370000200541186a4100290096b344370000200541106a410029008eb344370000200541086a4100290086b344370000200541002900feb2443700000c360b20840121c3010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020bb01208c01712205207c460d002005208d01470d01410021050c4d0b20ba01208c01712205208d01460d0102402005207c470d000340208a0120810122056b208e014d0d05200528020c450d0920052090016a280200450d0d20052093016a280200450d1120052096016a21810120052097016a2802000d000b20052098016a28020021c4010c150b0340208a0120810122056b208e014d0d05200528020c450d0920052090016a280200450d0d20052093016a280200450d1120052096016a21810120052097016a2802000d000b20052098016a28020021c4010c190b20ba01208c01712205208d01460d0102402005207c470d000340208a0120810122056b208e014d0d06200528020c450d0a20052090016a280200450d0e20052093016a280200450d1220052096016a21810120052097016a2802000d000b20052098016a28020021c4010c1b0b0340208a0120810122056b208e014d0d06200528020c450d0a20052090016a280200450d0e20052093016a280200450d1220052096016a21810120052097016a2802000d000b20052098016a28020021c4010c1c0b20b801207c470d1c20830120b901460d1c0c490b20b801207c470d3020830120b901460d2f410321050c490b2005208a01460d4b2005208f016a21090340200528020c450d1020092089016a210920052089016a2205208a01470d000c4c0b0b2005208a01460d102005208f016a21090340200528020c450d1420092089016a210920052089016a2205208a01470d000b208a0121810120b801207c460d270c280b410121ba012005208a01460d102005208f016a21090340200528020c450d1520092089016a210920052089016a2205208a01470d000b208a012181012085010d310c490b2005208a01460d102005208f016a21090340200528020c450d1620092089016a210920052089016a2205208a01470d000b208a0121810120b801207c460d290c2a0b20052089016a2181012005208f016a28020021c4010c0c0b20052089016a2181012005208f016a28020021c4010c100b20052089016a2181012005208f016a28020021c4010c110b20052089016a2181012005208f016a28020021c4010c120b20052091016a21810120052092016a28020021c4010c080b20052091016a21810120052092016a28020021c4010c0c0b20052091016a21810120052092016a28020021c4010c0d0b20052091016a21810120052092016a28020021c4010c0e0b20052094016a21810120052095016a28020021c4010c040b20052094016a21810120052095016a28020021c4010c080b20052094016a21810120052095016a28020021c4010c090b20052094016a21810120052095016a28020021c4010c0a0b2009208b016a218101200928020021c4010b410121ba01410121bb0120c301218401200320c40136027c20080d250c380b200521810120b801207c470d150c140b20052181012085010d1f0c380b200521810120b801207c470d170c160b2009208b016a218101200928020021c4010b410121bb01410021ba0120c301218401200320c40136027c20080d1e0c330b2009208b016a218101200928020021c4010b410021bb01410121ba0120c301218401200320c40136027c20080d1d0c310b2009208b016a218101200928020021c4010b410021ba01410021bb0120c301218401200320c40136027c20080d1d0c2f0b0340208201208801460d31200341286a208201109f032003280228228301450d312082012087016a218201208301208301200328022c208d01746a22b901470d2d0c000b0b20c101220520e3016a21c101200528020021bb02200341e0006a21bc02200328026421bd020c140b024020c1022d0000220520c302460d000240200520cf02460d00200520c702470d2f20c10228020c2205450d2f20c10228020422d102200520d0026c6a21d202410a21720c290b20c10228020421d602200341e0006a21d702200328026421d8020c150b20c10228020c2205450d2d20c10228020422d902200520c4026c6a21da02410c21720c290b412c10222205450d04200541286a41002800fab244360000200541206a41002900f2b244370000200541186a41002900eab244370000200541106a41002900e2b244370000200541086a41002900dab244370000200541002900d2b2443700000c320b411e10222205450d04200541166a41002900c0b344370000200541106a41002900bab344370000200541086a41002900b2b344370000200541002900aab344370000429e808080e003210c0c320b200341c8056a290300210c2008102020050d3241002108412c21232020450d360b2021202020236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c412c216d4201216e41d8b3c400216f4101211f0c040b412c41011023000b412c41011023000b411e41011023000b4100211f410121050c360b410121050c350b410421720c120b410321720c120b410421720c120b410321720c120b410521720c120b410621720c120b410521720c120b410621720c120b410721720c120b410821720c120b410921720c120b410b21720c130b410121050c150b410121050c140b410221050c130b410221050c120b410221050c110b410221050c100b410421050c0f0b410421050c0e0b410421050c0d0b410421050c0c0b410421050c0b0b410421050c0a0b410421050c090b410421050c080b410421050c070b410421050c060b410421050c050b410421050c040b410421050c030b410421050c020b410421050c010b208301450d0320830128020021c401410121b801410221ba01208301208b016a218301410121bb0120c301218401200320c40136027c2008450d01410221050b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e05000102030f0f0b208501450d39410121050c360b4100218501410221bb014100218401200320c30122c40136027c2008450d36410221050c350b200f20c4014d0d05200820c401208d01746a2802002209450d0b20bd0120bc01470d0320bc01207c6a220520bc01490d4920bc01207c74220a20052005200a491b22bd01ad20800186220c20990188a70d49200ca72205207f480d4920bc01450d0120bf0120bc01208d01742005102122be010d020c090b208301208b016a2105208301450d0320830128020021c401410021bb01410221ba01410121b801200521830120c301218401200320c40136027c20080d170c340b2005102222be01450d070b20be0121bf0120be0121c00120be0121c1010b20c10120bc01208d01746a20c401360200200341c0056a200328027c22c501200341c8006a10d603209c0128020021c60120032802c40521c20120032802c00522c701207c460d0220c2012802082205209d014c0d4420c2012d000c210b024002402005450d0020c201280200210720051022220a450d06200a200720051084041a0c010b4101210a0b20c201209e016a2d000021072003200936029c012003200328027c360298012003207f36029001200320073a008d012003200b3a008c01200320053602880120032005360284012003200a3602800102400240200328027022c801208601460d00200328027421c9010c010b209f01102222c801450d07410021c90120c80141003b010620c801410036020020c801209b016a200341c0056a20a0011084041a20034100360274200320c8013602700b20bc01207c6a21bc010c090b410221ba01410121b80120052183012085010d110c320b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c40520034198bdc4003602c0052003200341fc006a3602a003200341b0046a200341c0056a102b20032902b404228001422088a7210920032802b00421c201208001a721c6010c010b209a0128020021090b20032802702003280274200341f8006a28020010d703024020bd01450d0020be0110200b0240207d450d00207d412c6c217c207e210503402005104d2005412c6a2105207c41546a227c0d000b0b0240200341d4006a280200450d00207e10200b200020c20136020420004101360200200041086a2009ad42208620c601ad843702002008450d38200f450d3820081020200424000f0b200541011023000b200541041023000b41940341041023000b4102211f410121050c3b0b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0d000102060708090b0c0f101112120b207020256a22732802002274450d4c2070202c6a2175410021760c400b20c801209b016a210a20c8012f01062207208d01742109417f21050240024002400240024003402009450d012005207c6a2105207f209d01207c200a280200220b20c5014b1b200b20c501461b220b450d04200920b5016a2109200a208b016a210a200b207c460d000b20c9010d010c020b2007210520c901450d010b20c901209d016a21c90120c8012005208d01746a209f016a28020021c801410121720c370b200341f0006a209b016a22092009280200207c6a360200200329039801210c20032903900121ca0120032903880121cb0120032903800121cc0120c8012f0106220920a2014f0d0120c801209b016a220a2005207c6a220b208d01746a200a2005208d01746a220a200920056b208d01741085041a200a20c50136020020c8012093016a2209200b20a301746a2009200520a301746a220920c80120a1016a220a2f010020056b20a301741085041a200920a4016a200c370200200920ca01370210200920cb01370208200920cc01370200200a200a2f0100207c6a3b010020c701450d220c470b20c801200520a301746a22052098016a200329039801370200200520ac016a220929020021ca01200920032903900137020020052094016a20032903880137020020052093016a2205290200210c200520032903800137020020ca0120b7018320800185500d45200c20b60183500d45200ca710200c450b209f0110222209450d1b2009207f3b01062009207f3602002009209b016a200341c0056a20a001108404210b200341c0056a20a4016a22cd0120c80120a5016a290200370300200341c0056a208f016a22ce0120c80120a6016a290200370300209c0120c80120a7016a290200370300200320c8012902f4013703c00520c80128022021cf01200b20c8012092016a20c80120a1016a22072f010020a8016a220a208d0174108404210b20092093016a20c80120a9016a200a20a30174108404210d200720a1013b01002009200a3b0106200341b0046a20a4016a22d00120cd01290300370300200341b0046a208f016a22d10120ce01290300370300200341b0046a209b016a22d201209c01290300370300200320032903c0053703b00402400240200520a1014b0d0020c801209b016a220a2005207c6a220b208d01746a200a2005208d01746a220720c80120a1016a220a2f010020056b208d01741085041a200720c50136020020c8012093016a2207200b20a301746a2007200520a301746a220b200a2f010020056b20a301741085041a200b20a4016a200c370200200b20ca01370210200b20cb01370208200b20cc013702000c010b200b200520b2016a221f208d01746a200b200520a8016a2207208d01746a2205200a20ad017120076b208d01741085041a200520c501360200200d201f20a301746a200d200720a301746a2205200920a1016a220a2f010020076b20a301741085041a200520a4016a200c370200200520ca01370210200520cb01370208200520cc013702000b200a200a2f0100207c6a3b0100200341a0036a20a4016a22d30120d001290300370300200341a0036a208f016a22d40120d101290300370300200341a0036a209b016a22d50120d201290300370300200320032903b0043703a00320034190026a20a4016a22d60120d30129030037030020034190026a208f016a22d70120d40129030037030020034190026a209b016a22d80120d501290300370300200320032903a0033703900220c80128020022d901450d0120c8012f010421da01200921db010c260b20d30120d60129030037030020d40120d70129030037030020d50120d80129030037030020032003290390023703a00320da0120ad0171210720d9012f0106220520ae014d0d0220aa011022220b450d1b200b207f3b0106200b207f360200200b209b016a200341c0056a20ab01108404210920d9012090016a280200217920cd0120d90120a5016a29020037030020ce0120d90120a6016a290200370300209c0120d90120a7016a290200370300200320d90120b0016a2902003703c005200920d9012092016a20d90120a1016a221f2f0100220a20a8016a2205208d01741084042122200b2093016a20d90120a9016a200520a301741084042178200b209f016a20d90120b1016a200a20b2016a220d208d01741084042120201f20a1013b0100200b20053b01060240200d450d00410021052020210903402009280200220a20053b0104200a200b3602002009208b016a2109200d2005207c6a2205470d000b0b20d00120cd0129030037030020d10120ce0129030037030020d201209c01290300370300200320032903c0053703b00420cd0120d00129030037030020ce0120d101290300370300209c0120d201290300370300200320032903b0043703c0050240024020da0120ad0171220920a1014b0d0020d901209b016a22052007207c6a220d208d0174220a6a20052007208d017422206a2205201f2f0100222220076b2278208d01741085041a200520cf0136020020d9012093016a2205200d20a301746a2005200720a301746a2205207820a301741085041a200520a4016a20d3012903003702002005208f016a20d4012903003702002005209b016a20d501290300370200200520032903a003370200201f2022207c6a22053b010020d901209f016a221f20206a209b016a201f200a6a221f200520ad0171220a200d6b208d01741085041a201f20db013602002009200a4f0d0120d90120206a20af016a21050340200528020022092007207c6a22073b0104200920d9013602002005208b016a2105200a2007470d000c020b0b2022200720b2016a220a208d0174221f6a2022200720a8016a2205208d01746a2209200b20a1016a220d2f010020056b208d01741085041a200920cf013602002078200a20a301746a2078200520a301746a2209200d2f010020056b20a301741085041a200920a4016a20d3012903003702002009208f016a20d4012903003702002009209b016a20d501290300370200200920032903a003370200200d200d2f0100207c6a22093b010020202007208d017422226a20b3016a2020201f6a220d200920ad01712207200a6b208d01741085041a200d20db01360200200a20074b0d00200b20226a20b4016a210903402009280200220a2005207c6a22053b0104200a200b3602002009208b016a210920072005470d000b0b20d60120cd0129030037030020d70120ce0129030037030020d801209c01290300370300200320032903c00537039002024020d9012802002205450d0020d9012f010421da01200521d901207921cf01200b21db01410221720c360b207921cf0120aa01102222050d010c1c0b2009210b20aa0110222205450d1b0b2005207f3b01062005207f3602002005209b016a200341c0056a20ab0110840421072005200328027022093602940320032003280274207c6a3602742009207f3b01042003200536027020092005360200200520052f0106220a20a301746a22092098016a20d601290300370200200920ac016a20d70129030037020020092094016a20d80129030037020020092093016a2003290390023702002007200a208d01746a20cf013602002005209f016a200a207c6a2209208d01746a200b360200200520093b0106200b20093b0104200b200536020020c7010d420c1c0b20d901209b016a22092007207c6a220a208d0174220b6a20092007208d0174220d6a2209200520076b221f208d01741085041a200920cf0136020020d9012093016a2209200a20a301746a2009200720a301746a2209201f20a301741085041a200920a4016a20d3012903003702002009208f016a20d4012903003702002009209b016a20d501290300370200200920032903a00337020020d90120a1016a2005207c6a22053b010020d901209f016a2209200d6a209b016a2009200b6a2209200520ad0171220b200a6b208d01741085041a200920db013602002007200b4f0d4020d901200a209d016a2205208d01746a20af016a210903402009280200220a2005207c6a22053b0104200a20d9013602002009208b016a2109200b2005470d000c410b0b208201208801460d4a200341206a208201109f032003280220228301450d4a2082012087016a2182012083012003280224208d01746a21b901410421720c330b20830120b901460d21208301450d4920830128020021c401410121b801410221ba01208301208b016a218301410121bb0120c301218401200320c40136027c20080d2b0c470b024020830120b901460d00208301208b016a2105208301450d0220830128020021c401410021bb01410221ba01410121b801200521830120c301218401200320c40136027c20080d290c470b410121b80120830121b901410621720c330b410221ba01208201208801460d03200341106a208201109f032082012087016a21820120032802102205450d2220052003280214208d01746a21b90120052183010c200b410221ba01410121b80120052183012085010d240c460b410121b80120830121b901410821720c320b410221ba01208201208801470d010b2088012182012085010d200c430b200341186a208201109f032082012087016a21820120032802182205450d1e20052283012005200328021c208d01746a22b901470d250c1c0b20bc02280200220b20de016a210a200b2f0106220d20e001742109417f210502400240024003402009450d01200520e6016a210520e70120e40120e601200a280200220720bb024b1b200720bb02461b2207450d03200920e8016a2109200a20e3016a210a200720e601460d000b20bd020d010c080b200d210520bd02450d070b20bd0220e4016a21bd02200b200520e001746a20e5016a21bc02410921720c300b200b20ea016a200520e901746a2220450d0520202802182109202028021c210520eb01200e36020020ed0120ee013a000020f00120f1013a000020f201200536020020f40120f5013a000020f601200e36020020f80120f9013a000020fa01200936020020fc0120fd013a000020ff012080023a000020820220e7013a00002084022085023b01002087022088023a00002089022002360200208b0220f5013a0000208c02200e360200208e0220f9013a0000200341c0056a20ea016a2278200e36020020900220ee013a00002092022093023a0000209502200536020020dd0120f5013a00002003200e3602c405200320f9013a00c0052020280208220d20dc016a2205ad220c20970288a70d52200c20960286a7220920e4014c0d52202020de016a2122024002400240024002402009450d00200910222207450d0d2022280200220d450d020c010b41082107200d450d010b4100210b410021090340024020092005470d00200520e6016a220a2005490d58200520e60174221f200a200a201f491b220aad20960286220c20990288a70d58200ca7221f20e701480d58024002402005450d002007200520e30174201f102122070d010c0b0b201f10222207450d0a0b200a21050b2007200b6a220a2098023a0000200a20e3016a2009360200200a20ba026a200341a0036a20e0016a2d00003a0000200a20e6016a20032f01a0033b0000200b20dc016a210b200920e6016a220a2109200d200a470d000b2005200a6b2098024f0d020c010b4100210a200541006b2098024f0d010b200a2098026a2209200a490d54200520e60174220b20092009200b491b2209ad20960286220c20990288a70d54200ca7220b20e701480d54024002402005450d002007200520e30174200b102122070d010c0e0b200b10222207450d0d0b200921050b200341b0046a200341c0056a10d8032007200a20e301746a220920032903b004370300200920de016a200341b0046a20de016a220b290300370300200341b0046a20dd0110d8032009209a026a200b290300370300200920032903b004370310200341b0046a20920210d8032009209b026a200b29030037030020092091026a20032903b004370300200341b0046a20900210d8032009209c026a200b2903003703002009208f026a20032903b004370300200341b0046a208e0210d8032009209d026a200b2903003703002009208d026a20032903b004370300200341b0046a208b0210d8032009209e026a200b2903003703002009208a026a20032903b004370300200341b0046a20870210d8032009209f026a200b29030037030020092086026a20032903b004370300200341b0046a20840210d803200920a0026a200b29030037030020092083026a20032903b004370300200341b0046a20820210d803200920a1026a200b29030037030020092081026a20032903b004370300200341b0046a20ff0110d803200920a2026a200b290300370300200920fe016a20032903b004370300200341b0046a20fc0110d803200920a3026a200b290300370300200920fb016a20032903b004370300200341b0046a20f80110d803200920a4026a200b290300370300200920f7016a20032903b004370300200341b0046a20f40110d803200920a5026a200b290300370300200920f3016a20032903b004370300200341b0046a20f00110d803200920a6026a200b290300370300200920ef016a20032903b004370300200341b0046a20ed0110d803200920a7026a200b290300370300200920ec016a20032903b00437030002400240024002402005200a2098026a2209470d00200520e6016a22092005490d57200520e60174220b20092009200b491b221fad20960286220c20990288a70d57200ca7220920e701480d572005450d012007200520e301742009102122070d020c100b2005211f0c020b200910222207450d0e0b200521090b2007200920e301746a22052080023a0000200520de016a20a802290000370000200520032900b004370001200341b0046a20034180016a20a9021084041a20dc0110222209450d0620092080023a0000200341a0036a200341b0046a20a9021084041a2022280200220520e4014c0d52024002402005450d002020280200210b20051022220d450d0b200d200b2005108404210b20051022220d450d0c200d200b20051084041a200b10202005ad210c0c010b4101210d4101410120051084041a2005ad210c410021050b200341b0046a200341a0036a20a9021084041a202031000d21ca01200341a0036a200341b0046a20a9021084041a200341b0046a200341a0036a20a9021084041a20034190026a200341b0046a20a9021084041a20dc011022220b450d07200a20dc016a210a20be0220aa028322be02200c8420ca0120ac02868420ad0284210c200b2080023a0000200b1020200341a0036a20034190026a20a9021084041a200341b0046a200341a0036a20a9021084041a024020092d000020ae02470d00200928020820af0271450d00200928020410200b2009102020034190026a200341b0046a20a9021084041a200341b0046a20034190026a20a9021084041a20b00220e701360200200341a0036a209b026a200a36020020b202201f360200200341a0036a2091026a200736020020b30220e701360200200341a0036a2094026a20960237020020b402200c370200200341a0036a20de016a20053602002003200d3602a403200320e6013602a003200341b0046a200341a0036a10a60320034180016a200341b0046a20a9021084041a202020e601360210202020e201360214024020032d00c00520ae02470d0020df0128020020af0271450d0020032802c40510200b024020dd012d000020ae02470d00200341c0056a209a026a28020020af0271450d0020950228020010200b02402092022d000020ae02470d00200341c0056a209b026a28020020af0271450d00200341c0056a20b1026a28020010200b02402090022d000020ae02470d00200341c0056a209c026a28020020af0271450d00207828020010200b0240208e022d000020ae02470d00200341c0056a209d026a28020020af0271450d00208c0228020010200b0240208b022d000020ae02470d00200341c0056a209e026a28020020af0271450d0020890228020010200b02402087022d000020ae02470d00200341c0056a209f026a28020020af0271450d0020b50228020010200b02402084022d000020ae02470d00200341c0056a20a0026a28020020af0271450d0020b60228020010200b02402082022d000020ae02470d00200341c0056a20a1026a28020020af0271450d0020b70228020010200b024020ff012d000020ae02470d00200341c0056a20a2026a28020020af0271450d0020b80228020010200b024020fc012d000020ae02470d00200341c0056a20a3026a28020020af0271450d0020fa0128020010200b024020f8012d000020ae02470d00200341c0056a20a4026a28020020af0271450d0020f60128020010200b024020f4012d000020ae02470d00200341c0056a20a5026a28020020af0271450d0020f20128020010200b024020f0012d000020ae02470d00200341c0056a20a6026a28020020af0271450d0020b90228020010200b024020ed012d000020ae02470d00200341c0056a20a7026a28020020af0271450d0020eb0128020010200b20be0220ab028421be0220e20120e6016a21e20120c10120e101470d130c420b20d10228020c0d3420d10228021021d302200341e0006a21d402200328026421d5020c310b20d702280200220b20c7026a210a200b2f0106220d20c502742109417f21050240024003402009450d01200520ca026a210520cb0220c80220ca02200a280200220720d6024b1b200720d602461b2207450d04200920cc026a2109200a20c6026a210a200720ca02460d000b20d8020d010c400b200d210520d802450d3f0b20d80220c8026a21d802200b200520c502746a20c9026a21d702410b21720c2e0b20d9022802182205450d3120d90228021022db02200520c502746a21dc02410221050c300b200b20ce026a200520cd02746a2205450d3c2005280210450d0c20c10220c6026a20052802143602000c3c0b201f41081023000b41a8bdc4004180011039000b411041081023000b411041081023000b200941081023000b200541011023000b200541011023000b200b41081023000b200941081023000b41940341041023000b41c40341041023000b41c40341041023000b41a8bec40041351039000b4102211f0c020b4102211f0c020b4103211f0c020b410121050c3c0b410121050c3b0b410121050c3a0b410121720c0d0b410221720c0e0b410321720c0f0b410521720c100b410721720c110b410021050c210b410021050c200b410121050c1f0b410121050c1e0b410121050c1d0b410221050c1c0b410221050c1b0b410221050c1a0b410321050c190b410421050c180b410421050c170b410421050c160b410421050c150b410421050c140b410421050c130b410421050c120b410421050c110b410421050c100b410421050c0f0b410421050c0e0b410421050c0d0b410021050c010b410121050b0340024002400240024002400240024002400240024002400240024002400240024002400240024020050e03000102020b207620744f0d020240024002400240024020752802002076202d7422206a22052d0000202a470d0020032005202d6a2205360290022008450d08200f200528020022054d0d0420082005202e746a2802002209450d00202f200e360200203020313a0000203220333a000020342009360200203520363a00002037200e360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200e360200204720393a00002048200e360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200e3602c40520732802002222207620286a221f490d0a2073207636020020752802002105200341b0046a202b6a220d2027360200200341b0046a204d6a227820753602002050200520206a2207204d6a220b3602002003201f3602b004200341b0046a202c6a22792005201f202d74227a6a227b3602002026200341c0056a36020020032022201f6b22743602b404200b2105024020072d0000220a2051460d00410021050340200720056a21090240200a206c712052470d002009204f6a280200205371450d002009202d6a28020010200b2005450d0320502009204a6a3602002005204d6a21052009204d6a2d0000220a2051470d000b200720056a204d6a21050b2005207b470d020c030b410121050c150b2009204d6a2205207b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a28020010200b200b2005470d000b0b024002400240024002402074450d00201f20702802142205470d0120272220200341c0056a22096b202d7622050d020c040b2075202610d903205028020022052079280200220b470d140c150b20202005202d7422056b210a207528020020056a2105200341c0056a22092027460d01034020262009204d6a360200200341a0036a200910d80320032d00a0032051460d13200520032903a0033703002005204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240200a450d002005204d6a2105200a206b6a210a20262802002209200d280200470d010c030b0b200d2802002220202628020022096b202d762205450d020b02400240024002402078280200220b202d6a2207280200220a20226b20054f0d00202220056a227b2022490d39200a2028742222207b207b2022491b2222ad206886220c206988a70d39200ca7227b203f480d39200a450d01200b280200200a202d74207b1021220a0d020c0d0b200b280200210a0c020b207b1022220a450d0b0b200b200a360200200720223602000b200a201f20056a2207202d746a200a207a6a2074202d741085041a200320073602b0042007200b280208220a460d01207620056a202d74200a202d7422056b210a200b28020020056a210520092020460d00034020262009204d6a360200200341a0036a200910d80320032d00a0032051460d12200520032903a0033703002005204f6a200341a0036a204f6a290300370300200b204f6a2209200928020020286a360200200a450d022005204d6a2105200a206b6a210a20262802002209200d280200470d000b0b200320513a00a003205028020022052079280200220b470d110c120b200341a0036a204f6a2205203f360200200320673703a003200341a0036a202610d90320032802a003222220052802002209202d7422076a210b20032802a403217b2022210502402009450d00024002400240024020782802002220202d6a2274280200220520032802b404220d20032802b00422096a221f6b2007202d75220a4f0d00201f200a6a227a201f490d382005202874221f207a207a201f491b221fad206886220c206988a70d38200ca7227a203f480d382005450d0120202802002005202d74207a102122050d020c0d0b202028020021050c020b207a10222205450d0b0b202020053602002074201f3602000b20052009200a6a220a202d74221f6a20052009202d746a200d202d741085041a2003200a3602b00420222105200a20202802082209460d0020202802002205201f6a217420052009202d746a210a2022210903402007450d0e200341a0036a202e6a22052009206a6a2d00003a0000200320092f00013b01a00320092d0000220d2051460d0d2009202d6a290200210c2009202c6a280200211f200a200d3a0000200a202c6a201f360200200a202d6a200c37020020032f01a003210d200a206a6a20052d00003a0000200a20286a200d3b00002020204f6a2205200528020020286a3602002007206b6a21072009204d6a22052109200a204d6a220a2074470d000b0b2005200b460d0e0c0d0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a102b20032802b0042205450d1c20032902b4042180012000200536020420004101360200200041086a2080013702002008450d28200f450d28200810200c280b20d402280200220b20c7026a210a200b2f0106220d20c502742109417f210502400240024003402009450d01200520ca026a210520cb0220c80220ca02200a280200220720d3024b1b200720d302461b2207450d03200920cc026a2109200a20c6026a210a200720ca02460d000b20d5020d010c160b200d210520d502450d150b20d50220c8026a21d502200b200520c502746a20c9026a21d402410121050c120b200b20ce026a200520cd02746a2205450d132005280210450d0720d10220bf026a20052802143602000c130b20db02222020c6026a21db022020280200210b200341e0006a21052003280264211f024003402005280200220720c7026a210a20072f0106222220c502742109417f210502400240024003402009450d01200520ca026a210520cb0220c80220ca02200a280200220d200b4b1b200d200b461b220d450d03200920cc026a2109200a20c6026a210a200d20ca02460d000b201f0d010c040b20222105201f450d030b201f20c8026a211f2007200520c502746a20c9026a21050c010b0b200720ce026a200520cd02746a2205450d002005280210450d03202020052802143602000b20db0220dc02470d070c110b41c8b3c4002076207410b501000b4186b2c40041cc001039000b41a8bec40041351039000b418cb8c400102f000b207b41081023000b207a41081023000b41a8bec40041351039000b410221050c080b2009204d6a2205200b470d010c020b200b2205200b460d010b03400240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010200b2005204d6a2205200b470d000b0b207b450d00202210200b205028020022052079280200220b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a28020010200b200b2005470d000b0b024020032802b4042205450d00024020032802b004220b20782802002207204f6a220a2802002209460d00200728020022072009202d746a2007200b202d746a2005202d741085041a0b200a200520096a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c40510200b0240204e2d00002052470d00200341c0056a202b6a280200205371450d00207728020010200b0240204b2d00002052470d002054280200205371450d00205528020010200b024020492d00002052470d002056280200205371450d00204828020010200b024020472d00002052470d002057280200205371450d00204628020010200b024020452d00002052470d002058280200205371450d00204428020010200b024020422d00002052470d002059280200205371450d00205a28020010200b024020402d00002052470d00205b280200205371450d00205c28020010200b0240203e2d00002052470d00205d280200205371450d00205e28020010200b0240203c2d00002052470d00205f280200205371450d00206028020010200b0240203b2d00002052470d002061280200205371450d00203a28020010200b024020382d00002052470d002062280200205371450d00203728020010200b024020352d00002052470d002063280200205371450d00203428020010200b024020322d00002052470d002064280200205371450d00206528020010200b024020302d00002052470d002066280200205371450d00202f28020010200b410f21050b200520766a2276207328020022744f0d0a410021050c000b0b20d90220c4026a22d90220da02460d0b410c2172410421050c090b20d10220d0026a22d10220d202460d0a410a2172410421050c080b20c701450d010b20c601450d0120c20110204102211f0c020b4102211f0c020b4102211f0c020b410121050c160b410121050c150b410121050c140b2070202b6a22702071460d0d41002172410421050c000b0b4186b2c40041cc001039000b20c10220c0026a22c10220c202460d024104211f410121050c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360207d412c6c2105207e41586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b207d412c6c2105207e41606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b411021dc01200341c0056a41106a22dd01200341c8006a41106a280200360200410821de01200341c0056a41086a22df01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a10a10320bc01450d00410221e00120c10120bc014102746a21e1012005200a6a21e201410421e301417f21e40141940321e501410121e601410021e701417c21e801410521e901413421ea01200341a4076a21eb0141e00121ec01200341c0056a41e0016a21ed01411321ee0141d00121ef01200341c0056a41d0016a21f00141d70021f10120034184076a21f20141c00121f301200341c0056a41c0016a21f401412d21f501200341f4066a21f60141b00121f701200341c0056a41b0016a21f801411221f901200341e4066a21fa0141a00121fb01200341c0056a41a0016a21fc01410b21fd0141900121fe01200341c0056a4190016a21ff014106218002418001218102200341c0056a4180016a21820241f000218302200341c0056a41f0006a21840241840821850241e000218602200341c0056a41e0006a218702413721880220034194066a21890241d000218a02200341c0056a41d0006a218b0220034184066a218c0241c000218d02200341c0056a41c0006a218e024130218f02200341c0056a41306a2190024120219102200341c0056a41206a21920241d6002193024114219402200341c0056a41146a2195024204219602421c219702410f21980242202199024118219a024128219b024138219c0241c800219d0241d800219e0241e800219f0241f80021a00241880121a10241980121a20241a80121a30241b80121a40241c80121a50241d80121a60241e80121a702200341b7046a21a802418c0121a902428080808080804021aa024280808080808c0121ab02422821ac024280808080800c21ad02410921ae0241ffffffff0321af02200341cc036a21b002412421b102200341a0036a41246a21b202200341bc036a21b302200341ac036a21b402200341a4066a21b502200341b4066a21b602200341c4066a21b702200341d4066a21b80220034194076a21b902410321ba024103211f0c020b024020bd01450d0020c00110200b200341c0056a20034180016a418c011084041a200341b0046a200341c0056a10a303411021bf02200341b0046a41106a2802002205450d00412c21c00220032802b80422c1022005412c6c6a21c202410a21c302411c21c402410221c502410421c602410821c702417f21c80241940321c902410121ca02410021cb02417c21cc02410521cd02413421ce02410921cf02411421d0024104211f0c020b200341bc046a29020021800120032802b004210520032902b40421990120032802602003280264200328026810d703200020bf026a208001370200200041086a20990137020020002005360204200041003602002008450d06200f450d0620081020200424000f0b410121050c0c0b410121050c0b0b42ac808080c005210c0b200810200b2000200536020420004101360200200041086a200c3702000b200141086a280200217c0240200141106a2802002203450d002003412c6c2105207c210303402003104d2003412c6a2103200541546a22050d000b0b2001410c6a280200450d00207c10200b200424000f0b202120236a22212024470d010b200341c8006a41106a2205200141106a280200360200200341c8006a41086a227c200141086a290200370300200320012902003703482005280200227d20236c2105207c280200227e41586a217c0240024003402005450d01200541546a2105207c41286a2109207c20236a227f217c20092d00004108470d000b200341386a207f10980320032802382109200328023c21050c010b410021090b2005410020091b210a207d412c6c2105207e41586a217c200941c8d7c40020091b2181010240024003402005450d01200541546a2105207c41286a2109207c412c6a227f217c20092d0000410a470d000b200341306a207f10980320032802302109200328023421050c010b410021090b2005410020091b210b207d412c6c2105207e41586a217c200941c8d7c40020091b2182010240024003404100217f2005450d01200541546a2105207c41286a2109207c412c6a228301217c20092d00004109470d000b20830128020021840141012185010c010b41002185010b200342003702744180e5c20021860120034180e5c200360270411c218701208201200b411c6c6a2188014114218901208101200a41146c6a218a014104218b0141ff01218c014101217c4102218d0141cf00218e014110218f014120219001412821910141242192014134219301413c219401413821950141d00021960141c80021970141cc0021980142022180014220219901200341cc056a219a014108219b01200341c0056a41086a219c01417f219d01410d219e01419403219f01418c0321a001410621a101410b21a201410521a301411821a401418c0221a50141840221a60141fc0121a701417921a80141940221a90141c40321aa0141bc0321ab0141c40021ac0141ffff0321ad01410a21ae0141980321af0141f40121b00141b00321b101417a21b201416c21b30141fc0221b401417c21b50142808080807021b60142ffffffff0f21b701410021b801410021b901410021ba01410021bb01410021bc01410021bd01410421be01410421bf01410421c001410421c1010c010b4101211f0c010b4102211f0c010b410121050c010b410121050c000b0b1031000b1024000b130020004105360204200041c8b3c3003602000b13002000410836020420004194bcc3003602000b1300200041083602042000419cbcc3003602000b3201017f0240410810222202450d0020004288808080800137020420002002360200200242013700000f0b410841011023000b860100024002400240024002400240200041ff017122004101460d0020004102470d01410110222200450d03200041023a00000c020b410110222200450d03200041013a00000c010b410110222200450d03200041003a00000b20012802002001280204200041011003200010200f0b410141011023000b410141011023000b410141011023000bb20201027f230041106b2202240020024100360208200242013703000240412010222203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a20021098012002200041106a36020c2002410c6a2002109801200028022021032002200041286a280200220036020c2002410c6a2002103e02402000450d002003200041186c6a210003402002200336020c2002410c6a2002109801200341106a20021096012000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100302402003450d00200010200b200241106a24000f0b412041011023000bfa0801067f230041106b220224002002410036020820024201370300200041106a2002103e2002200036020c2002410c6a200210980120022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d0320022802002004200310212205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d0420022802002004200310212205450d050c060b200228020021050c080b200228020021050c050b2003102222050d050b200341011023000b2003102222050d010b200341011023000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d0120052003200710212205450d020c030b200441206a21060c030b2007102222050d010b200741011023000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d0120052003200410212205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d0220052003200010212205450d030c040b2004102222050d050b200441011023000b2000102222050d010b200041011023000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010032004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d0120022802002005200610212203450d020c040b200228020021030c040b2006102222030d020b200641011023000b1024000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610032005450d010b200310200b200241106a24000b13002000410f360204200041e0cfc3003602000b130020004107360204200041deecc3003602000bb50707057f047e017f017e037f047e017f230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100122062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d00200241e0006a41186a2003290300370300200241e0006a41106a2004290300370300200241e0006a41086a20052903003703002002200229038001370360200241c8006a2001108c012002290348a7450d01200241c8006a41106a290300210720022903502108200241306a2001108c012002290330a7450d02200241c0006a29030021092002290338210a200241286a2001108e012002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d0320061022220d450d06200b450d040c070b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b1031000b200641081023000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a2001108c012002290310a7450d01200e290300211020022903182111200220011091012002290300a7450d01200341016a21062002290308211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d200420141021220d0d010c070b20141022220d450d060b200d20046a2203201037030820032011370300200341106a2012370300200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d10200c010b200d450d0020024180016a41186a2201200241e0006a41186a29030037030020024180016a41106a2206200241e0006a41106a29030037030020024180016a41086a2203200241e0006a41086a2903003703002002200229036037038001200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a200229038001370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241a0016a24000f0b20004100360220200241a0016a24000f0b1024000b201441081023000b130020004118360204200041d8efc3003602000b02000bf30301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a1098012002200336023c2002413c6a200241306a1098012002280220210320022004280200220436023c2002413c6a200241306a103e0240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009102122070d020c070b200441206a2108200228023021070c020b200910222207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a109801200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a28020010200b200241c0006a24000f0b1024000b200941011023000b7101017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a103e2002200241086a36022c2002412c6a200241206a109801200041086a200228022836020020002002290320370200200241306a24000b3201017f0240410810222202450d00200042888080808001370204200020023602002002420c3700000f0b410841011023000b3401017f0240410410222202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b410441011023000b3201017f0240410410222202450d0020004284808080c000370204200020023602002002413c3600000f0b410441011023000b3201017f0240410410222202450d0020004284808080c00037020420002002360200200241043600000f0b410441011023000b0900200042003702000ba30d04057f017e197f027e230041f0026b2204240002400240410d10222205450d00200541056a41002900fe9d44370000200541002900f99d443700002005410d412d10212205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1000200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001024002400240024002400240200441e0016a412041c8d7c400410041001001417f460d00200441003a00a002200441e0016a4120200441a0026a41014100100141016a41014d0d0520042d00a002220641034f0d052005102020064101460d0320064102470d01200441a0026a200110f80220042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a2002200310a90220043502384201852102200441386a41106a2903002103200441386a41086a29030021090c040b200510200b200441f8006a200110f80220042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a10b101200441c0016a41186a22082005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2007290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2008290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2007290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002007201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002008200729030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220082008290300220920027c22233703002011201129030020037c2023200954ad7c37030020062903002109200420042903a002222320027c22243703a0022006200920037c2024202354ad7c370300200441c0016a20012002200310a90220043502c0012102200a2903002103200b2903002109200441f8006a200441a0026a10bc0302402005280200450d00200441a0026a41206a28020010200b200242018521020c020b420021020c010b200441a0026a20012002200310a90220043502a0024201852102200441b0026a2903002103200441a8026a29030021090b2000200937030820002002370300200041106a2003370300200441f0026a24000f0b419a88c00041331039000b410d41011023000b412d41011023000bdb0201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f10b30202400240410e10222203450d00200341066a41002900d5cf43370000200341002900cfcf433700002003410e412e10212203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1000200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a10ad0320031020200241d0006a24000f0b410e41011023000b412e41011023000b02000bec0301087f23004180016b22032400200341c0006a20011081030240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110810320032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000bd70502047f017e230041d0006b2203240002400240024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044b0d002002280200220620054103746a2d000522054104460d02200341386a20012002200510c10320032d00384101470d012000200329023c370200200041086a200341c4006a280200360200200341d0006a24000f0b411810222202450d05200241106a41002900f6af44370000200241086a41002900eeaf44370000200241002900e6af4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341a8aac4003602382003200341206a3602102003200341106a3602482000200341386a102b2003280224450d0320032802201020200341d0006a24000f0b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d020b411810222202450d03200241106a41002900f6af44370000200241086a41002900eeaf44370000200241002900e6af4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341a8aac4003602382003200341206a3602102003200341106a3602482000200341386a102b2003280224450d00200328022010200b200341d0006a24000f0b200141086a280200210220032007370308024020022007a7470d0020004100360200200341d0006a24000f0b2003412c6a4102360200200341cc006a410236020020034102360224200320023602342003420237023c20034188a9c4003602382003200341086a3602282003200341346a3602202003200341206a360248200341106a200341386a102b200041086a200341106a41086a28020036020020002003290310370200200341d0006a24000f0b411841011023000b411841011023000bc70301017f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005412c6a4102360200200541cc006a4102360200200541023602242005420337023c200541e4a6c40036023820052005410c6a3602282005200541086a3602202005200541206a360248200541106a200541386a102b200041086a200541106a41086a28020036020020002005290310370200200541d0006a24000f0b2001280200210220054100360234024020022802080d00200541cc006a4101360200200541023602142005420237023c200541f8adc4003602382005200541346a3602102005200541106a360248200541206a200541386a102b20052802202202450d002000200529022437020420002002360200200541d0006a24000f0b200541386a200141186a2202200141286a2203200410c103024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b200541386a20022003410010c103024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b20004100360200200541d0006a24000bbe0601037f230041d0006b22042400200420033a000f024002400240024020022802082205417f6a220620054f0d00200620054b0d00200141086a2802002105200228020020064103746a22062802002102024020062d0006450d0020052002460d040b02400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d000022024104460d0520024105470d01411810222202450d04200241106a41002900f6af44370000200241086a41002900eeaf44370000200241002900e6af4437000020044298808080800337022420042002360220200441c4006a41013602002004412a36024c20044201370234200441a8aac4003602302004200441206a3602482004200441c8006a360240200441106a200441306a102b02402004280224450d00200428022010200b200041013a0000200041046a20042903103702002000410c6a200441106a41086a280200360200200441d0006a24000f0b412b10222202450d02200041013a0000200241276a41002800e2a944360000200241206a41002900dba944370000200241186a41002900d3a944370000200241106a41002900cba944370000200241086a41002900c3a944370000200241002900bba944370000200041086a42ab808080b005370200200041046a2002360200200441d0006a24000f0b0240200341ff017122054104460d0020022005460d00200420023a0048200441206a410c6a412b360200200441c4006a41023602002004412b36022420044202370234200441e8a9c4003602302004200441c8006a36022820042004410f6a3602202004200441206a360240200441106a200441306a102b200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441d0006a24000f0b200041003a0000200020023a0001200441d0006a24000f0b02404118102222020d00411841011023000b2004421837023420042002360230200441306a4100411810cc0320042004280238220241186a3602382002200428023022056a411841e6afc400411810cd03200420042902343702342004200536023041c3a5c4004134200441306a10ce03000b412b41011023000b411841011023000b20004180083b0100200441d0006a24000b9d0601037f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005411c6a4102360200200541cc006a4102360200200541023602142005420337023c200541e4a6c40036023820052005410c6a3602182005200541086a3602102005200541106a360248200541206a200541386a102b200041086a200541206a41086a28020036020020002005290320370200200541d0006a24000f0b200541386a200141186a2203200141286a410010c103024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b2001280200210220054100360220024020022802080d00200541cc006a4101360200200541023602342005420237023c200541f8adc4003602382005200541206a3602302005200541306a360248200541106a200541386a102b20052802102202450d002000200529021437020420002002360200200541d0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d03200241016a22062002490d0520024101742207200620062007491b22064100480d052002450d01200328020020022006102122020d020c060b200541cc006a2202410136020020054102360234200520063602302005420137023c200541e0b0c4003602382005200541306a360248200541106a200541386a102b20052802102201450d032005200529021437021420052001360210200241013602002005412a3602342005420137023c200541a8aac4003602382005200541106a3602302005200541306a360248200541206a200541386a102b02402005280214450d00200528021010200b20052802202202450d032000200529022437020420002002360200200541d0006a24000f0b200610222202450d040b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2202200228020041016a3602000b20004100360200200541d0006a24000f0b1024000b200641011023000bb60401047f230041c0006b22032400200341286a200141186a2204200141286a2205200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d03200241016a22052002490d0520024101742206200520052006491b22054100480d052002450d01200428020020022005102122020d020c060b2003413c6a2201410136020020034102360214200320053602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200510222202450d040b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b1024000b200541011023000bf50301047f230041c0006b22032400200341286a200141186a2204200141286a200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d0320024101742206200520052006491b22054100480d032002450d0120042802002002200510212202450d020c040b2003413c6a2201410136020020034102360214200320053602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2005102222020d020b200541011023000b1024000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bb60401057f230041c0006b22032400200341286a200141186a2204200141286a2205200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d03200541016a22062005490d0520054101742207200620062007491b22064100480d052005450d01200428020020052006102122040d020c060b2003413c6a2201410136020020034102360214200320063602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200610222204450d040b2001411c6a2006360200200141186a2004360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b1024000b200641011023000bc00301057f230041c0006b220324002003200236020002402001280204220420024d0d00200041003a00002000200128020020026a2d00003a0001200341c0006a24000f0b2001280208417c6a21052001410c6a28020041037421010240024003402001450d012004200541046a2802006a22062004490d02200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a0001200341c0006a24000f0b20032004360204200341306a410c6a41023602002003412c6a4102360200200341023602342003420337021c200341b0b1c4003602182003200341046a360238200320033602302003200341306a360228200341086a200341186a102b200041013a00002000410c6a200341106a280200360200200041046a2003290308370200200341c0006a24000f0b0240412010222204450d00200041013a0000200441186a41002900a8b144370000200441106a41002900a0b144370000200441086a4100290098b14437000020044100290090b144370000200041086a42a08080808004370200200041046a2004360200200341c0006a24000f0b412041011023000bf50301057f230041c0006b22032400200341286a200141186a2204200141286a200210c103024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d05200541016a22062005490d0320054101742207200620062007491b22064100480d032005450d0120042802002005200610212205450d020c040b2003413c6a2201410136020020034102360214200320063602102003420137022c200341e0b0c4003602282003200341106a360238200341186a200341286a102b20032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341a8aac4003602282003200341186a3602102003200341106a3602382003200341286a102b0240200328021c450d00200328021810200b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2006102222050d020b200641011023000b1024000b2001411c6a2006360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bf50301047f230041c0006b22042400200441286a200141186a2205200141286a200210c103024020042d00284101470d002000200429022c370200200041086a200441346a280200360200200441c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d05200241016a22062002490d0320024101742207200620062007491b22064100480d032002450d0120052802002002200610212202450d020c040b2004413c6a2201410136020020044102360214200420063602102004420137022c200441e0b0c4003602282004200441106a360238200441186a200441286a102b20042802182202450d052004200429021c37021c20042002360218200141013602002004412a3602142004420137022c200441a8aac4003602282004200441186a3602102004200441106a3602382004200441286a102b0240200428021c450d00200428021810200b20042802002201450d052000200429020437020420002001360200200441c0006a24000f0b2006102222020d020b200641011023000b1024000b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20033a0000200141206a2201200128020041016a3602000b20004100360200200441c0006a24000bad0201027f230041106b220224000240024020002d00004104470d00200128021841c0cac40041082001411c6a28020028020c11000021010c010b2002200128021841abcac40041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0cac40010cf031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ec81c5003602082002200236021820012000200241086a10d3032101200241206a240020010bad0201027f230041106b220224000240024020002d00004104470d00200128021841e4a7c40041032001411c6a28020028020c11000021010c010b2002200128021841e7a7c40041082001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41f0a7c40010cf031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b810101017f0240200041046a280200220320016b20024f0d0002400240200120026a22022001490d0020034101742201200220022001491b22014100480d00024002402003450d0020002802002003200110212202450d010c030b2001102222020d020b200141011023000b1024000b20002002360200200041046a20013602000b0bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d002000200220011084041a200441e0006a24000f0b2004200441086a36024020042004410c6a360244200441c8006a41146a4100360200200441286a41146a4104360200200441346a4105360200200441106a41146a4103360200200441c8d7c4003602582004420137024c200441d0d2c4003602482004410536022c20044203370214200441fcd1c4003602102004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441286a360220200441106a418cd3c4001048000b6c01017f230041306b2203240020032001360204200320003602002003412c6a412d3602002003411c6a410236020020032002360228200341033602242003420237020c200341b8d4c400360208200320033602202003200341206a360218200341086a41c8d4c4001048000bf10202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d00410121042006280218418882c50041c082c50020051b4102410120051b2006411c6a28020028020c1100000d0120012000280200200228020c11040021040c010b024020050d0041012104200628021841c182c50041022006411c6a28020028020c1100000d01200028020021060b41012104200341013a00102006290210210720062902082108200341346a2205418c82c50036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b20032008370320200320073703282003200a370340200320093703382003200b3703182003200341086a3602302001200341186a200228020c1104000d00200341306a28020041a682c5004102200528020028020c11000021040b200041086a20043a00002000200028020441016a360204200341d0006a240020000b820201027f230041106b220224002002200128021841c882c50041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a4180b1c40010cf031a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b1600200028020022002802002000280208200110b4020b110020012000280200200028020810fd010b9d09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1100000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b4188ddc4002000200410b501000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b4188ddc4002000200410b501000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001104000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110000450d010c050b0b4198ddc4002002200410b501000b41d8dbc400102f000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1100000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001104000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110000450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110000450d010b200341c0006a240041010f0b200341c0006a240041000bdc39030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a2009109803200328021420014d0d03200328021020014102746a2207450d03200341086a2004109803200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b0130411010222207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010da0320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210db0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210db0320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110db0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110db0320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110db0320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210db032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c200141047420121021220f0d140c5c0b200341306a200341186a410110db0320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010da0320032802304101460d2f200341306a200341186a2003280234280204220510db0320032802300d41200341306a200341186a410110db0320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210db0320032802300d34200341306a200341186a410110db0320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110db032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110db032003280230450d0d0c2f0b200320041098032003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810db0320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010da0320032802304101460d32200341306a200341186a200328023428020410db0320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210d60320032802304101460d25200341306a200341186a2003280234220528020810db0320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110db0320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110db032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010da0320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010da0320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10db0320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110db0320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b20121022220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110db0320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c1020200341c0006a24000f0b411310222207450d382007410f6a4100280085b944360000200741086a41002900feb844370000200741002900f6b844370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f10222207450d38200741076a4100290090b94437000020074100290089b944370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f10222207450d38200741076a410029009fb94437000020074100290098b944370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b412510222207450d392007411d6a41002900c4b944370000200741186a41002900bfb944370000200741106a41002900b7b944370000200741086a41002900afb944370000200741002900a7b944370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412510222207450d392007411d6a41002900c4b944370000200741186a41002900bfb944370000200741106a41002900b7b944370000200741086a41002900afb944370000200741002900a7b944370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412710222207450d3a2007411f6a41002900ebb944370000200741186a41002900e4b944370000200741106a41002900dcb944370000200741086a41002900d4b944370000200741002900ccb944370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e10222207450d3a200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e10222207450d39200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e10222207450d38200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e10222207450d37200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e10222207450d36200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b412710222207450d352007411f6a41002900b7ba44370000200741186a41002900b0ba44370000200741106a41002900a8ba44370000200741086a41002900a0ba4437000020074100290098ba44370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e10222207450d34200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b411710222207450d332007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e10222207450d33200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e10222207450d30200741066a41002900c5ba44370000200741002900bfba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e10222207450d2b200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b411710222207450d292007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e10222207450d29200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e10222207450d29200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b411710222207450d282007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b411710222207450d232007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e10222207450d23200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e10222207450d22200741066a4100290090ba443700002007410029008aba44370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b411710222207450d212007410f6a4100290082ba44370000200741086a41002900fbb944370000200741002900f3b944370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b411341011023000b410f41011023000b410f41011023000b41d0bac4002007200510b501000b412541011023000b412541011023000b411041041023000b412741011023000b1024000b201241041023000b410e41011023000b410e41011023000b410e41011023000b410e41011023000b410e41011023000b412741011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b410e41011023000b410e41011023000b411741011023000b410e41011023000b410e41011023000b410e41011023000b411741011023000b200328021c10200b200341c0006a24000b1100200028020035020041012001109a020bbd0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810980320032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741c8d7c40020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a20081098032003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41c8d7c400200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810980320032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c20034194b6c4003602382003200341206a3602282003200341286a360248200341d0006a200341386a102b2003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41b7b5c40041dd001039000b41f5b4c40041c2001039000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c200341a4b6c4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a102b200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b200010202007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b200110202007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d00200610200b20020d000b0b024020004180e5c200460d0020002802002101200010202001450d0020012802002105200110202005450d00024020052802002201450d000340200510202001210520012802002200210120000d000b0b200510200b0bcb0a03037f017e027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002202417e6a2203412e4b0d0020030e2f061e220000141f18001d0a00000d0c1c26190b151b232111102728041a09080f24162503130520070201172a29120e060b200020023a00000f0b200020012d00013a00012000412b3a00000f0b200041046a200141046a2902003702002000412a3a00000f0b200041046a200141046a290200370200200041253a00000f0b200041046a200141046a2902003702002000411d3a00000f0b200041046a200141046a290200370200200041273a00000f0b200020012d00013a0001200041023a00000f0b200041046a200141046a290200370200200041293a00000f0b200041046a200141046a290200370200200041203a00000f0b200041046a200141046a2902003702002000411f3a00000f0b200020012d00013a0001200041046a200141046a2802003602002000410c3a00000f0b200041046a200141046a290200370200200041143a00000f0b200041046a200141046a280200360200200041103a00000f0b200041046a200141046a2802003602002000410f3a00000f0b200041086a200141086a290300370300200041303a00000f0b200041046a200141046a290200370200200041213a00000f0b200041046a200141046a2902003702002000411a3a00000f0b200041046a200141046a290200370200200041193a00000f0b200041046a200141046a2802003602002000412f3a00000f0b200041046a200141046a290200370200200041263a00000f0b200041046a200141046a280200360200200041073a00000f0b200041046a200141046a290200370200200041153a00000f0b200041046a200141046a290200370200200041233a00000f0b200020012d00013a00012000412c3a00000f0b200141086a2802002204ad2205421e88a70d142005420286a72203417f4c0d14200141046a28020021022003450d122003102222060d13200341041023000b200041046a200141046a280200360200200041133a00000f0b200041046a200141046a2902003702002000411e3a00000f0b200041046a200141046a290200370200200041163a00000f0b200041046a200141046a280200360200200041113a00000f0b200041046a200141046a2802003602002000410b3a00000f0b200020012d00013a0001200041033a00000f0b200041046a200141046a280200360200200041083a00000f0b200041046a200141046a290200370200200041283a00000f0b200041046a200141046a290200370200200041183a00000f0b200020012d00013a0001200041043a00000f0b200041046a200141046a290200370200200041173a00000f0b200041046a200141046a290200370200200041223a00000f0b200041046a200141046a290200370200200041243a00000f0b200041046a200141046a280200360200200041123a00000f0b200041046a200141046a2902003702002000411b3a00000f0b200041046a200141046a2902003702002000411c3a00000f0b200041086a200141086a2903003703002000412e3a00000f0b200041046a200141046a2802003602002000412d3a00000f0b410421060b02402004450d002004410274210720062103034020032002280200360200200341046a2103200241046a21022007417c6a22070d000b0b200041086a2004360200200041046a20063602002000410c6a2001410c6a280200360200200041093a00000f0b1031000b9e0302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200028020822046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d0120002802002003410474200410212207450d020c040b2000280200210720062005460d040c050b2004102222070d020b200441081023000b1024000b20002007360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b200241ac013a00000c010b2001200641106a3602002002200610d80320022d000041ac01460d00200441016a2103200720044104746a2106024003402003210420062002290300370300200641086a200241086a29030037030020012802002203200141046a280200460d012001200341106a3602002002200310d803200441016a2103200641106a210620022d000041ac01470d000c020b0b200241ac013a00000b200041086a2004360200200241106a24000ba10201027f02400240024002402001410c6a2802002203417f6a220420034d0d00411610222201450d01200020013602042001410e6a410029008ebc44370000200141086a4100290088bc4437000020014100290080bc44370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b10222201450d0220002001360204200141176a41002800adbc44360000200141106a41002900a6bc44370000200141086a410029009ebc4437000020014100290096bc44370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b411641011023000b411b41011023000b41b4bcc4002002200310b501000bf60201037f230041106b22032400024002402002450d0020032001410010da0320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f10222202450d022000428f808080f00137020420002002360200200241076a41002900f8bb44370000200241002900f1bb44370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b412510222202450d01200042a5808080d004370204200020023602002002411d6a41002900e9bb44370000200241186a41002900e4bb44370000200241106a41002900dcbb44370000200241086a41002900d4bb44370000200241002900ccbb44370000200341106a24000f0b410f41011023000b412541011023000bb20201027f230041106b2202240002400240200028020022002d00004104470d00200128021841c0cac40041082001411c6a28020028020c11000021010c010b2002200128021841abcac40041052001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0cac40010cf031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841c382c50041012000411c6a28020028020c1100000d010b2002280200220128021841c482c50041012001411c6a28020028020c11000021010b200241086a20013a00000b200241106a2400200141ff01714100470b0c0020002802002001109c030bd20201037f23004180016b22022400200028020021000240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff018341012001109a02210020024180016a240020000f0b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b2004418001102d000b2004418001102d000bdb0203027f017e017f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210020034120710d012000ac2204420020047d2000417f4a22001b20002001109a02210020024180016a240020000f0b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d012001410141f8dac4004102200220006a4180016a410020006b109b02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141f8dac4004102200220036a4180016a410020036b109b02210020024180016a240020000f0b2003418001102d000b2000418001102d000bdd0202027f027e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f552001109a02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141f8dac4004102200220006a41800120006b109b02210020024180016a240020000f0b2000418001102d000b2000418001102d000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200102020022003470d140c150b0240200441086a280200450d00200441046a28020010200b0240200441146a2802002200450d00200441186a280200450d00200010200b200441246a280200450d12200441206a280200102020022003470d130c140b0240200441086a280200450d00200441046a28020010200b200441146a280200450d11200441106a280200102020022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d00200028020010200b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200102020022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d00200028020010200b0240200041106a280200450d002000410c6a28020010200b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200102020022003470d100c110b200441086a280200450d0e200441046a280200102020022003470d0f0c100b200441086a280200450d0d200441046a280200102020022003470d0e0c0f0b200441086a280200450d0c200441046a280200102020022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d00200028020010200b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200102020022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200102020022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510200b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200102020022003470d080c090b2004410c6a280200450d06200441086a28020010200c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d00200728020010200b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a28020010200b200a411c6a21000240200a41146a280200450d00200a28021010200b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d28020010200b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a28020010200b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010200b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a28020010200b2010411c6a21000240201041146a280200450d00201028021010200b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510200b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a28020010200b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200102020022003470d050c060b200441086a280200450d03200f280200102020022003470d040c050b200441086a280200450d02200c280200102020022003470d030c040b200441086a280200450d012009280200102020022003470d020c030b200441086a280200450d002006280200102020022003470d010c020b20022003470d000b0b0be40601087f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841c782c50041012001411c6a28020028020c11000021050240024002402003450d002002200036020402400240024020050d00024020012d00004104710d00200241046a2001108e0221044101210620034101460d020c030b41012104200141186a220528020041c582c50041012001411c6a28020028020c1100000d002001280200210741012104200241086a41086a41013a0000200241186a411c6a418c82c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022007360218200241186a41186a200241086a360200200220052902003703082002200141046a28020036021c200241046a200241186a108e020d00200241306a28020041a682c5004102200241346a28020028020c11000021040b4101210620034101470d010b4101210020040d020c030b200041046a21002003410274417c6a2103200141186a21072001411c6a210820042105034020022000360204200541ff0171210441012105024020040d000240200128020022044104710d002007280200418882c5004102200828020028020c1100000d01200241046a2001108e022105200041046a21002003417c6a22030d020c030b200241086a41086a20063a0000200241186a411c6a2209418c82c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022004360218200241186a41186a2204200241086a360200200220072902003703082002200141046a28020036021c200241046a200241186a108e020d00200428020041a682c5004102200928020028020c1100002105200041046a21002003417c6a22030d010c020b200041046a21002003417c6a22030d000b0b410121002005450d010b200241d0006a240020000f0b200141186a28020041c682c50041012001411c6a28020028020c1100002100200241d0006a240020000bc81401037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0720012802002002200410212203450d080c0f0b200141046a280200200141086a2802002202470d01200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0420012802002002200410212203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0720012802002002200410212203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2004102222030d070b200441011023000b2004102222030d070b200441011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a280200200110c3020f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d2020024101742204200320032004491b22044100480d202002450d0f20012802002002200410212203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1f20024101742204200320032004491b22044100480d1f2002450d0820012802002002200410212203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0920012802002002200410212203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0a20012802002002200410212203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0d20012802002002200410212203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102222030d0f0b200441011023000b2004102222030d0b0b200441011023000b2004102222030d070b200441011023000b2004102222030d0b0b200441011023000b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a280200200110c302200041146a280200200041186a280200200110c30202400240024002400240200141046a280200200141086a2802002202470d00200241016a22032002490d0720024101742204200320032004491b22044100480d072002450d0120012802002002200410212203450d020c030b200128020021030c030b2004102222030d010b200441011023000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041026a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a00000240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d1320024101742204200320032004491b22044100480d132002450d0f20012802002002200410212203450d100c1c0b200141046a28020020042802002202470d03200241016a22032002490d1220024101742204200320032004491b22044100480d122002450d0820012802002002200410212203450d090c190b200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0920012802002002200410212203450d0a0c160b200141046a280200200141086a2802002202470d03200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0a20012802002002200410212203450d0b0c130b200141046a280200200141086a2802002202470d04200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0d20012802002002200410212203450d0e0c100b200128020021030c160b200128020021030c130b200128020021030c100b200128020021030c150b200128020021030c0c0b2004102222030d100b200441011023000b2004102222030d0c0b200441011023000b2004102222030d080b200441011023000b2004102222030d0c0b200441011023000b2004102222030d020b200441011023000b1024000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a280200200110c302200041146a280200200041186a280200200110c302200041206a280200200041246a280200200110c3022000412c6a280200200041306a280200200110c3020be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0520022802002003200510212204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d0820022802002004200310212204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003102122040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005102122040d0a0c0e0b2005102222040d110b200541011023000b200228020021040c050b200228020021040c070b2003102222040d0b0b200341011023000b200310222204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b200510222204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003102122040d020c070b200228020021040c020b200310222204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b1024000b200341011023000b200541011023000b200341011023000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a280200200210c302200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a2802002200200110c2022000450d01200041186c2103200241146a21000340200041706a280200200041746a280200200110c3022000417c6a2802002000280200200110c302200041186a2100200341686a22030d000c020b0b200041086a2802002200200110c2022000450d00200041186c2103200241146a21000340200041706a280200200041746a280200200110c3022000417c6a2802002000280200200110c302200041186a2100200341686a22030d000b0b0b2700200028020c200041106a280200100f200041146a3502001019200041186a350200101900000b080020002001100f0b06002000101a0b06002000101b0b2801017f02402002101a2203450d002003200020022001200120024b1b1084041a2000101b0b20030b1c01017f02402000101a2201450d002001410020001083041a0b20010b7601017f230041c0006b220024002000413336020c20004184d4c400360208200041346a412f360200200041246a41023602002000410336022c20004202370214200041b8d4c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8d4c4001048000b1c00200128021841c882c50041052001411c6a28020028020c1100000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d0120002802002003200410212203450d020c040b200028020021030c040b2004102222030d020b200441011023000b1024000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a200120021084041a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d0120002802002003200410212203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d0320002802002004200310212204450d040c060b200028020021040c060b2004102222030d060b200441011023000b2003102222040d020b200341011023000b1024000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a20011084041a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41ecd3c400200241086a10d3032101200241206a240020010b0c0042e5e4fca4e8e9bcef220b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101104000d010b2002450d012000280218200220032000411c6a28020028020c11000021040b20040f0b41000bd30801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441c8d7c40041fadac40020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4103360200200441e4006a4103360200200441c8006a41146a4130360200200441d4006a4131360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441f0dbc4003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a4198dcc4001048000b20042002200320081b360228200441c8006a41146a4103360200200441d4006a4103360200200441306a41146a41033602002004410236024c2004420337023420044180dbc4003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a4198dbc4001048000b200441e4006a4103360200200441c8006a41146a4103360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441a8dbc4003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a41c8dbc4001048000b41d8dbc400102f000b830101037f230041206b22022400024002402000280200200110f7030d002001411c6a2802002103200128021821042002411c6a4100360200200241c8d7c4003602182002420137020c20024180ddc40036020820042003200241086a10d303450d010b200241206a240041010f0b2000280204200110f7032101200241206a240020010b820c03037f017e167f410121020240200128021841272001411c6a2802002802101104000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b200310f603450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641c8ddc4002107410021084102210941b002210a4198dec400210b4198dec400210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe037141087621134183e3c40021144100211541022116419f01211741c5e3c400211841c5e3c4002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff0371210041c7e0c40021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e4183e3c400460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f20024183e3c400470d000b0b41012102200f4101710d0e0c0c0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041e3e4c40021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41e0e7c400460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241e0e7c400470d000b0b41012102200f4101710d0d0c0b0b20082011102d000b201141af02102e000b20152011102d000b2011419e01102e000b41d8dbc400102f000b41d8dbc400102f000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110400450d000b41010f0b200141186a28020041272001411c6a28020028021011040021020b20020b9b0201017f024002400240024002400240024020004180104f0d00200041037641f8ffffff017141e0e7c4006a21010c010b02402000418080044f0d00200041067641606a220141e0074f0d02200141f8e9c4006a2d0000220141c9004b0d03200141037441d0f4c4006a21010c010b2000410c7641706a22014180024f0d03200141d8f1c4006a2d00004106742000410676413f7172220141ff034b0d04200141a0f9c4006a2d0000220141364b0d05200141037441a0fdc4006a21010b200129030042012000413f71ad86834200520f0b41d8f3c400200141e00710b501000b41e8f3c400200141ca0010b501000b41f8f3c400200141800210b501000b4188f4c400200141800410b501000b4198f4c4002001413710b501000bb30201037f23004180016b220224000240024002400240200128020022034110710d0020034120710d012000ad41012001109a02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141f8dac4004102200220036a4180016a410020036b109b02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141f8dac4004102200220036a4180016a410020036b109b02210020024180016a240020000f0b2000418001102d000b2000418001102d000b0e00200035020041012001109a020bc50501077f41002104024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024002400340200620096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210603402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b20002005360204200041013602000f0b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024002400340200220096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210203402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b2000200520046a360204200041013602000f0b2000200520076a20046a360204200041003602000f0b20042003102d000b2701017f2000280200220128020020012802042000280204280200200028020828020010f303000be004010d7f230041306b2203240002402002450d00200341286a2104200041086a2105200341206a21062003411c6a2107200341246a2108200041046a210902400240024002400340024020052d0000450d002000280200418482c5004104200928020028020c1100000d020b2004410a3602002006428a8080801037030020072002360200200341106a41086a220a41003602002003200236021420032001360210200341086a410a2001200210f9030240024002400240024020032802084101470d00200328020c210b0340200a200b200a2802006a41016a220b36020002400240200b2008280200220c4f0d002003280214210d2007280200220e200b4f0d010c040b02402003280214220d200b490d00200c41054f0d062003280210200b200c6b220f6a220e2004460d05200e2004200c108604450d050b2007280200220e200b490d030b200d200e490d022003200341106a200c6a41176a2d00002003280210200b6a200e200b6b10f9032003280204210b20032802004101460d000b0b200a20072802003602000b200541003a00002002210b0c020b200541013a0000200f41016a210b0c010b200c4104102e000b2009280200210e2000280200210c0240200b452002200b4672220a0d002002200b4d0d042001200b6a2c000041bf7f4c0d040b200c2001200b200e28020c1100000d010240200a0d002002200b4d0d052001200b6a2c000041bf7f4c0d050b2001200b6a21012002200b6b22020d000c020b0b200341306a240041010f0b200341306a240041000f0b200120024100200b10f303000b20012002200b200210f303000b200341306a240041000b02000bfa0101017f230041106b220224002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a200110fb032101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a882c500200241086a10d3032101200241206a240020010b02000b0e0020002802002001200210fb030b810201017f230041106b22022400200028020021002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a200110fb032101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a882c500200241086a10d3032101200241206a240020010b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b22052400200520012002200320044100108b04200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bb70502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d002003500d012004500d03200479a7200279a76b2207413f4b0d0241ff0020076b2108200741016a21070c0c0b200450450d012005450d0520034200510d0d20054200370308200520012003823703000c060b2004500d0c20014200510d032004427f7c2209200483500d07200479a7200279a76b2207413e4d0d090b2005450d012005200137030020052002370308420021010c070b2003427f7c2209200383500d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa7108a04200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff0071108904200641106a20012002200741ff0071108a04200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bd882050100418080c0000bcd8205746f6f206d616e7920696e737472756374696f6e730000003000100024000000c5291100170000004002000009000000547269656420746f20736872696e6b20746f2061206c617267657220636170616369747900000000800010000f0000000000000090001000020000000000000000000000a000100004000000000000004e65774163636f756e74496e64657800bde61000090000003b0110000c000000c000100022000000c82b110000000000e20010004100000023011000180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578496e646963657320456e756d53657400000000000000000000617474656d707420746f20646976696465206279207a65726f000000a425110028000000940110004200000048000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e7273000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e727394011000420000004800000001000000496e64696365730000000000080310000b0000000000000000000000130310000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110024031000000000000000000034031000010000000000000001000000000000003c031000070000000101000000000000130310000f00000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100440310000000000000000000540310000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e646578000032000000000000000100000033000000720310001f000000456e756d53657400320000000000000001000000340000005c031000160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e000000e001100048000000870a00000e0000006001100019000000c003100047000000df00000018000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e7273496e6469636573204e657874456e756d53657473746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970654e6f6e2d656d7074792066756e6374696f6e20626f64792065787065637465640000002e0510000f0000003d051000020000003f05100003000000a004100030000000d00410005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2076616c69646174696f6e206572726f7200006c0510007c000000e8051000480000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e72733a617574683a436f6e73656e737573204f726967696e616c417574686f72697469657300a4251100280000006c0610004400000024010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e73656e7375732f7372632f6c69622e72736f66666c726570304e6f20606f66666c696e655f7265706f72746020666f756e6420696e2074686520696e686572656e742064617461210000071000190000002007100042000000520000001f000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e72730000000000002c0c10000600000000000000350000000000000000000000360000000000000000000000020000000000000000000000000000000000000037000000000000000000000000000000320c10000400000000000000380000000000000002000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000360c100009000000000000003900000000000000000000003a0000000000000000000000000000003b000000000000000000000002000000000000000000000000000000000000003f0c100009000000000000003c00000000000000000000003d0000000000000000000000000000003e00000000000000000000000200000000000000000000000000000000000000480c100007000000000000003f00000000000000000000004000000000000000000000000000000041000000000000000000000000000000420000000000000000000000000000004f0c10000800000000000000430000000000000000000000440000000000000000000000000000004500000000000000000000000000000046000000000000000000000000000000570c1000070000000000000047000000000000000000000048000000000000000000000000000000490000000000000000000000000000004a0000000000000000000000000000005e0c100007000000000000004b00000000000000000000004c0000000000000000000000000000004d0000000000000000000000000000004e000000000000000000000000000000650c100009000000000000004f00000000000000000000005000000000000000000000000000000051000000000000000000000000000000520000000000000000000000000000006e0c10000700000000000000530000000000000000000000540000000000000000000000000000005500000000000000000000000000000056000000000000000000000000000000750c10000e0000000000000057000000000000000000000058000000000000000000000000000000590000000000000000000000000000005a000000000000000000000000000000830c10000f000000000000005b00000000000000000000005c0000000000000000000000000000005d0000000000000000000000000000005e000000000000000000000000000000920c10001000000000000000380000000000000002000000000000000000000000000000000000005f00000000000000000000000200000000000000000000000000000000000000a20c10000700000000000000600000000000000000000000610000000000000000000000000000006200000000000000000000000000000063000000000000000000000000000000a90c10000800000000000000640000000000000000000000650000000000000000000000000000006600000000000000000000000000000067000000000000000000000000000000b10c10000800000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b00000000000000000000000000000074ab100004000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f000000000000000000000073797374656d6175726174696d657374616d70636f6e73656e737573696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f766f74696e67636f756e63696c5f6d6f74696f6e7366696e616c6974795f747261636b65726772616e6470617472656173757279636f6e747261637400000000000000f48b10001200000000000000088c1000010000000000000000000000208c1000010000000000000000000000f00d10000c00000000000000fc0d1000010000000000000000000000140e10000100000000000000000000001c0e10000600000000000000240e10000100000000000000000000003c0e1000010000000000000000000000440e10000e00000000000000540e10000100000000000000000000006c0e1000010000000000000000000000740e100008000000000000007c0e1000010000000000000000000000940e10000100000000000000000000009c0e10000b00000000000000a80e1000010000000000000000000000c00e1000010000000000000000000000c80e10000c00000000000000d40e1000010000000000000000000000ec0e100001000000000000006e6f74655f6f66666c696e65000000001710100007000000000000001e1010003d000000c30f10005400000072656d61726b000000000000bc0f10000700000000000000d3af100007000000a10f10001b0000007365745f686561705f70616765730000000000009c0f1000050000000000000061c51000030000005d0f10003f0000007365745f636f6465000000009fef10000300000000000000d3af1000070000004b0f1000120000007365745f73746f726167650000000000390f100005000000000000003e0f10000d0000001e0f10001b0000006b696c6c5f73746f7261676500000000120f10000400000000000000160f100008000000f40e10001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b204e6f74652074686174207468652070726576696f757320626c6f636b27732076616c696461746f72206d697373656420697473206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e6f66666c696e653c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e740000000000c0101000130000000000000000000000d31010001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e81010000000000000000000c82b11000000000000000000000000004f726967696e616c417574686f7269746965735665633c543a3a53657373696f6e4b65793e00000032000000000000000100000070000000436f6e73656e7375737375627374726174652d6e6f646500df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d4010000007801759919ee83e5010000008811100028000000d0601000420000000d01000004000000446570726563617465642c20706c65617365207573652060417574686f726974696573417069602e3a6865617070616765733a636f6465006c0610004400000024010000010000006e6f7420616c6c6f77656420746f206661696c20696e2072756e74696d650000791410001c0000000413100044000000980000000300000055141000240000000413100044000000a0000000030000001d141000380000000413100044000000dd0000002a000000f5131000280000000413100044000000de00000032000000cd131000280000000413100044000000e00000002c000000a11310002c0000000413100044000000df0000004c0000006f13100032000000041310004400000014010000030000004469676573744974656d206e6f7420657175616c481310002700000004131000440000001c01000004000000dc121000280000000413100044000000220100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e696e76616c6964206163636f756e7420696e646578626164206f726967696e3a20657870656374656420746f2062652061207468726573686f6c64206e756d626572206f6620636f756e63696c206d656d6265727300000000000028d210000800000000000000c8151000040000000000000000000000e8151000010000000000000000000000f01510000500000000000000f81510000500000000000000000000002016100002000000000000000000000030161000080000000000000034af100001000000000000000000000038161000010000000000000000000000401610000b0000000000000034af10000100000000000000000000004c161000010000000000000000000000a6361000080000000000000054161000020000000000000000000000641610000100000000000000bde610000900000027d310000d000000a3b010000400000062e71000030000009217100059000000566f746564000000bde6100009000000a3b01000040000007bef10000400000062e710000300000062e71000030000001317100042000000551710003d000000417070726f766564e216100031000000446973617070726f76656400ad16100035000000a3b01000040000007bef1000040000006c161000410000002041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e2041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c72656164792065786973747341757261204c61737454696d657374616d7054696d657374616d70204d656469616e54696d657374616d702055706461746554696d657374616d7020526563656e7448696e74737418100031000000a51810004b000000790000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e72730819100023000000a51810004b0000007a0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d626572616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f776564007019100048000000810a00000a0000000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e7273a425110028000000d01910004600000042000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e72730000301a100019000000501a10003f0000000c0100001e000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c4765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746100041b100022000000261b10003f000000d1000000030000004175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e7273000000801b100028000000261b10003f000000d7000000030000004f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742ec01b100033000000f31b10004a000000a800000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e727300000000000000689a10000700000000000000981c1000020000000000000000000000c82b1100000000000000000000000000889a10000400000000000000c81c1000030000000000000000000000c82b11000000000000000000000000006b4f10000900000000000000a2ef10000c000000000000002f9b10000800000000000000101d10001b000000000000002f9b10000800000000000000289b100007000000000000004f6d10000500000000000000b4dc10001600000000000000379b100007000000000000007bef100004000000426f783c3c542061732054726169743e3a3a50726f706f73616c3e436f756e63696c4d6f74696f6e7300000000000000f0e11000090000000000000000000000cc1e10000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d81e10000000000000000000e81e100001000000000000000100000000000000ee9e10000a0000000101000000000000289b10000700000000000000f01e10001600000000000000000000000000000000000000000000000000000000000000c82b1100501f10000000000000000000081f100001000000000000000000000000000000101f1000060000000101000000000000289b10000700000000000000161f10003a00000000000000000000000000000000000000000000000000000000000000c82b1100501f10000000000000000000601f100001000000000000000000000000000000c8e110000d000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100681f10000000000000000000781f10000100000000000000010000005665633c543a3a486173683e320000000000000001000000340000000e201000260000003c542061732054726169743e3a3a50726f706f73616c0000db1f100033000000566f74696e672850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2932000000000000000100000070000000921f10004900000032000000000000000100000033000000801f1000120000002050726f706f73616c7320736f206661722e20566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e205468652028686173686573206f662920746865206163746976652070726f706f73616c732e626164207369676e617475726520696e2065787472696e73696354696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b207165640000001321100043000000a51810004b000000b20000000400000054696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564000000000000842110000a0000000000000090211000010000000000000000000000a8211000020000000000000066696e616c5f68696e7400000000000010221000040000000000000000f0100017000000b82110003d000000f52110001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e74436f756e63696c4d6f74696f6e732050726f706f73616c4f6670726f706f736572206e6f74206f6e20636f756e63696c436f756e63696c4d6f74696f6e732050726f706f73616c436f756e74436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67766f746572206e6f74206f6e20636f756e63696c70726f706f73616c206d7573742065786973746d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f72656400007019100048000000870a00000e000000d0191000460000004200000001000000626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e646578626164206f726967696e3a20657870656374656420746f20626520616e20696e686572656e74206f726967696e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e736963734c656e647572696e6720657865637574696f6e00a425110028000000e02310004c0000005c000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e727353797374656d2045787472696e7369634461746153797374656d2044696765737453797374656d204e756d62657253797374656d2045787472696e73696373526f6f7453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e6365707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a0909090971656453797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0000005027100048000000870a00000e00000053797374656d204576656e7473000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e727353797374656d000000000000ec2b10000c00000001010000000000005a0211000c00000000000000f82b10000800000000000000000000000000000000000000000000000000000000000000c82b1100cc2c10000000000000000000002c100001000000000000000100000000000000082c10000e000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100302c10000000000000000000182c100001000000000000000000000000000000202c100010000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100302c10000000000000000000402c100001000000000000000000000000000000482c10000900000001010000000000008e0111000e00000000000000289b10000700000000000000000000000000000000000000000000000000000000000000c82b1100082d10000000000000000000542c1000010000000000000001000000000000005c2c10000d000000010100000000000062e710000300000000000000d3af10000700000000000000000000000000000000000000000000000000000000000000c82b11006c2c100000000000000000007c2c100001000000000000000100000000000000842c10000e0000000000000000000000922c10001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a42c10000000000000000000b42c100002000000000000000100000000000000c42c10000600000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100cc2c10000000000000000000dc2c100001000000000000000100000000000000e42c10000a0000000000000000000000289b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100082d10000000000000000000f02c100001000000000000000100000000000000f82c10000e0000000000000000000000289b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100082d10000000000000000000182d100001000000000000000100000000000000202d1000060000000000000000000000262d10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100302d10000000000000000000402d100001000000000000000100000000000000482d10000600000000000000000000004e2d10001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100682d10000000000000000000782d10000100000000000000010000004163636f756e744e6f6e6365543a3a496e646578353010001f00000045787472696e736963436f756e740000073010002e000000416c6c45787472696e736963734c656e32000000000000000100000070000000b92f10004e000000426c6f636b48617368000000932f10002600000045787472696e7369634461746100000032000000000000000100000034000000442f10004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e2932000000000000000100000071000000872e100069000000f02e1000540000004e756d626572000032000000000000000100000072000000452e100042000000506172656e74486173680000292e10001c00000045787472696e73696373526f6f74000032000000000000000100000073000000e42d100045000000446967657374543a3a4469676573740032000000000000000100000034000000a82d10003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e743e3e32000000000000000100000074000000802d100028000000204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e67746820696e20627974657320666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f646500643210001e000000823210001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400004a3210001a000000253210000a0000002f3210001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d0000001432100011000000f431100020000000d431100020000000ac311000280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f72742046756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e2069732052657475726e207479706573206c656e6774682073686f756c642062652030206f722031000000000000004c3310000a000000000000005ce6100002000000000000000000000058331000010000000000000000000000603310000d000000000000002899100001000000000000000000000070331000010000000000000000000000dcae10000800000000000000783310000400000000000000000000009833100001000000000000004e65774163636f756e740000e33310001b0000005265617065644163636f756e74000000cc33100017000000bde6100009000000bde6100009000000c6e6100007000000c6e6100007000000a03310002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7400000000000028d2100008000000000000003c361000020000000000000000000000c82b11000000000000000000000000004c361000060000000000000054361000030000000000000000000000c82b11000000000000000000000000006c361000070000000000000074361000020000000000000000000000c82b11000000000000000000000000008436100006000000000000008c361000010000000000000000000000c82b11000000000000000000000000009436100009000000000000008c361000010000000000000000000000c82b11000000000000000000000000009d36100009000000000000008c361000010000000000000000000000c82b1100000000000000000000000000a63610000800000000000000b0361000020000000000000000000000c82b1100000000000000000000000000c0361000090000000000000010af1000020000000000000000000000c82b1100000000000000000000000000c93610000b0000000000000028991000010000000000000000000000c82b11000000000000000000f036100009000000c6e61000070000005461626c65640000f036100009000000c6e6100007000000566410000e0000005374617274656400d43610000f000000e33610000d0000005061737365640000d43610000f0000004e6f7450617373656443616e63656c6c656445786563757465640000d43610000f0000007bef10000400000044656c656761746564556e64656c6567617465645265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74696e67506572696f6442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e4279746546656544656d6f637261637920566f74654f6644656d6f63726163792050726f787942616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636544656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6642616c616e636573204c6f636b7344656d6f6372616379204465706f7369744f6673657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a090909716564000000a425110028000000cc25110050000000370100000900000000000000f43810000800000000000000fc3810000200000000000000000000002c3910000800000000000000000000006c3910000b0000000000000078391000030000000000000000000000c039100008000000000000007472616e73666572000000004ab710000400000000000000dbf010002300000000000000b9f4100005000000000000005b3b100013000000763b100036000000c82b110000000000ac3b100042000000ee3b100048000000363c1000450000007b3c10002d000000c82b110000000000a83c1000460000007365745f62616c616e636500000000009e6b10000300000000000000dbf010002300000000000000573b100004000000000000005b3b100013000000000000006e3b100008000000000000005b3b100013000000003a100025000000c82b110000000000253a100040000000653a100046000000ab3a100049000000f43a100036000000c82b1100000000002a3b10002d00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920616e6420726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e66726565436f6d706163743c543a3a42616c616e63653e7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e42616c616e6365732056657374696e6742616c616e636573000000000000f04010000d0000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000084110000100000000000000010000000000000010411000120000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a057100000000000000000002441100001000000000000000100000000000000f4c510000b0000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a0571000000000000000000000c610000100000000000000010000000000000008c610000b0000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a0571000000000000000000014c61000010000000000000001000000000000001cc61000120000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a0571000000000000000000030c610000100000000000000010000000000000038c61000120000000000000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a057100000000000000000005cc61000010000000000000001000000000000002c4110000700000001010000000000005a0211000c00000000000000334110001b00000000000000000000000000000000000000000000000000000000000000c82b11005459100000000000000000005041100001000000000000000000000000000000584110000b00000001010000000000005a0211000c00000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000644110000b000000000000000100000000000000bc4110000f00000001010000000000005a0211000c00000000000000fd4010000a00000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000cc4110000b000000000000000100000000000000244210000500000001010000000000005a0211000c00000000000000294210002c00000000000000000000000000000000000000000000000000000000000000c82b110058421000000000000000000068421000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e636500ce471000260000004578697374656e7469616c4465706f7369740000994710003500000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e000063471000360000004672656542616c616e636500e944100027000000c82b1100000000001045100050000000604510005d000000bd45100055000000124610004f0000006146100051000000b246100015000000c82b110000000000c7461000570000001e47100045000000526573657276656442616c616e6365009e4210005d000000fb42100027000000c82b110000000000224310005b0000007d43100049000000c82b110000000000c64310005d000000234410002d000000c82b1100000000005044100053000000a3441000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00000032000000000000000100000034000000704210002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e44656d6f6372616379204c61756e6368506572696f6400007049100039000000b049100048000000100200002d00000044656d6f6372616379205075626c696350726f70730000002049100048000000870a00000e00000044656d6f6372616379205075626c696344656c617944656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7343616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d00000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e727300000000689a10000700000000000000084c1000020000000000000000000000384c1000010000000000000000000000404c10000600000000000000484c1000010000000000000000000000384c1000010000000000000000000000889a10000400000000000000604c1000020000000000000000000000904c1000020000000000000000000000a04c10000a00000000000000604c1000020000000000000000000000ac4c1000020000000000000000000000bc4c10001000000000000000cc4c1000030000000000000000000000144d10000100000000000000000000001c4d10001100000000000000304d1000010000000000000000000000484d1000010000000000000000000000504d10000d00000000000000604d1000020000000000000000000000904d1000010000000000000000000000984d10000900000000000000a44d1000010000000000000000000000bc4d1000010000000000000000000000c44d10000c00000000000000c82b1100000000000000000000000000d04d1000010000000000000000000000d84d10000c00000000000000a44d1000010000000000000000000000e44d1000010000000000000000000000ec4d10000800000000000000f44d1000020000000000000000000000244e10000100000000000000000000002c4e10000a00000000000000c82b1100000000000000000000000000384e10000100000000000000000000002f9b100008000000000000003e9b10001000000000000000b9f410000500000000000000bef41000150000006d501000280000007365636f6e640000000000002f9b100008000000000000005b5010001200000000000000364f100009000000000000003f4f10001800000000000000889a1000040000000000000057501000040000000a5010004d000000db4f10002f00000070726f78795f766f74650000794f100062000000db4f10002f00000073746172745f7265666572656e64756d000000002f9b100008000000000000003e9b100010000000000000006b4f10000900000000000000e33610000d00000000000000744f100005000000000000008e0111000e000000574f10001400000063616e63656c5f7265666572656e64756d00000000000000364f100009000000000000003f4f100018000000214f10001500000063616e63656c5f71756575656400000000000000184f1000040000000000000000f0100017000000000000001c4f10000500000000000000a2ef10000c000000f04e1000280000007365745f70726f787900000000000000eb4e100005000000000000005a0211000c000000c54e10002600000072657369676e5f70726f78799f4e10002600000072656d6f76655f70726f7879794e10002600000064656c656761746500000000604e100002000000000000005a0211000c00000000000000624e10000c000000000000006e4e10000b000000514e10000f000000756e64656c65676174650000404e10001100000020556e64656c656761746520766f74652e2044656c656761746520766f74652e746f6c6f636b5f706572696f64734c6f636b506572696f647320436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e77686963682052656d6f76652061207265666572656e64756d2e7265665f696e646578436f6d706163743c5265666572656e64756d496e6465783e2053746172742061207265666572656e64756d2e7468726573686f6c6464656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b566f7465436f6d706163743c50726f70496e6465783e2050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e44656d6f6372616379000000000000e05610000f0000000000000000000000f03610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100285810000000000000000000f056100001000000000000000100000000000000f85610000b0000000000000000000000035710002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e45810000000000000000000305710000100000000000000010000000000000038571000090000000101000000000000f03610000900000000000000415710002100000000000000000000000000000000000000000000000000000000000000c82b110064571000000000000000000074571000010000000000000000000000000000007c5710000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100f457100000000000000000008857100001000000000000000100000000000000905710000e0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a05710000000000000000000b057100001000000000000000100000000000000b85710000b00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100c45710000000000000000000d457100001000000000000000100000000000000dc5710000e00000000000000000000006e4e10000b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100245910000000000000000000ec57100001000000000000000100000000000000899e10000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100f457100000000000000000001479100001000000000000000100000000000000045810000f0000000000000000000000d43610000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110028581000000000000000000014581000010000000000000001000000000000001c581000090000000000000000000000d43610000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100285810000000000000000000385810000100000000000000010000000000000040581000100000000101000000000000d43610000f00000000000000505810002d00000000000000000000000000000000000000000000000000000000000000c82b11005459100000000000000000008058100001000000000000000000000000000000885810000d00000001010000000000008e0111000e00000000000000955810002b00000000000000000000000000000000000000000000000000000000000000c82b1100c05810000000000000000000d058100001000000000000000100000000000000d8581000090000000101000000000000d43610000f00000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100e45810000000000000000000f458100001000000000000000100000000000000fc581000060000000101000000000000025910001f00000000000000575010000400000000000000000000000000000000000000000000000000000000000000c82b110024591000000000000000000034591000030000000000000001000000000000004c5910000500000001010000000000005a0211000c000000000000005a0211000c00000000000000000000000000000000000000000000000000000000000000c82b110054591000000000000000000064591000010000000000000000000000000000006c5910000b00000001010100000000005a0211000c00000000000000775910001b00000000000000000000000000000000000000000000000000000000000000c82b1100945910000000000000000000a45910000100000000000000010000005075626c696350726f70436f756e7400215e10003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000015e1000200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29000032000000000000000100000075000000e05d1000210000004c61756e6368506572696f64a75d1000390000004d696e696d756d4465706f7369740000320000000000000001000000760000005a5d10004d0000005075626c696344656c61790032000000000000000100000072000000255d1000350000004d61784c6f636b506572696f64730000af5c100076000000320000000000000001000000770000005265666572656e64756d436f756e7400615c10004e0000004e65787454616c6c79000000320000000000000001000000330000002f5c1000320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000025c10002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e32000000000000000100000034000000d25b100030000000566f74657273466f7200000032000000000000000100000034000000a95b100029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e74496429000000320000000000000001000000700000006a5a100075000000df5a100072000000515b10005800000050726f787900000032000000000000000100000070000000fc5910006e00000044656c65676174696f6e7328543a3a4163636f756e7449642c204c6f636b506572696f647329000032000000000000000100000078000000ac591000500000002047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e20546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e6e6f7420656e6f75676820667265652066756e647300a4251100280000008c5e10004400000053000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e7273a425110028000000e85e1000430000004e010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e727344656d6f6372616379204d696e696d756d4465706f73697476616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f77616c726561647920612070726f787977726f6e672070726f78796e6f742064656c6567617465648c5e100044000000530000000100000044656d6f6372616379204d61784c6f636b506572696f6473766f74652068617320746f6f206772656174206120737472656e677468766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e42616c616e636573204372656174696f6e46656542616c616e636573205472616e73666572466565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756500e85e1000430000004e010000010000002d6110000d000000126110001b000000d060100042000000fe000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b00004461100010000000696e697469616c697a655f626c6f636b5c6110000f0000006170706c795f65787472696e736963007461100013000000696e686572656e745f65787472696e7369637300906110000f000000636865636b5f696e686572656e747300a86110001400000076616c69646174655f7472616e73616374696f6ec46110000f0000006f6666636861696e5f776f726b657200dc611000160000006772616e6470615f70656e64696e675f6368616e67650000fc611000150000006772616e6470615f666f726365645f6368616e67650000002c6210001d000000f81b1100130000009603000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e0000006062100043000000860a000025000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962616c6c6f632f7665632e72730060621000430000008c0a00002c00000066696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e6400000000946310000b0000000000000010af1000020000000000000000000000a0631000010000000000000000000000a8631000100000000000000028991000010000000000000000000000b8631000010000000000000000000000c06310000c0000000000000054af1000010000000000000000000000cc631000010000000000000000000000d46310000e00000000000000e4631000020000000000000000000000f46310000100000000000000566f74657252656170656400b064100015000000426164526561706572536c6173686564a16410000f00000054616c6c7953746172746564646410003d00000054616c6c7946696e616c697a65640000566410000e000000566410000e000000fc6310005a00000020412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572436f756e63696c205265676973746572496e666f4f66436f756e63696c20416374697665436f756e63696c10651000190000003065100048000000bb0100002d0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e727300000000306710000d0000000000000040671000020000000000000000000000706710000200000000000000000000008067100013000000000000004067100002000000000000000000000094671000020000000000000000000000a46710001300000000000000b867100004000000000000000000000018681000050000000000000000000000406810000d0000000000000050681000010000000000000000000000686810000100000000000000000000007068100010000000000000008068100001000000000000000000000098681000030000000000000000000000b06810000e00000000000000c068100003000000000000000000000008691000030000000000000000000000206910001100000000000000346910000100000000000000000000004c691000030000000000000000000000646910000d00000000000000746910000100000000000000000000008c691000030000000000000000000000a46910001900000000000000c0691000010000000000000000000000d8691000020000000000000000000000e86910001100000000000000c0691000010000000000000000000000fc69100002000000000000007365745f617070726f76616c73000000000000002970100005000000000000002e70100009000000000000004f6d10000500000000000000546d100012000000d16f100058000000c16f10001000000070726f78795f7365745f617070726f76616c73005c6f100065000000c16f100010000000726561705f696e6163746976655f766f7465720000000000336f10000e00000000000000a2ef10000c000000000000009e6b10000300000000000000dbf010002300000000000000416f10000900000000000000a2ef10000c000000000000004a6f10001200000000000000546d100012000000176e1000580000006f6e10005c000000cb6e100028000000c82b110000000000f36e100040000000726574726163745f766f746572000000000000004f6d10000500000000000000a2ef10000c000000cc6d10004b0000007375626d69745f63616e64696461637900000000c86d10000400000000000000a2ef10000c000000666d10001e000000c82b110000000000846d10004400000070726573656e745f77696e6e6572000000000000416d10000900000000000000dbf0100023000000000000004a6d10000500000000000000bef4100015000000000000004f6d10000500000000000000546d100012000000616c100059000000ba6c100069000000236d10001e0000007365745f646573697265645f736561747300000000000000ce6a10000500000000000000a2ef10000c000000a16b100059000000fa6b10005a000000546c10000d00000072656d6f76655f6d656d626572000000000000009e6b10000300000000000000dbf0100023000000d36a10005c0000002f6b1000500000007f6b10001f0000007365745f70726573656e746174696f6e5f6475726174696f6e00000000000000ce6a1000050000000000000000f0100017000000786a100056000000606a1000180000007365745f7465726d5f6475726174696f6e0000000c6a100054000000606a10001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e20546869732069732065666665637469766520696d6d6564696174656c792e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e2829606020607369676e6564602073686f756c642068617665206174206c6561737463616e646964617465746f74616c696e646578436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473766f7465735665633c626f6f6c3e436f756e63696c000000000000107810000d0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002078100000000000000000003078100001000000000000000100000000000000387810000a0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110044781000000000000000000054781000010000000000000001000000000000005c781000140000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11007078100000000000000000008078100001000000000000000100000000000000887810000a000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100947810000000000000000000a478100001000000000000000100000000000000ac7810001400000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100047910000000000000000000c078100001000000000000000100000000000000c8781000130000000000000000000000db7810000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e47810000000000000000000f478100002000000000000000100000000000000899e10000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110004791000000000000000000014791000010000000000000001000000000000001c7910000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002879100000000000000000003879100001000000000000000100000000000000407910000c000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11005c7a100000000000000000004c79100001000000000000000100000000000000547910000d0000000000000000000000617910002300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a100000000000000000008479100004000000000000000100000000000000a4791000090000000000000000000000db7810000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11005c7a10000000000000000000b079100001000000000000000100000000000000b87910000b00000001010000000000005a0211000c000000000000002e7010000900000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000c479100002000000000000000100000000000000d47910000e00000001010000000000005a0211000c00000000000000e27910001000000000000000000000000000000000000000000000000000000000000000c82b1100107a10000000000000000000f479100002000000000000000000000000000000047a10000c00000001010000000000005a0211000c00000000000000db7810000900000000000000000000000000000000000000000000000000000000000000c82b1100107a10000000000000000000207a100001000000000000000000000000000000287a1000060000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000307a100001000000000000000100000000000000387a10000a0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000447a1000010000000000000001000000000000004c7a10000e000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11005c7a10000000000000000000c82b1100000000000000000001000000000000006c7a10000c0000000000000000000000787a10002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100a07a10000000000000000000b07a100001000000000000000000000000000000b87a1000100000000000000000000000c87a10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc7a10000000000000000000ec7a100001000000000000000100000000000000f47a10000b0000000000000000000000ff7a10002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100207b10000000000000000000307b100001000000000000000000000043616e646964616379426f6e6400000032000000000000000100000079000000df80100041000000566f74696e67426f6e640000320000000000000001000000760000009d8010004200000050726573656e74536c617368506572566f7465723200000000000000010000007a0000005a801000430000004361727279436f756e7400003200000000000000010000007b0000000d8010004d00000050726573656e746174696f6e4475726174696f6ebe7f10004f000000496e6163746976654772616365506572696f64566f7465496e6465783200000000000000010000007c000000427f100068000000aa7f10001400000032000000000000000100000077000000147f10002e0000005465726d4475726174696f6e3200000000000000010000007d000000ee7e100026000000446573697265645365617473b47e10003a000000416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e877d10005b000000e27d10005c0000003e7e10005c0000009a7e10001a000000566f7465436f756e74000000467d100041000000417070726f76616c734f6600db7c10005b000000367d1000100000005265676973746572496e666f4f6628566f7465496e6465782c20753332290000667c10005f000000c57c1000160000004c6173744163746976654f6632000000000000000100000070000000267c100040000000566f7465727300000e7c10001800000043616e646964617465730000f27b10001c00000043616e646964617465436f756e740000320000000000000001000000330000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e2932000000000000000100000075000000aa7b100048000000536e617073686f7465645374616b65735665633c42616c616e63654f663c543e3e00000032000000000000000100000034000000707b10003a0000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e32000000000000000100000075000000387b1000380000002047657420746865206c6561646572626f6172642069662077653b726520696e207468652070726573656e746174696f6e2070686173652e20546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e205468652070726573656e742063616e646964617465206c6973742e205468652070726573656e7420766f746572206c6973742e20546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e436f756e63696c20566f74696e67506572696f64f0821000390000003065100048000000100200002d000000436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6ea082100048000000810a00000a000000436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c20566f74657273436f756e63696c20536e617073686f7465645374616b6573436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f61726400a082100048000000870a00000e000000436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e6466696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000a425110028000000448310004400000064000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f73656174732e72736e6f7420612070726f7879436f756e63696c204c6173744163746976654f6663616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665626164207265706f7274657220696e646578436f756e63696c20496e6163746976654772616365506572696f64436f756e63696c20566f74696e67426f6e646261642074617267657420696e64657863616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f74657272657472616374696f6e20696e64657820696e76616c696472657472616374696f6e20696e646578206d69736d617463686475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647363616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c656374656470726573656e7465642063616e646964617465206d7573742062652063757272656e74436f756e63696c2050726573656e74536c617368506572566f7465726475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c44831000440000006400000001000000436f756e63696c20417070726f76616c734f666e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520617070726f76616c20766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e6469646174657300ffffffff008810001c0000001c8810005a0000004d0000002800000048617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72735468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f722154696d657374616d702044696455706461746500000000000000388910000e00000000000000488910000100000000000000000000005089100001000000000000004e6577417574686f72697469657300007c891000160000005889100024000000204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c2853657373696f6e4b65792c20753634293e3a6772616e6470613a617574683a6c656e00bc8910002b000000e789100044000000f70000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e727300448a100030000000e789100044000000e10000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b8c8a10004e000000e789100044000000e20000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7754696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f64000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e7273208b100048000000810a00000a00000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746100000000000000f48b10001200000000000000088c1000010000000000000000000000208c100001000000000000007265706f72745f6d69736265686176696f72000000000000418c10000700000000000000d3af100007000000288c100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479204e657874466f726365644772616e64706146696e616c697479000000000000588d10000d0000000000000000000000658d10003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc9110000000000000000000c82b110000000000000000000000000000000000978d10000a00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc9110000000000000000000c82b110000000000000000000000000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e4e657874466f72636564576974686472617720686173206265656e20636865636b65642061626f76653b0a09090909676f5f62656c6f775f73756273697374656e63652069732066616c736520616e642073756273697374656e6365203e206578697374656e6369616c5f6465706f7369743b0a0909090971656443616e20776974686472617720616e6420646f6e277420676f2062656c6f772073756273697374656e6365000000000000006c8e10000300000000000000708e1000010000000000000000000000888e1000080000000000000073657400000000000390100003000000000000000690100012000000c88e100016000000c82b110000000000de8e10005d0000003b8f10002f000000c82b1100000000006a8f100063000000c82b110000000000cd8f10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d7000000000000000b49110000300000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b89110000000000000000000c891100001000000000000000100000000000000d09110000b00000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dc9110000000000000000000ec91100001000000000000000000000000000000f49110000d00000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11000492100000000000000000001492100004000000000000000100000000000000349210000900000000000000000000007bef10000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100409210000000000000000000509210000100000000000000010000004e6f770032000000000000000100000072000000ff93100024000000426c6f636b506572696f640032000000000000000100000070000000ae931000510000004d696e696d756d506572696f640000003200000000000000010000007e000000859210005a000000df9210005a0000003993100059000000929310001c00000044696455706461746500000032000000000000000100000070000000589210002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e53657373696f6e20466f7263696e674e657753657373696f6e00000000949410001000000000000000a4941000040000000000000000000000c4941000020000000000000000000000d49410000f00000000000000a4941000040000000000000000000000e4941000020000000000000054616c6c7943616e63656c6174696f6ea3b010000400000062e710000300000062e710000300000062e71000030000004f95100040000000279510002800000054616c6c795265666572656e64756d00f4941000330000002795100028000000204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652e204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652e0000000000bc9510000a00000000000000c8951000010000000000000000000000d095100002000000000000004e657753657373696f6e0000579610000b000000e0951000550000003596100022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e426c6f636b4e756d626572626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d697420627920707269636553657373696f6e2043757272656e74496e64657853657373696f6e2053657373696f6e4c656e67746853657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f72436f756e63696c566f74696e6720436f756e63696c566f74654f6630971000190000005097100048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e7273a425110028000000b09710003f00000066000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e727300a4251100280000000898100042000000a0000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73657373696f6e2f7372632f6c69622e72730000a425110028000000649810004500000021000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f766f74696e672e7273000000000000000499100005000000000000000c991000010000000000000000000000149910000100000000000000000000001c9910000a000000000000002899100001000000000000000000000030991000010000000000000053756469640000007bef10000400000074991000180000004b65794368616e6765640000bde6100009000000389910003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e00000000689a10000700000000000000709a1000010000000000000000000000c82b1100000000000000000000000000889a100004000000000000008c9a1000020000000000000000000000c82b1100000000000000000000000000bc9a10000400000000000000c09a1000010000000000000000000000c82b1100000000000000000000000000d89a10001200000000000000ec9a1000010000000000000000000000c82b1100000000000000000000000000049b10001100000000000000ec9a1000010000000000000000000000c82b1100000000000000000070726f706f736500000000002f9b100008000000000000003e9b100010000000766f7465000000002f9b10000800000000000000289b10000700000000000000379b100007000000000000007bef1000040000007665746f000000001b9b10000d00000000000000289b1000070000007365745f636f6f6c6f66665f706572696f64000000000000159b1000060000000000000000f01000170000007365745f766f74696e675f706572696f64626c6f636b7370726f706f73616c5f68617368543a3a4861736870726f706f73616c617070726f7665426f783c543a3a50726f706f73616c3e436f756e63696c566f74696e6700000000007c9e10000d00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110014a510000000000000000000c82b110000000000000000000100000000000000899e10000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100989e10000000000000000000c82b110000000000000000000100000000000000a89e10001000000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b89e10000000000000000000c89e100001000000000000000100000000000000f0e11000090000000000000000000000d09e10001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100eca410000000000000000000c82b110000000000000000000100000000000000ee9e10000a0000000101000000000000289b10000700000000000000f89e10000b00000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000c82b110000000000000000000000000000000000039f10000e0000000101000000000000289b10000700000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100eca410000000000000000000c82b110000000000000000000100000000000000119f10000d00000001010000000000001e9f100017000000000000007bef10000400000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000c82b110000000000000000000000000000000000359f10000e0000000101000000000000289b10000700000000000000439f10002300000000000000000000000000000000000000000000000000000000000000c82b1100689f10000000000000000000c82b1100000000000000000000000000436f6f6c6f6666506572696f64566f74696e67506572696f640000003200000000000000010000007e000000456e61637444656c6179506572696f6432000000000000000100000072000000789f1000730000005665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e50726f706f73616c4f66543a3a50726f706f73616c50726f706f73616c566f74657273436f756e63696c566f74654f6628543a3a486173682c20543a3a4163636f756e744964295665746f656450726f706f73616c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e29000032000000000000000100000075000000204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e000000000070a01000070000000000000078a0100001000000000000000000000090a01000020000000000000000000000a0a010000a0000000000000068ed1000010000000000000000000000aca01000010000000000000000000000b4a010001100000000000000e8ed1000010000000000000000000000c8a0100001000000000000007365745f6b65790000000000b2a110000300000000000000b5a110000d00000041a110004000000081a11000310000007365745f6c656e6774680000e6a010005b000000666f7263655f6e65775f73657373696f6e000000d0a010001600000020466f726365732061206e65772073657373696f6e2e205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e2053657473207468652073657373696f6e206b6579206f6620612076616c696461746f72202866756e6374696f6e2063616c6c65722920746f20606b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e6b6579543a3a53657373696f6e4b657953657373696f6e00000000000000d80211000a0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100eca410000000000000000000fca410000100000000000000010000000000000004a510000d00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110014a51000000000000000000024a51000010000000000000001000000000000002ca510000c00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110058a51000000000000000000038a510000100000000000000010000000000000040a510000c00000000000000000000004ca510000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110058a51000000000000000000068a510000100000000000000010000000000000070a510001100000000000000000000007bef10000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dca51000000000000000000084a51000030000000000000000000000000000009ca510001000000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000aca5100001000000000000000000000000000000b4a510000a00000001010000000000005a0211000c00000000000000b5a110000d00000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000c0a5100001000000000000000000000000000000c8a510001100000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100dca510000000000000000000eca5100001000000000000000000000032000000000000000100000034000000b3a710001f00000053657373696f6e4c656e6774680000003200000000000000010000007700000094a710001f00000043757272656e74496e64657876a710001e00000043757272656e745374617274543a3a4d6f6d656e74000000320000000000000001000000720000004ea7100028000000466f7263696e674e657753657373696f6e00000061a610005e000000bfa610006100000020a710002e0000004c6173744c656e6774684368616e676531a61000300000004e6578744b6579466f7200000da61000240000004e65787453657373696f6e4c656e67746800000032000000000000000100000070000000f4a510001900000020546865206e6578742073657373696f6e206c656e6774682e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e20426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e204e65772073657373696f6e206973206265696e6720666f72636564206966207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c7565206973207472756520696620746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c652920616e642066616c736520696620746865206e65772073657373696f6e2073686f756c6420626520636f6e7369646572656420657863657074696f6e616c2028736c61736861626c65292e2054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e2043757272656e7420696e646578206f66207468652073657373696f6e2e2043757272656e74206c656e677468206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e53657373696f6e204c6173744c656e6774684368616e6765000040a81000390000005097100048000000100200002d00000053657373696f6e2043757272656e74537461727453657373696f6e204e65787453657373696f6e4c656e677468000000000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f436f756e63696c566f74696e672050726f706f73616c73436f756e63696c566f74696e672050726f706f73616c4f66436f756e63696c566f74696e67205665746f656450726f706f73616c436f756e63696c566f74696e6720456e61637444656c6179506572696f6447757275206d656469746174696f6e70726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165646f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f5375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b657900b09710003f00000066000000010000000898100042000000a000000001000000436f756e63696c566f74696e6720566f74696e67506572696f6470726f706f73657220776f756c64206e6f74206265206f6e20636f756e63696c6475706c69636174652070726f706f73616c73206e6f7420616c6c6f77656470726f706f73616c206973207665746f6564436f756e63696c566f74696e672050726f706f73616c566f746572736f6e6c7920636f756e63696c6c6f7273206d617920766f7465206f6e20636f756e63696c2070726f706f73616c736120636f756e63696c6c6f72206d6179206e6f74207665746f20612070726f706f73616c2074776963656f6e6c7920636f756e63696c6c6f7273206d6179207665746f20636f756e63696c2070726f706f73616c7370726f706f73616c206d75737420657869737420746f206265207665746f6564436f756e63696c566f74696e6720436f6f6c6f6666506572696f64000000649810004500000021000000010000000000000074ab10000400000000000000709a100001000000000000000000000078ab100003000000000000000000000070a01000070000000000000090ab1000010000000000000000000000a8ab100003000000000000007375646f51ac10004e000000c82b1100000000001dac100034000000000000009fef10000300000000000000dbf0100023000000c0ab10005d000000c82b1100000000001dac1000340000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e5375646f000000000008ad10000300000000000000000000005a0211000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11000cad100000000000000000001cad10000100000000000000010000004b6579003200000000000000010000007f00000024ad1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e436f6e7472616374204163636f756e74436f756e746572436f6e74726163742053746f7261676553697a654f66667365742f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e352e312f7372632f636f6465632e727300000000000000dcae10000800000000000000e4ae1000030000000000000000000000fcae100001000000000000000000000004af10000c0000000000000010af100002000000000000000000000020af100001000000000000000000000028af10000a0000000000000034af10000100000000000000000000003caf100001000000000000000000000044af10000f0000000000000054af10000100000000000000000000005caf100001000000000000000000000064af10000a0000000000000070af100002000000000000000000000080af100002000000000000000000000090af1000080000000000000098af1000020000000000000000000000a8af100001000000000000005472616e73666572bde6100009000000bde6100009000000c6e6100007000000deb0100055000000496e7374616e746961746564bde6100009000000bde6100009000000a7b0100037000000436f646553746f7265640000a3b010000400000075b010002e0000005363686564756c65557064617465640062e710000300000045b0100030000000446973706174636865640000bde61000090000007bef100004000000daaf10004e00000028b010001d000000436f6e7472616374bde6100009000000d3af100007000000b0af10002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e5665633c75383e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e4861736820436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e44656164206f7220696e6578697374656e74206163636f756e7420686173206265656e206578656d70742061626f76653b2071656464656661756c743a436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e7472616374205072697374696e65436f6465436f6e747261637420436f646553746f72616765436f6e747261637420436f6e7472616374496e666f4f66436f6e7472616374204761735072696365436f6e74726163742052656e7442797465466565436f6e747261637420546f6d6273746f6e654465706f736974436f6e74726163742052656e744465706f7369744f6666736574436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e42797465466565000000ddb210003600000076ad10005b000000bc010000050000000000000000000000a0b210003d00000076ad10005b000000c301000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b207165640000000000f0b310000f0000000000000000b4100001000000000000000000000018b4100003000000000000000000000030b41000080000000000000038b4100002000000000000000000000068b410000200000000000000000000003dd91000040000000000000078b41000040000000000000000000000d8b4100007000000000000000000000010b51000060000000000000018b5100004000000000000000000000078b510000a0000000000000000000000c8b510000f00000000000000d8b5100002000000000000000000000008b6100005000000000000007570646174655f7363686564756c65000000000051bc1000080000000000000059bc100010000000e1bb10002d000000c82b1100000000000ebc1000430000007075745f636f6465000000008cb91000090000000000000095b910000f00000000000000ddbb10000400000000000000d3af10000700000051bb100057000000a8bb100035000000000000004ab710000400000000000000dbf010002300000000000000b9f410000500000000000000bef4100015000000000000008cb91000090000000000000095b910000f00000000000000b8b910000400000000000000d3af100007000000bcb9100042000000c82b110000000000feb910004a00000048ba10002c00000074ba100046000000baba1000520000000cbb10004500000063726561746500000000000083b910000900000000000000bef4100015000000000000008cb91000090000000000000095b910000f00000000000000a4b910000900000000000000adb910000b00000000000000b8b910000400000000000000d3af1000070000006cb710006a000000c82b110000000000d6b7100021000000c82b110000000000f7b710005000000047b810004100000088b810005b000000e3b81000570000003ab910002a00000064b910001f000000636c61696d5f73757263686172676500000000004ab7100004000000000000005a0211000c000000000000004eb710000a0000000000000058b710001400000030b610005c0000008cb6100045000000c82b110000000000d1b610004e0000001fb710002b00000020416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e646573746175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c543a3a4761733e636f64655f68617368436f6465486173683c543e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e0000000000000004c510001300000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc71000000000000000000018c510000400000000000000010000000000000038c51000100000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000048c510000100000000000000010000000000000050c5100011000000000000000000000061c510000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc71000000000000000000064c510000200000000000000010000000000000074c510000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000080c510000100000000000000010000000000000088c51000110000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc6100000000000000000009cc5100007000000000000000100000000000000d4c510000f0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc610000000000000000000e4c5100002000000000000000100000000000000f4c510000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000000c610000100000000000000010000000000000008c610000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000014c61000010000000000000001000000000000001cc61000120000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc61000000000000000000030c610000100000000000000010000000000000038c61000120000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11004cc6100000000000000000005cc610000100000000000000010000000000000064c610000b0000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110070c61000000000000000000080c610000100000000000000010000000000000088c610000b000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11009cc610000000000000000000acc6100001000000000000000100000000000000b4c610000d000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100c4c610000000000000000000d4c6100001000000000000000100000000000000dcc61000080000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e4c610000000000000000000f4c6100001000000000000000100000000000000fcc6100008000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110004c71000000000000000000014c71000010000000000000001000000000000001cc710000d000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002cc7100000000000000000003cc710000100000000000000010000000000000044c7100008000000000000000000000093c610000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc7100000000000000000004cc710000100000000000000010000000000000054c710000f000000000000000000000059bc10001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110064c71000000000000000000074c71000010000000000000001000000000000007cc710000c0000000101000000000000adb910000b00000000000000d3af10000700000000000000000000000000000000000000000000000000000000000000c82b110004c81000000000000000000088c710000100000000000000000000000000000090c710000b0000000101000000000000adb910000b000000000000009bc710001600000000000000000000000000000000000000000000000000000000000000c82b110004c810000000000000000000b4c7100001000000000000000000000000000000bcc710000e000000000000000000000061c510000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100ccc710000000000000000000dcc7100001000000000000000100000000000000e4c710000e00000001010000000000005a0211000c00000000000000f2c710000f00000000000000000000000000000000000000000000000000000000000000c82b110004c81000000000000000000014c810000100000000000000000000005369676e6564436c61696d48616e646963617000facd100038000000c82b11000000000032ce10004200000074ce10001a000000546f6d6273746f6e654465706f736974c5cd10003500000053746f7261676553697a654f66667365747536344ccd10004b00000097cd10002e00000052656e744279746546656500ffcc10004d00000052656e744465706f7369744f666673657400000087cb100041000000c8cb100016000000c82b110000000000decb10005a00000038cc1000560000008ecc100053000000e1cc10001e0000005375726368617267655265776172640034cb1000390000006dcb10001a0000005472616e73666572466565000fcb1000250000004372656174696f6e46656500e8ca1000270000005472616e73616374696f6e426173654665650000b1ca1000370000005472616e73616374696f6e427974654665650000320000000000000001000000760000006eca100043000000436f6e747261637446656500320000000000000001000000800000003eca10003000000043616c6c42617365466565543a3a476173000000320000000000000001000000810000000cca1000320000004372656174654261736546656500000032000000000000000100000082000000dec910002e00000047617350726963653200000000000000010000007a000000c0c910001e0000004d61784465707468320000000000000001000000830000008ec9100032000000426c6f636b4761734c696d69740000003200000000000000010000008400000052c910003c0000004761735370656e7432c910002000000043757272656e745363686564756c6500320000000000000001000000850000000dc91000250000005072697374696e65436f6465b4c8100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c650000005bc81000590000004163636f756e74436f756e74657200003200000000000000010000007200000046c8100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e000000320000000000000001000000700000001cc810002a0000002054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d2073757263686167652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c61790000ddb210003600000076ad10005b000000f0010000050000000000000000000000000000000000000076ad10005b000000f701000005000000a425110028000000e0ce10004300000040010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6c69622e7273436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e74436f6e7472616374205369676e6564436c61696d48616e6469636170436f6e747261637420537572636861726765526577617264000000e0ce1000430000004001000001000000436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e7472616374204372656174654261736546656500b0d0100034000000e4d0100044000000a00000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f657865632e7273320000000000000001000000860000008700000088000000890000008a0000008b0000000000000028d21000080000000000000030d2100001000000000000000000000038d2100001000000000000000000000040d21000080000000000000010e6100001000000000000000000000048d2100001000000000000000000000050d21000070000000000000058d2100003000000000000000000000070d2100001000000000000000000000078d21000050000000000000010e6100001000000000000000000000080d2100001000000000000000000000088d21000080000000000000010e6100001000000000000000000000090d21000010000000000000050726f706f73656427d310000d0000006ed310000e0000005370656e64696e6734d310003a000000417761726465640027d310000d000000c6e6100007000000bde610000900000007d31000200000004275726e74000000e4d2100023000000526f6c6c6f76657298d210004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e50726f706f73616c496e646578205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e547265617375727920506f7454726561737572792050726f706f73616c730000c0d3100019000000e0d3100048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e7273a42511002800000040d410004300000061000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e727372656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665650000008c00000018000000040000008d0000008e0000008f0000009000000091000000920000006e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c206665654d6f64756c65206973206e6f742076616c696443616e2774206465636f6465207761736d20636f6465756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e73657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e656452657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c63616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646465706c6f796578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e7420747970650000000000a4da10000d00000000000000b4da1000020000000000000000000000e4da1000030000000000000000000000fcda1000070000000000000004db10000100000000000000000000001cdb100001000000000000000000000024db1000090000000000000030db100004000000000000000000000090db100001000000000000000000000098db10000f00000000000000a8db1000010000000000000000000000c0db1000010000000000000000000000c8db10001000000000000000a8db1000010000000000000000000000d8db1000020000000000000070726f706f73655f7370656e6400000000000000b9f410000500000000000000bef41000150000000000000009de10000b00000000000000dbf01000230000005cdd10004b000000a7dd10004d000000f4dd1000150000007365745f706f74000000000055dd10000700000000000000bef410001500000028dd10002d000000636f6e66696775726500000000000000e6dc10000d00000000000000f3dc1000100000000000000003dd10001500000000000000bef41000150000000000000018dd10000c0000000000000000f01000170000000000000024dd10000400000000000000f3dc100010000000cadc10001c00000072656a6563745f70726f706f73616c0000000000a9dc10000b00000000000000b4dc1000160000006adc10003f000000617070726f76655f70726f706f73616ce8db1000570000003fdc10002b00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f6964436f6d706163743c50726f706f73616c496e6465783e202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d7370656e645f706572696f646275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e62656e65666963696172795472656173757279000000003ce110000c000000000000000000000048e110000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d8e11000000000000000000050e110000200000000000000010000000000000060e11000130000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b0e11000000000000000000074e11000010000000000000001000000000000007ce110000b00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110088e11000000000000000000098e1100001000000000000000100000000000000a0e1100004000000000000000000000048e110000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d8e110000000000000000000a4e1100001000000000000000100000000000000ace11000030000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100b0e110000000000000000000c0e1100001000000000000000100000000000000c8e110000d000000000000000000000027d310000d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d8e110000000000000000000e8e1100001000000000000000100000000000000f0e1100009000000010100000000000027d310000d00000000000000f9e110002400000000000000000000000000000000000000000000000000000000000000c82b110020e21000000000000000000030e210000100000000000000000000000000000038e2100009000000000000000000000041e210001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110054e21000000000000000000064e2100001000000000000000100000050726f706f73616c426f6e645065726d696c6c00dde310005400000031e410003700000050726f706f73616c426f6e644d696e696d756d008be31000520000005370656e64506572696f64003200000000000000010000009300000069e31000220000004275726e25e3100044000000506f740032000000000000000100000076000000f2e210003300000050726f706f73616c436f756e7400000032000000000000000100000033000000c9e210002900000050726f706f73616c7350726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e00000032000000000000000100000070000000aae210001f000000417070726f76616c735665633c50726f706f73616c496e6465783e00320000000000000001000000340000006ce210003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e5472656173757279205370656e64506572696f64c0e4100039000000e0d3100048000000100200002d000000547265617375727920417070726f76616c735472656173757279204275726e00000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f50726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465780040d410004300000061000000010000000000000008e61000060000000000000010e6100001000000000000000000000018e6100001000000000000000000000020e610000e0000000000000030e6100002000000000000000000000040e6100002000000000000000000000050e610000c000000000000005ce610000200000000000000000000006ce6100001000000000000005265776172640000c6e610000700000065e71000380000004f66666c696e655761726e696e670000bde610000900000062e7100003000000cde61000520000001fe71000430000004f66666c696e65536c617368bde6100009000000c6e610000700000074e6100049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e4163636f756e74496442616c616e6365204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e75333220416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c65646765720000000000000074ea1000040000000000000078ea1000030000000000000000000000c0ea1000040000000000000000000000e0ea10000a00000000000000ecea100001000000000000000000000004eb100006000000000000000000000034eb100006000000000000003ceb100001000000000000000000000054eb10000a0000000000000000000000a4eb10001100000000000000c82b1100000000000000000000000000b8eb1000080000000000000000000000f8eb1000080000000000000000ec100001000000000000000000000018ec100005000000000000000000000040ec1000080000000000000048ec100001000000000000000000000060ec100005000000000000000000000088ec10000500000000000000c82b110000000000000000000000000090ec1000050000000000000000000000b8ec10000900000000000000c4ec1000010000000000000000000000dcec100005000000000000000000000004ed10000e0000000000000014ed10000100000000000000000000002ced100005000000000000000000000054ed1000140000000000000068ed100001000000000000000000000080ed100001000000000000000000000088ed1000140000000000000068ed10000100000000000000000000009ced1000010000000000000000000000a4ed10001300000000000000b8ed1000010000000000000000000000d0ed1000010000000000000000000000d8ed10000d00000000000000e8ed100001000000000000000000000000ee100002000000000000000000000010ee10001700000000000000b8ed100001000000000000000000000028ee100001000000000000000000000030ee1000110000000000000044ee10000100000000000000000000005cee10000100000000000000626f6e6400000000d1f010000a00000000000000dbf010002300000000000000b9f410000500000000000000bef41000150000000000000053f11000050000000000000058f11000110000009bf5100060000000fbf510001a000000c82b11000000000015f6100049000000626f6e645f65787472610000000000008df510000e00000000000000bef4100015000000d3f410005d00000030f5100009000000c82b11000000000039f5100054000000c82b1100000000007cf0100055000000756e626f6e64000000000000b9f410000500000000000000bef41000150000002ff310005500000084f3100040000000c4f310004d000000c82b11000000000011f410005200000063f4100030000000c82b110000000000fef0100055000000c82b11000000000093f410002600000077697468647261775f756e626f6e64656400000069f210004b000000c82b110000000000b4f210004d00000001f3100013000000c82b110000000000fef0100055000000c82b11000000000014f310001b00000076616c69646174650000000048f2100005000000000000004df210001c0000000ef210003a000000c82b11000000000045f0100037000000c82b110000000000fef01000550000006e6f6d696e61746500000000dff110000700000000000000e6f11000280000009bf1100044000000c82b11000000000045f0100037000000c82b110000000000fef01000550000006368696c6c00000069f1100032000000c82b11000000000045f0100037000000c82b110000000000fef01000550000007365745f70617965650000000000000053f11000050000000000000058f110001100000017f010002e000000c82b11000000000045f0100037000000c82b110000000000fef01000550000007365745f636f6e74726f6c6c6572000000000000d1f010000a00000000000000dbf010002300000017f010002e000000c82b11000000000045f0100037000000c82b1100000000007cf01000550000007365745f73657373696f6e735f7065725f657261000000009fef1000030000000000000000f0100017000000daef1000260000007365745f626f6e64696e675f6475726174696f6eaeef10002c0000007365745f76616c696461746f725f636f756e7400000000009fef10000300000000000000a2ef10000c0000007fef100020000000666f7263655f6e65775f657261000000000000006eef10000d000000000000007bef100004000000d6ee10004f00000025ef1000490000007365745f6f66666c696e655f736c6173685f677261636500b2ee1000240000007365745f696e76756c6e657261626c65730000000000000097ee10000a00000000000000a1ee10001100000064ee10003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72735665633c543a3a4163636f756e7449643e2053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e6170706c795f72657761726473626f6f6c2054686520696465616c206e756d626572206f662076616c696461746f72732e6e6577436f6d706163743c7533323e20546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e2053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e436f6d706163743c543a3a426c6f636b4e756d6265723e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e636f6e74726f6c6c65723c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636520546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e76616c7565436f6d706163743c42616c616e63654f663c543e3e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b207165640090f7100048000000870a00000e0000005374616b696e67204f66666c696e65536c6173685374616b696e6720466f7263696e674e65774572614c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656468656164206f66205374616b696e672056616c696461746f72735374616b696e67205374616b65727300000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000380111000e000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b110060041100000000000000000048011100010000000000000001000000000000005001110015000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11006801110000000000000000007801110001000000000000000100000000000000800111000e00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11009c0111000000000000000000ac01110001000000000000000100000000000000b40111000d0000000000000000000000c10111000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100c80111000000000000000000d80111000100000000000000010000000000000050e610000c0000000000000000000000c10111000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100e00111000000000000000000f001110001000000000000000100000000000000f801110011000000000000000000000062e710000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11006004110000000000000000000c02110001000000000000000100000000000000140211000f00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002402110000000000000000009ced100001000000000000000100000000000000340211000d0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d804110000000000000000004402110002000000000000000100000000000000540211000600000001010000000000005a0211000c000000000000005a0211000c00000000000000000000000000000000000000000000000000000000000000c82b11008804110000000000000000006802110001000000000000000000000000000000700211000600000001010000000000005a0211000c00000000000000760211003900000000000000000000000000000000000000000000000000000000000000c82b1100880411000000000000000000b002110001000000000000000000000000000000b80211000500000001010000000000005a0211000c0000000000000058f110001100000000000000000000000000000000000000000000000000000000000000c82b1100c00211000000000000000000d002110001000000000000000100000000000000d80211000a00000001010100000000005a0211000c000000000000004df210001c00000000000000000000000000000000000000000000000000000000000000c82b1100e40211000000000000000000f402110001000000000000000100000000000000fc0211000a00000001010100000000005a0211000c00000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000c82b1100d804110000000000000000000803110001000000000000000100000000000000100311000700000001010000000000005a0211000c00000000000000170311002400000000000000000000000000000000000000000000000000000000000000c82b11003c03110000000000000000004c031100040000000000000001000000000000006c0311000e0000000000000000000000a1ee10001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d804110000000000000000007c03110001000000000000000100000000000000840311000a00000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100080411000000000000000000900311000100000000000000010000000000000098031100140000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002c0411000000000000000000d801110001000000000000000100000000000000b8031100100000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002c0411000000000000000000c803110002000000000000000100000000000000d80311001200000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100880411000000000000000000ec03110001000000000000000000000000000000f40311001300000000000000000000008e0111000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100080411000000000000000000180411000100000000000000010000000000000020041100090000000000000000000000ac0311000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11002c04110000000000000000003c04110003000000000000000100000000000000540411000a00000001010000000000005a0211000c0000000000000062e710000300000000000000000000000000000000000000000000000000000000000000c82b11006004110000000000000000007004110001000000000000000100000000000000780411000d0000000000000000000000850411000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b11008804110000000000000000009804110001000000000000000000000000000000a00411000f0000000000000000000000af0411002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000c82b1100d80411000000000000000000e804110001000000000000000100000056616c696461746f72436f756e7400001d0c11002a0000004d696e696d756d56616c696461746f72436f756e7400000032000000000000000100000094000000cd0b11005000000053657373696f6e73506572457261543a3a426c6f636b4e756d62657232000000000000000100000077000000a40b11002900000053657373696f6e52657761726450657262696c6c320000000000000001000000950000005c0b11004800000032000000000000000100000096000000080b1100540000004f66666c696e65536c6173684772616365000000ba0a11004e000000426f6e64696e674475726174696f6e0032000000000000000100000097000000496e76756c6e657261626c6573000000e6091100690000004f0a11006b000000426f6e646564543a3a4163636f756e7449640000a6091100400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e0055091100510000005061796565000000320000000000000001000000700000001c0911003900000056616c696461746f7273000032000000000000000100000098000000cb081100510000004e6f6d696e61746f7273000072081100590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0032000000000000000100000099000000b50711006c000000210811002d000000c82b1100000000004e0811002400000043757272656e74456c65637465640000760711003f00000043757272656e7445726100005f0711001700000043757272656e7453657373696f6e52657761726442616c616e63654f663c543e43757272656e74457261526577617264d20611005a0000002c071100330000004e65787453657373696f6e735065724572610000ae061100240000004c6173744572614c656e6774684368616e676500320000000000000001000000720000007606110038000000536c6f745374616b6500000032000000000000000100000076000000fa0511004c000000c82b1100000000004606110030000000536c617368436f756e740000320000000000000001000000330000008605110074000000466f7263696e674e6577457261282900320000000000000001000000700000006c0511001a000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e0032000000000000000100000034000000f00411007c000000204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e2057652061726520666f7263696e672061206e6577206572612e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e20546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e20546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e00a425110028000000600c11004200000019020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e72735374616b696e672043757272656e7453657373696f6e5265776172640000a00f110019000000500f110048000000bb0100002d0000005374616b696e672043757272656e744572615265776172645374616b696e67204c6173744572614c656e6774684368616e67655374616b696e672053657373696f6e73506572457261000000100f110039000000500f110048000000100200002d0000005374616b696e672043757272656e74456c65637465645374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e67204e65787453657373696f6e735065724572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e67204e6f6d696e61746f72739a00000028000000040000009b0000009c00000000000000000000009d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090f7100048000000810a00000a0000005374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f20646976696465206279207a65726f636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f7420612073746173686e6f74206120636f6e74726f6c6c65725374616b696e6720426f6e64696e674475726174696f6e756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d70747900000036111100230000000c1111002a000000600c1100420000001902000001000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e6578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d5f736565646578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000003c14110047000000831411000500000000141100370000003714110005000000cd13110017000000c4131100090000001616110014000000ac13110018000000c41311000900000016161100140000007c1311001d00000099131100130000004441110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e795370656369666963009e00000004000000040000009f0000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e20427574206974206861732020747970659814110018000000b01411000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000f8141100170000000f1511001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f74200000003015110007000000537461636b3a200000000100ba151100240000009015110006000000961511000e000000a4151100160000006c1511002400000090151100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000f0151100260000001616110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e6774682032c116110007000000ea1611000b000000c116110007000000c8161100220000004e6f6e20636f6e7374616e74206f70636f646520696e20696e6974206578707245787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c2020646f65736e277420657869737473206f72206e6f742079657420646566696e6564206973206d757461626c650000000817110010000000181711000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300381711000f000000181711000f0000005461626c6520617420696e6465782000691b110012000000181711000f000000681711000e000000181711000f0000005479706520617420696e646578200000d617110010000000181711000f000000a817110010000000c81711000e000000a817110010000000b817110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b206578706563746564000010181100200000003018110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f7665006818110015000000657863656564656420737461636b206c696d6974200000009e0000000400000004000000a00000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765c818110022000000ea18110015000000ff18110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c7366756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473101a1100650000002301000017000000e01911002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a2000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a09090909716564691b1100120000007b1b11000f0000003c1b11000a000000461b1100140000005a1b11000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173a01b11005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300241c11001c000000f81b1100130000007704000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656e581c11001e000000f81b1100130000006e03000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e4e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64000000601d11006c000000c8000000110000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e6473000000501e110048000000810a00000a0000000000000000000000000000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f736c6963652f6d6f642e72735d1f1100120000006f1f11000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e64556e726561636861626c654e6f70426c6f636b00009e0000000400000004000000a10000004c6f6f704966456c7365456e644272009e0000000400000004000000050000004272496642725461626c65009e0000000400000004000000a200000052657475726e43616c6c43616c6c496e64697265637400009e0000000400000004000000a300000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e7374009e0000000400000004000000a4000000493634436f6e73749e0000000400000004000000a5000000463332436f6e7374463634436f6e73749e00000004000000040000001e00000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324636345265696e7465727072657449363456616c75659e00000004000000040000009f0000004e6f526573756c74493332493634463332463634547261696c696e6744617461556e6578706563746564456f66496e76616c696444617461802511000b000000492f4f204572726f723a2000a425110028000000cc251100500000008700000009000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e7273a425110028000000cc25110050000000900000000900000061757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e644578706c69636974207265706f7274696e67206e6f7420616c6c6f77656474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e00000000502711001000000000000000c82b110000000000000000000000000060271100010000000000000000000000682711000f00000000000000c82b110000000000000000000000000078271100010000000000000045787472696e73696353756363657373952711002500000045787472696e7369634661696c656400802711001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e7273c027110019000000e027110050000000550000002200000048617368206e6f7420657175616c000070281100190000009028110048000000070100002a000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e727352756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e670000142911002d000000412911000c0000004d29110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20582911003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e67746873f42c1100180000004508000009000000b429110011000000c529110017000000ea020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273702a11004600000063010000130000009e0000000400000004000000a6000000a7000000a80000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f7200c82b1100000000002441110002000000582a110015000000e7030000050000007372632f6c6962636f72652f726573756c742e72730000002f72757374632f613139636631386337646262636334366464646561383164663361346365653137333563323334392f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000d82b110020000000f82b110012000000320000000000000001000000a9000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900000c2d110006000000122d110022000000f42c110018000000030a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820542d1100160000006a2d11000d000000f42c110018000000090a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d003e2e11000b000000ba40110016000000772d110001000000282e110016000000e107000009000000984011000e000000a640110004000000aa40110010000000772d110001000000282e110016000000e507000005000000584011002b00000083401100150000005b010000150000003e2e11000b000000492e1100260000006f2e110008000000772e110006000000772d110001000000282e110016000000f2070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060000000c62e110002000000b02e1100160000005404000011000000b02e110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e00010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e8592000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20503a11004a000000a03c110000020000a03e11003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b0200010202020203020202020402050602020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202070202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202303a1100200000002700000019000000303a1100200000002800000020000000303a1100200000002a00000019000000303a1100200000002b00000018000000303a1100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f72000000c82b11000000000083401100150000000c04000005000000202020202c200000aa0000000c00000004000000ab000000ac000000ad0000003a202c0a9e0000000400000004000000ae000000af000000b000000028280a2c290a5d5b4572726f7200a9d302046e616d6501a0d3028c04000e6578745f626c616b65325f32353601146578745f6765745f73746f726167655f696e746f020c6578745f74776f785f313238030f6578745f7365745f73746f7261676504166578745f73616e64626f785f6d656d6f72795f6e6577051b6578745f73616e64626f785f6d656d6f72795f74656172646f776e06176578745f73616e64626f785f696e7374616e746961746507126578745f73616e64626f785f696e766f6b65081d6578745f73616e64626f785f696e7374616e63655f74656172646f776e09116578745f636c6561725f73746f726167650a1f6578745f6765745f616c6c6f63617465645f6368696c645f73746f726167650b156578745f7365745f6368696c645f73746f726167650c176578745f636c6561725f6368696c645f73746f726167650d126578745f737232353531395f7665726966790e126578745f656432353531395f7665726966790f0e6578745f7072696e745f7574663810166578745f73616e64626f785f6d656d6f72795f67657411166578745f73616e64626f785f6d656d6f72795f73657412196578745f6765745f616c6c6f63617465645f73746f7261676513106578745f73746f726167655f726f6f7414186578745f73746f726167655f6368616e6765735f726f6f7415166578745f6b696c6c5f6368696c645f73746f72616765160d6578745f7072696e745f68657817166578745f6368696c645f73746f726167655f726f6f7418236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74190d6578745f7072696e745f6e756d1a0a6578745f6d616c6c6f631b086578745f667265651c303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68326533613936366566633562316538641d553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68386234376533366466613065306633391e683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68306631383032666638373032363130641f6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6833386530623464613031316336666238200e5f5f727573745f6465616c6c6f63210e5f5f727573745f7265616c6c6f63220c5f5f727573745f616c6c6f632308727573745f6f6f6d2434616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a6866373434393834373332393266386333257d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832303636383663343338663666636136266f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6837613634306438613866643666326437276f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6832333637646566663566343136633964286c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6834663139653464663965666439373465296f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68643331666130323765323366623065322a443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68643635316366363931363039356134342b25616c6c6f633a3a666d743a3a666f726d61743a3a68303034623839663964653732303363302c793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68363862353432346131666332623061372d36636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68363230653236323832656635653638312e34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68303037626566626164653137393433382f29636f72653a3a70616e69636b696e673a3a70616e69633a3a6865383132333465353163393337356333306b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68393563343737646462366266626161373148616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a683030623835623061636366396233616132723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a686236313835393339633435303661376533723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6863336366623435623638643439393461343a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861653763313631316663393962353662353f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6834326666396134336535383734656661364473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6838323665323138616161643165656562373473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6864333634616664353761343262353462384e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837656563343764333834623739616432392e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68636239353637313034383865313135393a7f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a68383336373865373437336232633139373b86013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68616465366139636362306162613036613c483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a68353164643364383037303666353531353d3873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e743a3a68616261373133376566316164663362303e633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68373166656565646266343162363262393f4b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6864386362343736653364326464643061406a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6866666432653962373436636463633635414b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a686531623066356638356639313637663742613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a686463663566623838623739396539313543613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68316132303336373331663031333365374448616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a686138313166363237396631393932633345473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6864653265653634653565613634386337465c3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a686237383862363662343536376465333647323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6834326136316364393265383533373735482d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a6836346332626564633330326635316333496b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68333638323438323031363361326138324a783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68643362303333613462653438656538614b713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68313736393835613433343766653936664c713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68333461393266386165613639303032344d30636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68323635356136306438653935383733644e6f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68326464623661616261303865343139344f743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683666386561353034346161303330633650457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6834633439633363353430383738626163517c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68303562333237616561633834336131335227636f72653a3a7374723a3a66726f6d5f757466383a3a68343933363934636466666462393961355386017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a683232376233316430653934333637633054613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a686339333866666162356161393761643555613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6863663732666235653666303036323339567a3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173682c4469676573744974656d3e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864333266656534306633646534336262575d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864323739373035393730393361393038584e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835633138616437396361613832663461593773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68376362343961303932326633386335365a3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68653031343437613732353762376239325b3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a68616337653664616438373933393639355c34636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a68333932646266363830373033616331665d5a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a68366463666634646363323431383332655e7b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a68356337323064386662393732353830635f87013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a68663262613261616664643263323661386087013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a68373739336438353634613239356130666180013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a68343836366137383633653430333530666282013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a68386665353837666130373661336337636382013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a68643537653961656161626634333565376482013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68643838396365343863313236353337396583013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68663437616233626432393939356163616685013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68336462373931623064626563313130336784013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68323734373265653764343739343438346883013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a6864656265643663613864356561636337698d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68323366353930626464323936643433326a87013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d5f736565643a3a68323965623761643331306361373265646b7f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a68613165616332613561653435393932636c89013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a68666333363634616435326666653037346d86013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a68353132633566643039306233616263366e86013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a68663162633434333739313132336362646f88013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a68613539663762643237653436616664377088013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a68666539323630336535303861333764367189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6835633138643536396562363464316137728e013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6831346463616233663531306361343039738a013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a68383032303166303638303233356566647483013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6837343437363637306263633265663435753273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a686532343566363230396134396361333176135f5f727573745f616c6c6f635f7a65726f656477a7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a6831353433316137663739313265653536784473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a683437353738353738376537363466306279673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a68616338306331366661663464363438307a406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a68306634333331303666373834643765387b39636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a68346536303162343935373338373136317c4173726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68656134336638333362346539653230327d4673726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68353862646534643937323231313365317e3c73726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68303266656534326138623162353038347f416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a68356465633132613738653434626165618001426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a68313439353766626462643839316663628101416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a68656365633235393066333333643431358201416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a68626333623933643239396339326330398301436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a68643161626232666431353966633137658401416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a68343866656332653938373236343764628501486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f766f74696e673a3a68396438393662356230313636396139348601496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a68653962643133623766303139643831348701416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a68623438333161376630333930653534658801426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a68373865653565666333666534643531358901426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a68326133383461353031393266646662398a013e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a68663264306638323939663336303166648b01796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a68353832313432306164633736653631648c015e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68613739633364356363363665386664618d01723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68303062636238666635303361636264398e015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68646531623631383464373561333730338f014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68643465333665373130373832636437319001880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a683633373832623731303961613438356591015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861343134666465386261306665373564920130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6863636133316432326363656135376438930130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6863636133316432326363656135376438940130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683131373930303864353832366134336695017c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68656231633432613431323363313663389601633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68363165636238393138616362396166329701753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68613137336532393731643635393565329801643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683766336362323932336263646165346599018b0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a656e636f64655f746f3a3a68343430343136343231333263323530639a014d3c6e6f64655f72756e74696d653a3a4c6f67206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a68633038346231396237313266396237339b0189013c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d5265663c486173682c417574686f7269747949642c5365616c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a68646261333662363139346564653833359c014473726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a53746f726167655665633a3a6974656d3a3a68373139303062323035616637336630329d013973726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a617574686f7269746965733a3a68343038353535343163633266346539659e014773726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a736176655f6f726967696e616c5f617574686f7269746965733a3a68383437653232666634356365386131659f016f73726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a6861333839396434626334653233343664a001c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a6834366365636264333331323239373737a1013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6833643239643930613461396339376431a20188013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a6836323935353739653866616662356665a301593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6861346539613037363866363937613261a4015d3c73726d6c5f636f6e74726163743a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6837653664666462653637653539313266a501653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838303834373539626563303566383636a601633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6835366633613635376461356462373264a701643c73726d6c5f636f756e63696c3a3a766f74696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838376132303732353462383938313530a8015e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838643737366338303662386630613062a9015c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838386435363161356433333734356261aa014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834393238336662363864373066653635ab01960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6834653438373836333062656535663738ac0191013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6866363534623330326338336231336534ad01573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6838633736333230393634366233386333ae018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a6834653062623039373036356263356262af013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6838396536313438396264613866353661b0018a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6832376365633730626362663061343433b101f0023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63652c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3e3a3a6765743a3a6832356435343532363764623034373566b2013373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a6861353239626466383364353932356536b3017e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6830643131633461373334623061386361b401483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6837636464303135353361336332643061b50136636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a6861323065303937653030363965363431b6014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6861393835353266613731313531323332b701493c73726d6c5f636f6e73656e7375733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865316333313632626337646536373130b8017e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6865383636636333626635386362363235b901796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6834373165653232396365326561386663ba015e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838386332396639323262366634323137bb01723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830373933353066363562356266623962bc015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833316266643265393032313933303730bd014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834653436383366653237643434306365be014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831646530343266353038666634613536bf0183023c6e6f64655f72756e74696d653a3a4c6f6720617320636f72653a3a636f6e766572743a3a46726f6d3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c7072696d69746976655f74797065733a3a483235362c3c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572652061732073725f7072696d6974697665733a3a7472616974733a3a5665726966793e3a3a5369676e65722c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572653e3e3e3a3a66726f6d3a3a6834373632383937613236393432353630c0014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862326234393362653130323461646464c1014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866373232616438633733623739643938c201ea033c6e6f64655f72756e74696d653a3a52756e74696d65206173207375627374726174655f636c69656e743a3a72756e74696d655f6170693a3a72756e74696d655f6465636c5f666f725f436f72653a3a436f72653c73725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c7536342c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362c6e6f64655f72756e74696d653a3a4c6f673e2c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c3c73726d6c5f696e64696365733a3a4d6f64756c653c6e6f64655f72756e74696d653a3a52756e74696d653e2061732073725f7072696d6974697665733a3a7472616974733a3a5374617469634c6f6f6b75703e3a3a536f757263652c7536342c6e6f64655f72756e74696d653a3a43616c6c2c73725f7072696d6974697665733a3a416e795369676e61747572653e3e3e3e3a3a617574686f7269746965733a3a6837356462316130363836613465333064c301773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6832376464623831376430383663383666c40185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a6835306465303261386564656132306330c501773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6832353934643734363261373862393836c601793c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6865313338303461333538336365333931c701b7013c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f3c543e3e3e3a3a6765743a3a6835373231376631373263623463303233c8017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6832643732356538623262663734306238c9017e3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6866666132303631363165346339356632ca01723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6863636434653264326665376639613764cb018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6830343261373466343233633463326261cc014473726d6c5f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a6862613364666434396539373238636638cd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6830643536303136353934616436346232ce01653c73726d6c5f62616c616e6365733a3a696d62616c616e6365733a3a4e65676174697665496d62616c616e63653c542c493e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831303539623536353038306463316335cf01653c73726d6c5f62616c616e6365733a3a696d62616c616e6365733a3a506f736974697665496d62616c616e63653c542c493e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6834356666353933636361333334336636d0017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6834633231313733336235313964316233d1012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6861336261373064346433396663643430d2017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6864373865303330663937613638376532d3017d3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6832663139316632366464633036323334d4017f3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6838643937636365356635323833633038d50182013c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6865303937326339666663313235323439d601763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6864336334656235313832643632316539d7012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865643838383361383066353136666335d8014373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834316233306132333732346339383435d9014873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6831396433623464373736633861336531da014d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839396531373966653134373733303937db014e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6866343665663331633764323134346337dc01b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862656437653634343135663535616236dd013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a6865313464623830646534396138303232de017f3c284b2c204c2c204d2c204e2c204f2c20502c20512c20522c20532c20542c20552c20562c20572c20582c20592c205a292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6831653833653562376335356533353431df013673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6832643330373663306334353936613763e0013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6835666630336536373834303663666637e101523c28522c2053292061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e4368616e67653c543e3e3a3a6f6e5f73657373696f6e5f6368616e67653a3a6864663661313631663931643062323364e2014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830383630333338646262666664366438e3013873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6830656335383537626132356261396463e4013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835303736373766376266653764383138e5018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a6861616665663362333834326266613930e6013f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a6838393063346438363365336162333737e7013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6863376437303133343130356364653034e8014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837356339306238663034663663356634e9018d013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6866363939363434303163626163326262ea01a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6832626436383832366434613233663734eb013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6832303339313163353833623963386364ec013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a6836346666646630376562656332346332ed018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6833353737613333346138316264343935ee013e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6832316137323237653838313836363963ef01ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6835303639643632363536333831663137f0013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835356532666436653266306430613961f1014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864653066633038396339336439363137f2013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6833373862343463323466323565343133f3014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838636436363962656232643139323538f4014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830353732653163626434623539396565f5013b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6863316535376330306138653364383331f6016b3c73726d6c5f6772616e6470613a3a53746f72656450656e64696e674368616e67653c4e2c53657373696f6e4b65793e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833663364663165323564343838656438f7013673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6864383665393233303865303430626233f80189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a6837643833376236626464343035653735f901573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6865303838653235643162366131303639fa012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6832343535316534646531393365326230fb014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835386631306138316338343533313866fc01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830363261643234613830353562306235fd012c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6866396237376336633333386230306334fe01443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837343339666464333634663035353865ff01483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68306235376333666564313566646630668002463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683333633661303333616463363039613381024e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68363231366236633736636533313862308202493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68396137646137393938623231303465308302473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683864646434363261643163633963373284024173726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a683337386265343765383237363365636385023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683831396538666437303236343763333586024c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a68316261663332643735323364323963368702453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683462366433666331316635336332353888024573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a683132393536303335366639363863393589023573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a68636132626636633833373836393862368a024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68666665336563623961363333636133628b023673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d5f736565643a3a68613531633461663633353835653334348c02643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68613630336434333435623263393864668d02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68313832356332343366643836643935398e02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68393965636234656638323165643761658f02463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a686639393338333334613666346533393490023e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683033373138336664643634613863636291024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a683633313534336134326532316437346392024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68323362643265383836313433623966369302663c73726d6c5f73797374656d3a3a5f5f476574427974655374727563744576656e74733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68646334303233346232373163636535389402693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683736363532366430303137366431323295026e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686438613539336337663663636430663996023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a683539646464626663383466393436386297023873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a683163646361653730636339383338613398024173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6839636435636432396338626435366533990249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68313439623963316534376334393935639a022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68643633663230363439343866313563329b0235636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68396664316139393965326363313634329c022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68333264373262626231373433313937629d02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68363665323265343562316233656162629e02483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68366531613831323530393639376662619f02aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6833623434666634336337393064623831a0024173726d6c5f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a6834653464373436626138333462373737a1023d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6836343038393833396665346533616138a2023e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6834623761623131363432326461386338a3023673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6838643931326264643836656431353363a402483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6832636638393930663338366137383734a5024273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6838346361363737646637663261373636a6024773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6838363665326634393566623163303263a7026f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862353235323166666362336565626663a8023473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a6862396534373634653837613464636530a9028e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6864323330376463666431313538303264aa0281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6866303731303838643939393161373262ab02e8013c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c206938292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6832376538323936333266336566386539ac02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6832333963626266336662653937623438ad023c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6866363765363265613431316363653139ae024173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836626664663766393538323964373530af024673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861623934613639346166353132323461b0026e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838366339613663363138663731663465b102703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830386237306138356238353265656331b202b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6863306365306131326135656338643161b30289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6861313037626262653031646332646133b402313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833326530616561323664303766306338b502303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837346537366133383937353165343431b602443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837343339666464333634663035353865b702b50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a6866623934316439653836376439333837b8023573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6865383465303932666638396239616430b902483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6865333061613064663934613130633364ba020c436f72655f76657273696f6ebb0212436f72655f657865637574655f626c6f636bbc02af0173725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a5f494d504c5f4445434f44455f464f525f426c6f636b3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c4865616465722c45787472696e7369633e3e3a3a6465636f64653a3a6863343939373766653936636334386632bd024173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a6832353466613837623166313132343739be026c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a6831666334623038643464356636623730bf0215436f72655f696e697469616c697a655f626c6f636bc00210436f72655f617574686f726974696573c102114d657461646174615f6d65746164617461c202603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6835626233656130316462356365306162c302433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6861386165663834663163376663623131c402623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830326536393333633865613033323665c502623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6839343137396332363131646231653438c602623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6833383737333836666366346633663263c7021c426c6f636b4275696c6465725f6170706c795f65787472696e736963c8021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bc90220426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373ca025d3c7375627374726174655f696e686572656e74733a3a496e686572656e7444617461206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863393164663866366662353865616639cb023873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6838653239383931336562376461336165cc021c426c6f636b4275696c6465725f636865636b5f696e686572656e7473cd02477375627374726174655f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a6835346165656337616435356364623235ce0218426c6f636b4275696c6465725f72616e646f6d5f73656564cf022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6ed002214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572d102214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765d202204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765d3021e4772616e6470614170695f6772616e6470615f617574686f726974696573d402513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6861323537343263666131303361343063d50215417572614170695f736c6f745f6475726174696f6ed6021a417574686f7269746965734170695f617574686f726974696573d702693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6833303361366665383461343233613966d802693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6834623830643935643239663336376439d9026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6864343162313437313063333865326236da023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6832626335656566326166663036363734db023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6837643933313731353764653466343164dc024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831346533666630666439653562366161dd024173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863383639386566386631323134386663de024573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6866616366626262363163613334393035df024673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6861363662386466306636313235306463e0024b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836636261306163313530613439336166e102733c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744c6561646572626f6172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866663433653263346130373032323533e202713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862396632333033396136323731643435e302743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839636630626331663238303635393839e402743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f74696e67506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838613266343135386665663631303131e5027b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837616237316264376630613762613665e602723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837643730396664333436376662623866e7027c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836343435323230313431616333333862e802753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836646462343361383463653465363637e9024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a6833376664636563356336363230623032ea023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a6836303738663133663064373165303231eb023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a6861653733306434396564623530656162ec02416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6833393631353830336231306664363132ed023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6836623831613362373437343962663538ee023a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861343534303736323961623463373438ef023f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6839316161363135356137346130303966f0024473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6838303461363365656332643533633264f1024173726d6c5f636f6e74726163743a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6861353362616139663436326436346430f2023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830356661336163663335316633393262f3023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861356636386561656562343634306164f4024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830333336616136336339633035666362f5024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830323461666139363030623563303661f602703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862316431626163316637333861303764f702673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6865613365616431373761313463353465f802b4013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6830313233326237306164393335313336f9024273726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862386434663132653164323239366339fa024773726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836393631333461626262306266353738fb024c73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6837316161363937343363613036626330fc023a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862356237623565333431636635396164fd023f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6863666230383762323734663762313736fe024473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861633936383838633330343835333939ff022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a68646365363631333963333366376631618003f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68393538383639623831323661393433358103d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a686232323537616134303636666332373282036f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a686365393934623961633232343732313483033b73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a7665746f5f6f663a3a686564303531353463363430356534396284033773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683534316234393864633430376235303985033c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683034343832616165316364626134373386034173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68303233373433656330653362633938358703613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68373262646465363965613037313261658803303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a683331396466633566313063353638383589033b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68373036356538393636623165333165648a034073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68663962346130373034356630393330378b034573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68376334363965626365393339333764638c03703c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68343663326231626132666561363337328d03703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68643061336366356230363832313966648e03713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68303830633662333035646635346230628f036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683333616333313931336138616434393590036a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683836653830663963663234663865666691036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686437616664656631393335393435656592036d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683733356230386465326131326363353493036d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68663834326336636233373831613063629403483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a683866376461336138613634616433323295033473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a683536633430383235393032356134333396033073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6832623162646636343130633934396139970330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68363031363032343335313535363830359803467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a686265353032383931343639373330373499034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a68363761353135643933396538656335349a03397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a68616537366466616236313736613561379b03347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a68396132396161353130363036313065309c03553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68323663636432393964303536656431329d03473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68663361333261663363383232376366379e034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a68323061346235333934306364623139349f03457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6865366334623561376335396366373636a00348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6836393863383461356539303237316234a1033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6833346434666534343661363066636634a203537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6834613339666461663636663035666339a303a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6863316163323235376166643336366438a4033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a6835386239383664613662653961386231a5032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6865373063333837666238333536346236a603507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6862626531666534313739373336316638a7033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6830633033303732326336613132313739a8033b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830656262653664663863666534633462a9034073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832633130633762616136626461633861aa034573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839636562326636336661643835616633ab036d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837666565643232623865633635323961ac033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6834303133333637306533346265393230ad033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835643935343733343763653231656464ae033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863393137356334643235643162326237af033a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834393164653164383037393433626634b0033f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6865386163363234363032303366616136b103aa0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63652c426c6f636b4e756d6265723e3e3a3a6465636f64653a3a6838353835306336346561333534326633b2034473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861633531333035663433303636626234b30330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830326164366239623231373536326562b403683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866313363633865313331316136386637b5036b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835613062343361383037366664613961b603703c73726d6c5f7374616b696e673a3a5f5f47657442797465537472756374426f6e64696e674475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865323838613532663062336239653635b7036d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866646163393138633931313864316662b8036e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861643230393464653265333266393335b903763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6834303939323431366332666464356363ba0344636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a6835313935393064653537373436613937bb033773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a6832616239306330366236303565663264bc033973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6863373438326561393133346366396532bd0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832663066313333366634346139343733be033e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a6866343233336639653335353936653839bf03347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a6864366365346237643436656665656363c003547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a6865373637633139356366666565343364c103347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a6832666661363331333762346161303437c203537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a6839323137323536346234356432383239c303547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a6862333161613864376633643830643331c403557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a6865336636383338623564646439363938c503547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a6838306437313634383164303839613636c603407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a6837356430643762626238353635316639c703537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a6836663939353264366532373932306461c803547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6866356430656364623630303033643132c903553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864356431653264633437346334393464ca034e3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6865303763376366323765393231303937cb03543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862386164623361313938373237386637cc0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6832666263636334336632373438306535cd033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6834626264343232393037633263656634ce032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6866336231383831333937313532373931cf0339636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a6862393165306464623363646530613936d0034c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839663665366631613061323065313536d103303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862653332343265636534313937326664d203453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6865383232383163363336643663323036d30323636f72653a3a666d743a3a77726974653a3a6864323336313062353362373333383936d40341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6861303766366438356332383066396431d503323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6834336266323736653234366132356534d6033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6834356438393230323362326163333330d703613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831626630323563336161343738626331d803593c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831386165666338663061666665636235d903533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6862663862363631613030383835626363da0346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6838663764323864306135303132383631db034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6833626631633865326537653535393639dc03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838363032633631343862663834623033dd03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839366536353534383961333834303034de03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837666333643032306232636139626136df03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838333935666530363132653435393861e003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866656238656238313733313437313965e103463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833306533373831636265363334623763e203303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864343832313936386265613832376637e3039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6861633630663631376638663866366463e403423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6863386362396435663831653137653435e503623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865613735376337343864366466386131e60311727573745f626567696e5f756e77696e64e7034e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6832666561303536396339663237376639e8030a5f5f72675f616c6c6f63e9030c5f5f72675f6465616c6c6f63ea030c5f5f72675f7265616c6c6f63eb03115f5f72675f616c6c6f635f7a65726f6564ec032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6830626539663036613337326361663465ed033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864383465363962636438366635393534ee033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6832323737666634316639666336343065ef033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6861643733613534306538646564616461f0033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6863613031376263366634613537636536f103313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6836343762373638373864336135646264f20343636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6863346462323038393365323564366633f3032e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a6839323262396462613163316331616434f4034a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866323838326631333737333536653963f503323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836346364616437356533656439393830f6033d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a6834613663626664323038323765616338f7034e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68313439623963316534376334393935632e32313135f80334636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a6864633430366164396336343538353333f9032e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a6864656634383536363638376464383561fa038001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a6834373265323933316464376639643539fb03533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6864356464623965323366393563613365fc0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6836646538373161663933663439393036fd032f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6831633836306263303131396334636563fe032e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a6838393036336562363362626432323033ff0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683035316634653030353938636336313680043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a683063636130623236663536343732653981043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a686565653064616262376531623438656182043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68303332376639313166636562316331338304066d656d7365748404066d656d6370798504076d656d6d6f76658604066d656d636d708704095f5f756469767469338804085f5f6d756c74693389043f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f693132385f73686c3a3a68303735336131656530316466313739338a043f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f753132385f7368723a3a68633934343437646462326666336637658b040c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33362e302d6e696768746c79202861313963663138633720323031392d30352d303629", + "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0xdade128e67a5ed110063f56a01ab6bbf": "0x0000000000000000", + "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0xbd393c7a86c2574659297d84a8c369613134cd3b80b8b92f816e3ff845991bf4": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332", + "0xe18ad90fcd74459141a97efeed86f463": "0x0800000000000000", + "0x472b8f236d06a2ff7f1e9b2e848ef1d5": "0x0080e03779c311000000000000000000", + "0xfc2dc4b8bb0b9ca8f01a73a726f7c7f5": "0x00e1000000000000", + "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", + "0xb7b6ec0f25eb1ed8b91d05f697d7a874": "0x0c00000000000000", + "0x3a617574683a00000000": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332", + "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", + "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", + "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", + "0x5286264f4d2ddb5a0d2950bf3bcfb9f6": "0x10000000000000000000000000000000", + "0xd8bc278604e9f924a948f47f58be8f89": "0x04000000000000000000000000000000", + "0x0e0cdac0d4de97c54f3ae216b003fa81": "0x0c00000000000000", + "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", + "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", + "0x59b17352bea17cb7dec6dde697de7db4": "0x6400000000000000", + "0xb8f48a8c01f629d6dc877f64892bed49": "0x0000000000000000", + "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", + "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", + "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", + "0x121725e2f949944d00a8c011c0db54ae07b84a6ca772adf3c65417345d91522d": "0x0000c16ff28623000000000000000000", + "0x3a617574683a03000000": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x4a8b1a5c7681353a6a320553abbbca49": "0x4038000000000000", + "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", + "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", + "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", + "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", + "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", + "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", + "0x74d5dca6735bab024bc25136daaab7c0": "0x06", + "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", + "0x15b569617561081f097bbc5c5a059d2f7ccf6d23be534cffa33fb544946a6a92": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", + "0xd9c94b41dc87728ebf0a966d2e9ad9c0": "0x3200000000000000", + "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", + "0x90e2849b965314409e8bc00011f3004f": "0x04000000", + "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", + "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300", + "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", + "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", + "0x2ec6e5652282d579398fb8fdfa531ef6": "0x0000000000000000", + "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", + "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", + "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", + "0x93940e78496482b15b64783020bbdfa0": "0x6400000000000000", + "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", + "0x3a6772616e6470613a617574683a00000000": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993320100000000000000", + "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", + "0x51322b89410377cf0f1bdeeafd212f07": "0xe8030000000000000000000000000000", + "0x34de7fc8c73e4252b9e09a9e3bf602f8": "0x6400000000000000", + "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", + "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", + "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", + "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", + "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", + "0x3a617574683a02000000": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440", + "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", + "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", + "0x656abc4530eb4c1692051ca24c867220aa8d62e4a9686b432f760de7455e8f95": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440", + "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", + "0x7e6064dc0e78ffebb59b3053826a9467": "0x10781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc152666bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x1ba14d232d3c301a93e35f55e3d7aef2d98dbb9cc0ce48f457b81b421e0f704d": "0x0000c16ff28623000000000000000000", + "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", + "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", + "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", + "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", + "0x3a6772616e6470613a617574683a6c656e": "0x04000000", + "0x3a617574683a6c656e": "0x04000000", + "0xe7ea0ae62a742dc4e1a569cdb99af499": "0x0200000000000000", + "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", + "0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809", + "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x1066bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0x3a6772616e6470613a617574683a03000000": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000", + "0x3a617574683a01000000": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f", + "0xca0bd0e7fdd2e3998e5245f7c228191c": "0x96000000000000000000000000000000", + "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", + "0x99e2aba8a2b7c8ccba2d740fb86adb0c": "0x00", + "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", + "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", + "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300", + "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", + "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", + "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", + "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000" + } + } +} diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index a5ddd5ab81e543b74486e5bab944507050d73756..336636fef884b027398a50e46df7ba72ce62935e 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -23,7 +23,7 @@ use node_runtime::{ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, Dem SudoConfig, ContractConfig, GrandpaConfig, IndicesConfig, Permill, Perbill}; pub use node_runtime::GenesisConfig; use substrate_service; -use hex_literal::{hex, hex_impl}; +use hex_literal::hex; use substrate_telemetry::TelemetryEndpoints; const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -31,40 +31,41 @@ const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; /// Specialized `ChainSpec`. pub type ChainSpec = substrate_service::ChainSpec; -/// Emberic Elm testnet generator -pub fn emberic_elm_config() -> Result { - ChainSpec::from_embedded(include_bytes!("../res/emberic-elm.json")) +/// Flaming Fir testnet generator +pub fn flaming_fir_config() -> Result { + ChainSpec::from_embedded(include_bytes!("../res/flaming-fir.json")) } fn staging_testnet_config_genesis() -> GenesisConfig { // stash, controller, session-key // generated with secret: - // for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/elm/$j/$i; done; done + // for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/fir/$j/$i; done; done // and - // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//elm//$j//$i; done; done - + // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//fir//$j//$i; done; done let initial_authorities: Vec<(AccountId, AccountId, AuthorityId)> = vec![( - hex!["72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c"].unchecked_into(), // 5Ef78yxqfaxVzrFCemYcSgwVtMV85ywykhLNm5WKTsZV22HZ - hex!["f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19"].unchecked_into(), // 5HWfszmRMbzcjGmumYkkHtNJbi9y428JHgPeftVenvDgVUjh - hex!["e29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed"].unchecked_into(), // 5HBoHDLMR4jPwB6BCLyd2qfYBHytFhGs8fsa1h5PzhYd3WBq + hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy + hex!["781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"].unchecked_into(), // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq + hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC ),( - hex!["2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17"].unchecked_into(), // 5CqiScHtxUatcQpck1tUks51o3pSjKsdCi2CLEHvMM7tc4Qi - hex!["eacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267"].unchecked_into(), // 5HNZXnSgw21idbuegTC1J8Txkja97RPnnWkX68ewnrJDec2Z - hex!["e19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495"].unchecked_into(), // 5HAWoPYfyYFHjacy8H2MDmHra7jVrPtBfFMPgd8CadpSqotL + hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), // 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2 + hex!["c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"].unchecked_into(), // 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF + hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE ),( - hex!["fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e"].unchecked_into(), // 5HpF9orzkmJ9ga3yrzNS9ckifxF3tbQjadEmCEiZJQ2fPgun - hex!["f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c"].unchecked_into(), // 5HVwyfB3LRsFXm7frEHDYyhwdpTYDRWxEqDKBYVyLi6DsPXq - hex!["1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44"].unchecked_into(), // 5ChJ5wjqy2HY1LZw1EuQPGQEHgaS9sFu9yDD6KRX7CzwidTN + hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), // 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp + hex!["9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"].unchecked_into(), // 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9 + hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d ),( - hex!["60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743"].unchecked_into(), // 5EFByrDMMa2m9hv4jrpykXaUyqjJ9XZH81kJE4JBa1Sz2psT - hex!["2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678"].unchecked_into(), // 5D22qQJsLm2JUh8pEfrKahbkW21QQrHTkm4vUteei67fadLd - hex!["f54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077"].unchecked_into(), // 5HcLeWrsfL9RuGp94pn1PeFxP7D1587TTEZzFYgFhKCPZLYh + hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), // 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9 + hex!["66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"].unchecked_into(), // 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn + hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 )]; - // generated with secret: subkey inspect "$secret"/elm + + // generated with secret: subkey inspect "$secret"/fir let endowed_accounts: Vec = vec![ - hex!["c224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f"].unchecked_into(), //5GTG5We6twtoF6S4kUXJ77rWBsHBoHLS3JVf5KvvnxKdGQZr + hex!["9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809"].unchecked_into(), // 5Ff3iXP75ruzroPWRP2FYBHWnmGGBSb63857BgnzCoXNxfPo ]; + const MILLICENTS: u128 = 1_000_000_000; const CENTS: u128 = 1_000 * MILLICENTS; // assume this is worth about a cent. const DOLLARS: u128 = 100 * CENTS; @@ -107,12 +108,12 @@ fn staging_testnet_config_genesis() -> GenesisConfig { }), staking: Some(StakingConfig { current_era: 0, - offline_slash: Perbill::from_billionths(1_000_000), - session_reward: Perbill::from_billionths(2_065), + offline_slash: Perbill::from_parts(1_000_000), + session_reward: Perbill::from_parts(2_065), current_session_reward: 0, validator_count: 7, sessions_per_era: 12, - bonding_duration: 60 * MINUTES, + bonding_duration: 12, offline_slash_grace: 4, minimum_validator_count: 4, stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), @@ -152,6 +153,12 @@ fn staging_testnet_config_genesis() -> GenesisConfig { burn: Permill::from_percent(50), }), contract: Some(ContractConfig { + signed_claim_handicap: 2, + rent_byte_price: 4, + rent_deposit_offset: 1000, + storage_size_offset: 8, + surcharge_reward: 150, + tombstone_deposit: 16, transaction_base_fee: 1 * CENTS, transaction_byte_fee: 10 * MILLICENTS, transfer_fee: 1 * CENTS, @@ -216,6 +223,7 @@ pub fn testnet_genesis( initial_authorities: Vec<(AccountId, AccountId, AuthorityId)>, root_key: AccountId, endowed_accounts: Option>, + enable_println: bool, ) -> GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(|| { vec![ @@ -237,6 +245,28 @@ pub fn testnet_genesis( const STASH: u128 = 1 << 20; const ENDOWMENT: u128 = 1 << 20; + let mut contract_config = ContractConfig { + signed_claim_handicap: 2, + rent_byte_price: 4, + rent_deposit_offset: 1000, + storage_size_offset: 8, + surcharge_reward: 150, + tombstone_deposit: 16, + transaction_base_fee: 1, + transaction_byte_fee: 0, + transfer_fee: 0, + creation_fee: 0, + contract_fee: 21, + call_base_fee: 135, + create_base_fee: 175, + gas_price: 1, + max_depth: 1024, + block_gas_limit: 10_000_000, + current_schedule: Default::default(), + }; + // this should only be enabled on development chains + contract_config.current_schedule.enable_println = enable_println; + GenesisConfig { consensus: Some(ConsensusConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), @@ -265,7 +295,7 @@ pub fn testnet_genesis( minimum_validator_count: 1, validator_count: 2, sessions_per_era: 5, - bonding_duration: 2 * 60 * 12, + bonding_duration: 12, offline_slash: Perbill::zero(), session_reward: Perbill::zero(), current_session_reward: 0, @@ -308,19 +338,7 @@ pub fn testnet_genesis( spend_period: 12 * 60 * 24, burn: Permill::from_percent(50), }), - contract: Some(ContractConfig { - transaction_base_fee: 1, - transaction_byte_fee: 0, - transfer_fee: 0, - creation_fee: 0, - contract_fee: 21, - call_base_fee: 135, - create_base_fee: 175, - gas_price: 1, - max_depth: 1024, - block_gas_limit: 10_000_000, - current_schedule: Default::default(), - }), + contract: Some(contract_config), sudo: Some(SudoConfig { key: root_key, }), @@ -337,6 +355,7 @@ fn development_config_genesis() -> GenesisConfig { ], get_account_id_from_seed("Alice"), None, + true, ) } @@ -353,6 +372,7 @@ fn local_testnet_genesis() -> GenesisConfig { ], get_account_id_from_seed("Alice"), None, + false, ) } diff --git a/node/cli/src/error.rs b/node/cli/src/error.rs deleted file mode 100644 index dd5448ac8ad6366813387e7694a4f69872117ff7..0000000000000000000000000000000000000000 --- a/node/cli/src/error.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// 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 Substrate. If not, see . - -//! Initialization errors. - -use client; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed -}; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - } - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } -} diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index f0c28133c2da2d1b19409a7303f5123c8e4bf0a1..886c6eef772a00b4ba0d0118164c73b20ac7ca79 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -37,8 +37,8 @@ pub enum ChainSpec { Development, /// Whatever the current runtime is, with simple Alice/Bob auths. LocalTestnet, - /// The Emberic Elm testnet. - EmbericElm, + /// The Flaming Fir testnet. + FlamingFir, /// Whatever the current runtime is with the "global testnet" defaults. StagingTestnet, } @@ -47,7 +47,7 @@ pub enum ChainSpec { impl ChainSpec { pub(crate) fn load(self) -> Result { Ok(match self { - ChainSpec::EmbericElm => chain_spec::emberic_elm_config()?, + ChainSpec::FlamingFir => chain_spec::flaming_fir_config()?, ChainSpec::Development => chain_spec::development_config(), ChainSpec::LocalTestnet => chain_spec::local_testnet_config(), ChainSpec::StagingTestnet => chain_spec::staging_testnet_config(), @@ -58,7 +58,7 @@ impl ChainSpec { match s { "dev" => Some(ChainSpec::Development), "local" => Some(ChainSpec::LocalTestnet), - "" | "elm" | "emberic-elm" => Some(ChainSpec::EmbericElm), + "" | "fir" | "flaming-fir" => Some(ChainSpec::FlamingFir), "staging" => Some(ChainSpec::StagingTestnet), _ => None, } @@ -80,7 +80,7 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul { cli::parse_and_execute::( load_spec, &version, "substrate-node", args, exit, - |exit, _custom_args, config| { + |exit, _cli_args, _custom_args, config| { info!("{}", version.name); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017-2019"); @@ -118,8 +118,8 @@ fn run_until_exit( { let (exit_send, exit) = exit_future::signal(); - let executor = runtime.executor(); - cli::informant::start(&service, exit.clone(), executor.clone()); + let informant = cli::informant::build(&service); + runtime.executor().spawn(exit.until(informant).map(|_| ())); let _ = runtime.block_on(e.into_exit()); exit_send.fire(); diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index b9c7ddffeef6407146757b77722d005cb5187c13..a4ac1b0660aae07fd868ee8a3d1b78f71c38689c 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -21,9 +21,9 @@ use std::sync::Arc; use std::time::Duration; -use client; +use client::{self, LongestChain}; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; -use grandpa; +use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; use primitives::{Pair as PairT, ed25519}; use node_primitives::Block; @@ -31,12 +31,14 @@ use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, + error::{Error as ServiceError}, }; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use inherents::InherentDataProviders; use network::construct_simple_protocol; use substrate_service::construct_service_factory; use log::info; +use substrate_service::TelemetryOnConnect; construct_simple_protocol! { /// Demo protocol attachment for substrate. @@ -89,10 +91,13 @@ construct_service_factory! { }); let client = service.client(); + let select_chain = service.select_chain() + .ok_or(ServiceError::SelectChainRequired)?; executor.spawn(start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client, + select_chain, block_import.clone(), proposer, service.network(), @@ -110,19 +115,40 @@ construct_service_factory! { local_key }; - executor.spawn(grandpa::run_grandpa( - grandpa::Config { - local_key, - // FIXME #1578 make this available through chainspec - gossip_duration: Duration::from_millis(333), - justification_period: 4096, - name: Some(service.config.name.clone()) + let config = grandpa::Config { + local_key, + // FIXME #1578 make this available through chainspec + gossip_duration: Duration::from_millis(333), + justification_period: 4096, + name: Some(service.config.name.clone()) + }; + + match config.local_key { + None => { + executor.spawn(grandpa::run_grandpa_observer( + config, + link_half, + service.network(), + service.on_exit(), + )?); + }, + Some(_) => { + let telemetry_on_connect = TelemetryOnConnect { + on_exit: Box::new(service.on_exit()), + telemetry_connection_sinks: service.telemetry_on_connect_stream(), + executor: &executor, + }; + let grandpa_config = grandpa::GrandpaParams { + config: config, + link: link_half, + network: service.network(), + inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + on_exit: service.on_exit(), + telemetry_on_connect: Some(telemetry_on_connect), + }; + executor.spawn(grandpa::run_grandpa_voter(grandpa_config)?); }, - link_half, - service.network(), - service.config.custom.inherent_data_providers.clone(), - service.on_exit(), - )?); + } Ok(service) } @@ -130,11 +156,11 @@ construct_service_factory! { LightService = LightComponents { |config, executor| >::new(config, executor) }, FullImportQueue = AuraImportQueue - { |config: &mut FactoryFullConfiguration , client: Arc>| { + { |config: &mut FactoryFullConfiguration , client: Arc>, select_chain: Self::SelectChain| { let slot_duration = SlotDuration::get_or_compute(&*client)?; let (block_import, link_half) = - grandpa::block_import::<_, _, _, RuntimeApi, FullClient>( - client.clone(), client.clone() + grandpa::block_import::<_, _, _, RuntimeApi, FullClient, _>( + client.clone(), client.clone(), select_chain )?; let block_import = Arc::new(block_import); let justification_import = block_import.clone(); @@ -145,6 +171,8 @@ construct_service_factory! { slot_duration, block_import, Some(justification_import), + None, + None, client, NothingExtra, config.custom.inherent_data_providers.clone(), @@ -152,16 +180,39 @@ construct_service_factory! { }}, LightImportQueue = AuraImportQueue { |config: &FactoryFullConfiguration, client: Arc>| { + let fetch_checker = client.backend().blockchain().fetcher() + .upgrade() + .map(|fetcher| fetcher.checker().clone()) + .ok_or_else(|| "Trying to start light import queue without active fetch checker")?; + let block_import = grandpa::light_block_import::<_, _, _, RuntimeApi, LightClient>( + client.clone(), Arc::new(fetch_checker), client.clone() + )?; + let block_import = Arc::new(block_import); + let finality_proof_import = block_import.clone(); + let finality_proof_request_builder = finality_proof_import.create_finality_proof_request_builder(); + import_queue::<_, _, _, ed25519::Pair>( SlotDuration::get_or_compute(&*client)?, - client.clone(), + block_import, None, + Some(finality_proof_import), + Some(finality_proof_request_builder), client, NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) + }}, + SelectChain = LongestChain, Self::Block> + { |config: &FactoryFullConfiguration, client: Arc>| { + Ok(LongestChain::new( + client.backend().clone(), + client.import_lock() + )) } }, + FinalityProofProvider = { |client: Arc>| { + Ok(Some(Arc::new(GrandpaFinalityProofProvider::new(client.clone(), client)) as _)) + }}, } } diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 72d1407d425528c8d9a8a3dcaf467c5dd63f8946..89b448ec90141481644a2dd7faa7df59031e0567 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-executor" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index c855a4e6f00c50c0a69b980842be3b2472eeeb3d..c6903529c4cd1a21af259e580ae6b3a26ee25af9 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -34,17 +34,17 @@ mod tests { use keyring::{AuthorityKeyring, AccountKeyring}; use runtime_support::{Hashable, StorageValue, StorageMap, traits::Currency}; use state_machine::{CodeExecutor, Externalities, TestExternalities}; - use primitives::{twox_128, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, + use primitives::{twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId}; - use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; - use runtime_primitives::{generic, generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; + use runtime_primitives::traits::{Header as HeaderT, Hash as HashT, Digest, DigestItem}; + use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; use {balances, indices, session, system, staking, consensus, timestamp, treasury, contract}; use contract::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System, - SystemConfig, GrandpaConfig, IndicesConfig, Event, Log}; + SystemConfig, GrandpaConfig, IndicesConfig, Event}; use wabt; use primitives::map; @@ -119,13 +119,13 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ - twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], twox_128(>::key()).to_vec() => vec![70u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16] ]); @@ -152,13 +152,13 @@ mod tests { #[test] fn bad_extrinsic_with_native_equivalent_code_gives_error() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ - twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], twox_128(>::key()).to_vec() => vec![70u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16] ]); @@ -185,13 +185,13 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ - twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16] ]); @@ -222,13 +222,13 @@ mod tests { #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ - twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16] ]); @@ -442,8 +442,10 @@ mod tests { ] ); - let digest = generic::Digest::::default(); - assert_eq!(Header::decode(&mut &block2.0[..]).unwrap().digest, digest); + // session change => consensus authorities change => authorities change digest item appears + let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; + assert_eq!(digest.logs().len(), 1); + assert!(digest.logs()[0].as_authorities_change().is_some()); (block1, block2) } @@ -488,7 +490,8 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), @@ -497,23 +500,28 @@ mod tests { bob().into(), 69, 0 - )) + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Spending(0)) + event: Event::treasury(treasury::RawEvent::Spending(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Burnt(0)) + event: Event::treasury(treasury::RawEvent::Burnt(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Rollover(0)) + event: Event::treasury(treasury::RawEvent::Rollover(0)), + topics: vec![], }, ]); }); @@ -535,7 +543,8 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), @@ -546,11 +555,13 @@ mod tests { 5, 0 ) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(2), @@ -561,27 +572,33 @@ mod tests { 15, 0 ) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(2), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::session(session::RawEvent::NewSession(1)) + event: Event::treasury(treasury::RawEvent::Spending(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Spending(0)) + event: Event::treasury(treasury::RawEvent::Burnt(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Burnt(0)) + event: Event::treasury(treasury::RawEvent::Rollover(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Rollover(0)) + event: Event::session(session::RawEvent::NewSession(1)), + topics: vec![], }, ]); }); @@ -745,7 +762,13 @@ mod tests { runtime_io::with_externalities(&mut t, || { // Verify that the contract constructor worked well and code of TRANSFER contract is actually deployed. - assert_eq!(&contract::CodeHashOf::::get(addr).unwrap(), &transfer_ch); + assert_eq!( + &contract::ContractInfoOf::::get(addr) + .and_then(|c| c.get_alive()) + .unwrap() + .code_hash, + &transfer_ch + ); }); } @@ -796,13 +819,13 @@ mod tests { fn panic_execution_gives_error() { let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.wasm"); let mut t = TestExternalities::::new_with_code(foreign_code, map![ - twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], twox_128(>::key()).to_vec() => vec![70u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16] ]); @@ -818,13 +841,13 @@ mod tests { fn successful_execution_gives_ok() { let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"); let mut t = TestExternalities::::new_with_code(foreign_code, map![ - twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32], + blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16] ]); diff --git a/node/primitives/Cargo.toml b/node/primitives/Cargo.toml index b51528c80a909852703943bdebb760fe73a89a74..db40d91346ec10b344d7083800598f99bf6742a0 100644 --- a/node/primitives/Cargo.toml +++ b/node/primitives/Cargo.toml @@ -1,12 +1,11 @@ [package] name = "node-primitives" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -23,6 +22,5 @@ std = [ "primitives/std", "rstd/std", "runtime_primitives/std", - "serde_derive", "serde", ] diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 0d8906c47df817f4c6c62c2a3b6d54365b47bb77..4dde59296f4980c6ec4a0b3bf6734609de6405bf 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -19,7 +19,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] use runtime_primitives::{ generic, traits::{Verify, BlakeTwo256}, OpaqueExtrinsic, AnySignature diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index 9cdceb96ac91d36e17347966b1a709ccaa5d6810..486a5b80a01bfc5095cae70366d0daf7f1518545 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -34,13 +34,15 @@ sudo = { package = "srml-sudo", path = "../../srml/sudo", default-features = fal node-primitives = { path = "../primitives", default-features = false } consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default-features = false } rustc-hex = { version = "2.0", optional = true } -hex-literal = { version = "0.1.0", optional = true } serde = { version = "1.0", optional = true } substrate-keyring = { path = "../../core/keyring", optional = true } consensus_authorities = { package = "substrate-consensus-authorities", path = "../../core/consensus/authorities", default-features = false } [features] default = ["std"] +core = [ + "contract/core", +] std = [ "parity-codec/std", "substrate-primitives/std", @@ -70,7 +72,6 @@ std = [ "client/std", "consensus_aura/std", "rustc-hex", - "hex-literal", "substrate-keyring", "offchain-primitives/std", "consensus_authorities/std", diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 32ba893c669f83b244cedd9a9a1cd447ff1d182b..e2bd33691656503934efb5905cc8092c85f63461 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -34,8 +34,7 @@ use client::{ use runtime_primitives::{ApplyResult, generic, create_runtime_str}; use runtime_primitives::transaction_validity::TransactionValidity; use runtime_primitives::traits::{ - BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, CurrencyToVoteHandler, - AuthorityIdFor, + BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, AuthorityIdFor, Convert, }; use version::RuntimeVersion; use council::{motions as council_motions, voting as council_voting}; @@ -59,8 +58,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 58, - impl_version: 59, + spec_version: 81, + impl_version: 82, apis: RUNTIME_API_VERSIONS, }; @@ -73,6 +72,20 @@ pub fn native_version() -> NativeVersion { } } +pub struct CurrencyToVoteHandler; + +impl CurrencyToVoteHandler { + fn factor() -> u128 { (Balances::total_issuance() / u64::max_value() as u128).max(1) } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> u64 { (x / Self::factor()) as u64 } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> u128 { x * Self::factor() } +} + impl system::Trait for Runtime { type Origin = Origin; type Index = Index; @@ -236,7 +249,7 @@ pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; /// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive, Balances, AllModules>; +pub type Executive = executive::Executive, Balances, Runtime, AllModules>; impl_runtime_apis! { impl client_api::Core for Runtime { diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 792c68b39ea45808b834099c648484a9ed09ae87..846857caa26a517f360c9d17bfaa9a3036670f5a 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -78,8 +78,18 @@ name = "asn1_der_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atty" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -109,11 +119,6 @@ dependencies = [ "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base-x" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "base58" version = "0.1.0" @@ -199,6 +204,11 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bumpalo" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byte-tools" version = "0.2.0" @@ -228,6 +238,11 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "c_linked_list" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cc" version = "1.0.30" @@ -435,6 +450,17 @@ name = "data-encoding" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "derive_more" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "digest" version = "0.6.2" @@ -451,11 +477,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -490,17 +511,29 @@ dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "env_logger" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "environmental" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "error-chain" -version = "0.12.0" +name = "erased-serde" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -518,8 +551,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -592,6 +625,11 @@ dependencies = [ "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "generic-array" version = "0.8.3" @@ -609,6 +647,26 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "get_if_addrs" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "get_if_addrs-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hash-db" version = "0.12.2" @@ -708,6 +766,14 @@ name = "httparse" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "humantime" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "idna" version = "0.1.5" @@ -723,7 +789,7 @@ name = "impl-codec" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -754,6 +820,14 @@ name = "itoa" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "js-sys" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "keccak" version = "0.1.0" @@ -794,41 +868,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -839,9 +914,10 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -849,43 +925,41 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -893,7 +967,7 @@ dependencies = [ "cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -904,28 +978,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -935,11 +1009,9 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -947,41 +1019,41 @@ dependencies = [ "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -991,14 +1063,16 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1009,41 +1083,42 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1051,7 +1126,7 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1060,29 +1135,34 @@ dependencies = [ "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1090,26 +1170,39 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1259,60 +1352,58 @@ dependencies = [ [[package]] name = "node-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "node-primitives 1.0.0", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "node-primitives 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-aura 1.0.0", - "srml-balances 1.0.0", - "srml-consensus 1.0.0", - "srml-contract 1.0.0", - "srml-council 1.0.0", - "srml-democracy 1.0.0", - "srml-executive 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-grandpa 1.0.0", - "srml-indices 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-sudo 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "srml-treasury 1.0.0", - "substrate-client 1.0.0", - "substrate-consensus-aura-primitives 1.0.0", - "substrate-consensus-authorities 1.0.0", - "substrate-keyring 1.0.0", - "substrate-offchain-primitives 0.1.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-aura 2.0.0", + "srml-balances 2.0.0", + "srml-consensus 2.0.0", + "srml-contract 2.0.0", + "srml-council 2.0.0", + "srml-democracy 2.0.0", + "srml-executive 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-grandpa 2.0.0", + "srml-indices 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-sudo 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "srml-treasury 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-authorities 2.0.0", + "substrate-keyring 2.0.0", + "substrate-offchain-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "node-runtime-wasm" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "node-runtime 1.0.0", + "node-runtime 2.0.0", ] [[package]] @@ -1325,6 +1416,15 @@ name = "nohash-hasher" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "nom" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-integer" version = "0.1.39" @@ -1346,6 +1446,11 @@ dependencies = [ "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "numtoa" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "once_cell" version = "0.1.8" @@ -1407,7 +1512,7 @@ source = "git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7 [[package]] name = "parity-codec" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1422,18 +1527,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1539,8 +1645,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1596,8 +1702,8 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1640,7 +1746,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quote" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1809,6 +1915,14 @@ name = "redox_syscall" version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "redox_termios" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "regex" version = "1.1.2" @@ -1922,16 +2036,6 @@ name = "scopeguard" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "secp256k1" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "semver" version = "0.9.0" @@ -1945,10 +2049,18 @@ name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "send_wrapper" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "serde_derive" @@ -1956,8 +2068,8 @@ version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2019,6 +2131,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "slog" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "slog-async" @@ -2036,6 +2151,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2073,6 +2189,11 @@ dependencies = [ "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sourcefile" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "spin" version = "0.5.0" @@ -2080,390 +2201,368 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-api-macros" -version = "1.0.0" +version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-io" -version = "1.0.0" +version = "2.0.0" dependencies = [ "environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "sr-sandbox" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-std" -version = "1.0.0" +version = "2.0.0" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sr-version" -version = "1.0.0" +version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-session 1.0.0", - "srml-staking 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-inherents 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-session 2.0.0", + "srml-staking 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-contract" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-sandbox 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-sandbox 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", + "substrate-primitives 2.0.0", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-council" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-democracy 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-democracy 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-democracy" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-finality-tracker" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-grandpa" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-finality-tracker 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-finality-grandpa-primitives 1.0.0", - "substrate-primitives 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-finality-tracker 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-finality-grandpa-primitives 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", - "substrate-primitives 1.0.0", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-session" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "srml-timestamp 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "srml-timestamp 2.0.0", ] [[package]] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-consensus 1.0.0", - "srml-session 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-keyring 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-consensus 2.0.0", + "srml-session 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-keyring 2.0.0", ] [[package]] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-support-procedural 1.0.0", - "srml-system 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-support-procedural 2.0.0", + "srml-system 2.0.0", ] [[package]] name = "srml-support" -version = "1.0.0" +version = "2.0.0" dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-metadata 1.0.0", - "srml-support-procedural 1.0.0", - "substrate-inherents 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-metadata 2.0.0", + "srml-support-procedural 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "srml-support-procedural-tools 1.0.0", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-api-macros 2.0.0", + "srml-support-procedural-tools 2.0.0", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "srml-support-procedural-tools-derive 1.0.0", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-support-procedural-tools-derive 2.0.0", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-system" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "substrate-primitives 1.0.0", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", - "substrate-inherents 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", + "substrate-inherents 2.0.0", ] [[package]] name = "srml-treasury" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "srml-balances 1.0.0", - "srml-support 1.0.0", - "srml-system 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "srml-balances 2.0.0", + "srml-support 2.0.0", + "srml-system 2.0.0", ] [[package]] @@ -2481,50 +2580,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2545,8 +2600,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2562,138 +2617,136 @@ dependencies = [ [[package]] name = "substrate-client" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api-macros 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "substrate-consensus-common 1.0.0", - "substrate-executor 1.0.0", - "substrate-inherents 1.0.0", - "substrate-keyring 1.0.0", - "substrate-primitives 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-telemetry 1.0.0", - "substrate-trie 1.0.0", + "sr-api-macros 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-executor 2.0.0", + "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", + "substrate-primitives 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-telemetry 2.0.0", + "substrate-trie 2.0.0", ] [[package]] name = "substrate-consensus-aura-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-consensus-authorities" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "sr-version 1.0.0", - "srml-support 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "srml-support 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-consensus-common" -version = "1.0.0" +version = "2.0.0" dependencies = [ "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-version 1.0.0", - "substrate-inherents 1.0.0", - "substrate-primitives 1.0.0", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "sr-version 2.0.0", + "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-executor" -version = "1.0.0" +version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 1.0.0", - "sr-version 1.0.0", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-serializer 1.0.0", - "substrate-state-machine 1.0.0", - "substrate-trie 1.0.0", + "sr-io 2.0.0", + "sr-version 2.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-serializer 2.0.0", + "substrate-state-machine 2.0.0", + "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-finality-grandpa-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", - "substrate-client 1.0.0", - "substrate-primitives 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "sr-std 2.0.0", + "substrate-client 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-inherents" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 1.0.0", - "sr-std 1.0.0", + "sr-primitives 2.0.0", + "sr-std 2.0.0", ] [[package]] name = "substrate-keyring" -version = "1.0.0" +version = "2.0.0" dependencies = [ - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", "strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 1.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-offchain-primitives" -version = "0.1.0" +version = "2.0.0" dependencies = [ - "sr-primitives 1.0.0", - "substrate-client 1.0.0", + "sr-primitives 2.0.0", + "substrate-client 2.0.0", ] [[package]] name = "substrate-panic-handler" -version = "1.0.0" +version = "2.0.0" dependencies = [ "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2701,37 +2754,34 @@ dependencies = [ [[package]] name = "substrate-primitives" -version = "1.0.0" +version = "2.0.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "sr-std 2.0.0", "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" -version = "1.0.0" +version = "2.0.0" dependencies = [ "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2739,31 +2789,29 @@ dependencies = [ [[package]] name = "substrate-state-machine" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-panic-handler 1.0.0", - "substrate-primitives 1.0.0", - "substrate-trie 1.0.0", + "substrate-panic-handler 2.0.0", + "substrate-primitives 2.0.0", + "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-telemetry" -version = "1.0.0" +version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2773,12 +2821,13 @@ dependencies = [ [[package]] name = "substrate-trie" -version = "1.0.0" +version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-std 1.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0", + "substrate-primitives 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2795,11 +2844,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.29" +version = "0.15.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2809,8 +2858,8 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2819,6 +2868,25 @@ name = "take_mut" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "termcolor" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "termion" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "thread_local" version = "0.3.6" @@ -2839,7 +2907,7 @@ dependencies = [ [[package]] name = "tiny-bip39" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3090,7 +3158,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3177,11 +3245,101 @@ name = "vcpkg" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wasm-bindgen" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "wasm-bindgen-webidl" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasmi" version = "0.4.3" @@ -3192,6 +3350,36 @@ dependencies = [ "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "wasmi-validation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "web-sys" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "weedle" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi" version = "0.2.8" @@ -3216,11 +3404,28 @@ name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wincolor" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws" version = "0.7.9" @@ -3260,7 +3465,7 @@ dependencies = [ [[package]] name = "yamux" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3289,10 +3494,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" +"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" "checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" @@ -3304,11 +3509,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" +"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +"checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" @@ -3333,15 +3540,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" "checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" +"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" "checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" +"checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" +"checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" @@ -3354,8 +3562,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" +"checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" +"checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" "checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" @@ -3369,35 +3580,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" +"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" +"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5b9cd37b1ca54fa2fd0bbf0486adf2f55f8994f2be9410b65265050b24709b2" -"checksum libp2p-core 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf9c56e6f04cb649fdeb806e963d2da223e3ed17748d9e924fdb836c09f76307" -"checksum libp2p-core-derive 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "debea88a3d5de9fdaf7082bd6d238f2c4c6a0420f14bdf9e1c1083b3e7c69286" -"checksum libp2p-dns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350d0018af3668d954f61ce7311e7d64ab7c40f19a8eb895e4750efe24c3455f" -"checksum libp2p-floodsub 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfbcf36cc58ad5d0252d8ebe9c1a87190693fe2cdbe40fb01d8046779f9a75ad" -"checksum libp2p-identify 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82e98435973e958d7dea3f5074d7fca53d0dfce2e1ac6924119a21c2991fe443" -"checksum libp2p-kad 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92bb0153418eaf0ea549008d1e22748a956c9c36af9374fbe7189d44607c14be" -"checksum libp2p-mdns 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc915d0cde68a05d26a0dcb125eddce7dd2a425e97c5172ac300c1ee8716f55a" -"checksum libp2p-mplex 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "355bb370dd12809792dc020638b280e7aaf8625318018abd311c51affd0a612d" -"checksum libp2p-noise 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e86291401f4a83f9fa81c03f8a7ccf0b03ce6aaa40cba058a7ec1026a65a6fe4" -"checksum libp2p-ping 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3277f1f7eaadf5cdde6a76fb4afbf24e0eda6e2b04f288f526c6fa2e4293a6e" -"checksum libp2p-plaintext 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4842a7ab54c12459b58b9e59cbeb03e3e1fd393fef48079472856f934352772" -"checksum libp2p-ratelimit 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32ba52ee76aaa94af533526ce5a22fbfcc69a560174fccee82f4cdb557411d33" -"checksum libp2p-secio 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00f416e1e3d0214bd7df2be2b6be8ef61771d44292b973c9e02bfbbd7f62fe46" -"checksum libp2p-tcp 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "af47af9997d69fc70aa13e6e7cd0d766614ebe74005e69e763221a64d9a0a5ef" -"checksum libp2p-uds 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa72d81501aad6998d3b1b964f68f438ef99c3aaf54d921e144e0477fa87568" -"checksum libp2p-yamux 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbb8d08cb536a964727e77b868a026c6d92993f08e387d49163565575a478d9" +"checksum libp2p 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141ab3f96adc87c8cb847b1cf790e0fbce0b03e3dabfdd3b72fe23d36fc005de" +"checksum libp2p-core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1514593f2aced40b257565cf2edc63b4cc2f06241a2f3e5a4fe275e0c4d55e85" +"checksum libp2p-core-derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f6f5543deedf4d89931a74d3897b63be19a62d5cb675efaa4c669a4aa0ab12" +"checksum libp2p-dns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9db88ba58601f4528ef5e5e5414e142b19d5813bdaa685e683ef5a44ed23606b" +"checksum libp2p-floodsub 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "260689f26ab2161a1fde9617c53699f78e4ab25fd77c4b07a25b97fca74c5c6d" +"checksum libp2p-identify 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1281e58168ed62cf2e9bfe127908a0ec277cf48cbb3dec5b1a68b58ea6332171" +"checksum libp2p-kad 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd8ab542edc493fa7a9f9b7f93dc4ee0b384e1f9e2a3397ce0056ffe30a0ea21" +"checksum libp2p-mdns 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f009594f78d952c57f452be237650025acd4ef17c5cc8eda4c6466ba196e5688" +"checksum libp2p-mplex 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ccfb9869daccfb9d3938eda8821146e85105a8c874f14393cdb57543afeceb38" +"checksum libp2p-noise 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d3dce2ec4fcb3a2cc748c02d61f7e76486df9c7b09e8ccb4d9f81befce207de" +"checksum libp2p-ping 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3b3bb3328d206ad3061e863f179a211fc978d7bce05f90440ed6b8a6a9d17ced" +"checksum libp2p-plaintext 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b23a8ece138f448572c5ff781d62323a954f1f681c303e6553368026764b0ae" +"checksum libp2p-ratelimit 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "55918f058f118d72d83f9a976f12e02e54c8616ddfc795c779c4801a5042a44f" +"checksum libp2p-secio 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9bff57806e0f71832cc02b5dea1010e5f1a9d16393fd104a4b64e4aaae40d885" +"checksum libp2p-tcp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3629f9a667d9f5acb5876df59cf3b547250e340131c47587f9ace7c517f21327" +"checksum libp2p-uds 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d65c15f89c0607d4a334664d759e54e847e1856a73ea78e7bb6a75e6f4039010" +"checksum libp2p-wasm-ext 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dff6c81d0f46261a6327219349753aefd3a92021a1e6102185fa112cfcddca97" +"checksum libp2p-yamux 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5369165359bea84e7ebe73f37b6240f31f8d924ce6710be3d8e1fa678985c9b8" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" @@ -3415,9 +3629,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" "checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" @@ -3425,9 +3641,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2edd80cdaf3b9c7b7f524299586bb4eae43cc5eb20c7b41aa0cd741200000e38" +"checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61ae6944d4435d41f4d0f12108c5cbb9207cbb14bc8f2b4984c6e930dc9c8e41" +"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" "checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" @@ -3451,7 +3667,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" @@ -3469,6 +3685,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" "checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" @@ -3481,9 +3698,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" "checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" "checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" "checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" @@ -3498,26 +3715,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" "checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1825685f977249735d510a242a6727b46efe914bb67e38d30c071b1b72b1d5c2" +"checksum syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)" = "ec52cd796e5f01d0067225a5392e70084acc4c0013fa71d55166d38a8b307836" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" +"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1415431cb2398d84da64173f8473c792808314427d4a6f2f3ea85ae67239fe3" +"checksum tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" "checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" @@ -3538,7 +3754,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" +"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" @@ -3551,15 +3767,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" +"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" +"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" +"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" +"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" +"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" +"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" +"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" "checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" +"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "302defd1bed8a9a6d43b82f0e5a50510dfdfbbd02c270c93ff9d6f3f5e2dea89" +"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" diff --git a/node/runtime/wasm/Cargo.toml b/node/runtime/wasm/Cargo.toml index 8fd90890e95526a0f0aff51f788a10f3ab6d6647..e98d4cb918a916577c63a3de5298c0510bdc08c8 100644 --- a/node/runtime/wasm/Cargo.toml +++ b/node/runtime/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime-wasm" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -12,7 +12,10 @@ crate-type = ["cdylib"] node-runtime = { path = "..", default-features = false } [features] -default = [] +default = ["core"] +core = [ + "node-runtime/core", +] std = [ "node-runtime/std", ] diff --git a/node/src/main.rs b/node/src/main.rs index 5ff0d7ff3b0e68fae90eca12154bd1409d866d80..15b603e7a2706abe220785213169ea02273520f6 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -43,9 +43,7 @@ impl cli::IntoExit for Exit { } } -error_chain::quick_main!(run); - -fn run() -> cli::error::Result<()> { +fn main() { let version = VersionInfo { name: "Substrate Node", commit: env!("VERGEN_SHA_SHORT"), @@ -55,5 +53,9 @@ fn run() -> cli::error::Result<()> { description: "Generic substrate node", support_url: "https://github.com/paritytech/substrate/issues/new", }; - cli::run(::std::env::args(), Exit, version) + + if let Err(e) = cli::run(::std::env::args(), Exit, version) { + eprintln!("Error starting the node: {}\n\n{:?}", e, e); + std::process::exit(1) + } } diff --git a/scripts/build.sh b/scripts/build.sh index 9cacf74dbb07a6ca5b135959d3e08b11a3da50a0..46bc74b7a94f6bd2159c8dee3fcd40f72e935eef 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -5,14 +5,14 @@ set -e PROJECT_ROOT=`git rev-parse --show-toplevel` -source `dirname "$0"`/common.sh +source "`dirname \"$0\"`/common.sh" export CARGO_INCREMENTAL=0 # Save current directory. pushd . -cd $ROOT +cd -- "$ROOT" for SRC in "${SRCS[@]}" do diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index 6ad477664441705ed7a6c716eda40fb28263524e..4afa0101fce3c88a9d5a8efd80cc408133b4bfa5 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -1,24 +1,39 @@ FROM debian:stretch-slim -LABEL maintainer "devops-team@parity.io" -LABEL description="Substrate: The platform for blockchain innovators" -RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - libssl1.1 \ - ca-certificates \ - curl && \ - apt-get autoremove -y && \ - apt-get clean && \ - find /var/lib/apt/lists/ -type f -not -name lock -delete +# metadata +ARG VCS_REF +ARG BUILD_DATE -COPY ./substrate /usr/local/bin +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="parity/substrate" \ + io.parity.image.description="Substrate: The platform for blockchain innovators." \ + io.parity.image.source="https://github.com/paritytech/substrate/blob/master/scripts/docker/Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://wiki.parity.io/Parity-Substrate" +# show backtraces +ENV RUST_BACKTRACE 1 -RUN useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate -USER substrate +# install tools and dependencies +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + libssl1.1 \ + ca-certificates \ + curl && \ +# apt cleanup + apt-get autoremove -y && \ + apt-get clean && \ + find /var/lib/apt/lists/ -type f -not -name lock -delete; \ +# add user + useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate + +# add substrate binary to docker image +COPY ./substrate /usr/local/bin -ENV RUST_BACKTRACE 1 +USER substrate # check if executable works in this container RUN /usr/local/bin/substrate --version diff --git a/scripts/flamingfir-deploy.sh b/scripts/flamingfir-deploy.sh new file mode 100755 index 0000000000000000000000000000000000000000..ffd3cab9d8eef9101d3c8f3cac84739dea14c7bf --- /dev/null +++ b/scripts/flamingfir-deploy.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +RETRY_COUNT=10 +RETRY_ATTEMPT=0 +SLEEP_TIME=15 +TARGET_HOST="$1" +COMMIT=$(cat artifacts/VERSION) +DOWNLOAD_URL="https://releases.parity.io/substrate/x86_64-debian:stretch/${COMMIT}/substrate" +POST_DATA='{"extra_vars":{"artifact_path":"'${DOWNLOAD_URL}'","target_host":"'${TARGET_HOST}'"}}' + +JOB_ID=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" --header "Content-type: application/json" --post-data "${POST_DATA}" https://ansible-awx.parity.io/api/v2/job_templates/32/launch/ | jq .job) + +echo "Launched job: $JOB_ID" + + +while [ ${RETRY_ATTEMPT} -le ${RETRY_COUNT} ] ; do + export RETRY_RESULT=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/ | jq .status) + RETRY_ATTEMPT=$(( $RETRY_ATTEMPT +1 )) + sleep $SLEEP_TIME + if [ $(echo $RETRY_RESULT | egrep -e successful -e failed) ] ; then + break + fi +done + +AWX_OUTPUT=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/stdout?format=txt_download) + +echo "AWX job log:" +echo "${AWX_OUTPUT}" + + +JOB_STATUS=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/ | jq .status ) + +echo "===================================" +echo -e "Ansible AWX Remote Job: ${JOB_ID} \x1B[31mStatus: ${JOB_STATUS}\x1B[0m" +echo "===================================" diff --git a/scripts/gitlab/check_line_width.sh b/scripts/gitlab/check_line_width.sh new file mode 100755 index 0000000000000000000000000000000000000000..f382d630b183c6396115cc1e76e77dfab4c20047 --- /dev/null +++ b/scripts/gitlab/check_line_width.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# +# check if line width of rust source files is not beyond x characters +# + + +BASE_BRANCH="origin/master" +LINE_WIDTH="121" +GOOD_LINE_WIDTH="101" + + +git diff --name-only ${BASE_BRANCH}...${CI_COMMIT_SHA} \*.rs | ( while read file +do + if [ ! -f ${file} ]; + then + echo "Skipping removed file." + elif git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${LINE_WIDTH}\}" + then + if [ -z "${FAIL}" ] + then + echo "| warning!" + echo "| Lines should not be longer than 120 characters." + echo "| " + echo "| see more https://wiki.parity.io/Substrate-Style-Guide" + echo "|" + FAIL="true" + fi + echo "| file: ${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}\}" + then + if [ -z "${FAIL}" ] + then + echo "| warning!" + echo "| Lines should be longer than 100 characters only in exceptional circumstances!" + echo "| " + echo "| see more https://wiki.parity.io/Substrate-Style-Guide" + echo "|" + fi + echo "| file: ${file}" + git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ + | grep -n "^+.\{${LINE_WIDTH}\}" + echo "|" + fi + fi +done + +test -z "${FAIL}" +) diff --git a/scripts/node-template-release/Cargo.toml b/scripts/node-template-release/Cargo.toml index 2dfc0b5255348242b8727971cc2768ae88fa2094..34aadc971f1aaa78b2f53860e668d294cee52eb0 100644 --- a/scripts/node-template-release/Cargo.toml +++ b/scripts/node-template-release/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-release" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/scripts/node-template-release/src/main.rs b/scripts/node-template-release/src/main.rs index 871cc078ed0c70fd73be54e953064bff328f7e4d..470d34ef0d8837f335e5842e8168b49a1511ab51 100644 --- a/scripts/node-template-release/src/main.rs +++ b/scripts/node-template-release/src/main.rs @@ -137,7 +137,7 @@ fn write_cargo_toml(path: &Path, cargo_toml: CargoToml) { /// Build and test the generated node-template fn build_and_test(path: &Path, cargo_tomls: &[PathBuf]) { // Build wasm - assert!(Command::new(path.join("build.sh")).current_dir(path).status().expect("Compiles wasm").success()); + assert!(Command::new(path.join("./scripts/build.sh")).current_dir(path).status().expect("Compiles wasm").success()); // Build node assert!(Command::new("cargo").args(&["build", "--all"]).current_dir(path).status().expect("Compiles node").success()); diff --git a/srml/assets/Cargo.toml b/srml/assets/Cargo.toml index 066dd42ffdfc9cfc4309b3e7fef987754a1e5d99..88a443db94cdb80c3b48e8f1407193b3e16ad8d2 100644 --- a/srml/assets/Cargo.toml +++ b/srml/assets/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-assets" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false } # Needed for various traits. In our case, `OnFinalize`. diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 9caa3dc20d5426ba22f527ab37bc4851a955a084..3f7c1b3efc15310aefb1a53a60d49b532846337f 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -14,7 +14,108 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +//! # Assets Module +//! //! A simple, secure module for dealing with fungible assets. +//! +//! ## Overview +//! +//! The Assets module provides functionality for asset management of fungible asset classes +//! with a fixed supply, including: +//! +//! * Asset Issuance +//! * Asset Transfer +//! * Asset Destruction +//! +//! To use it in your runtime, you need to implement the assets [`Trait`](./trait.Trait.html). +//! +//! The supported dispatchable functions are documented in the [`Call`](./enum.Call.html) enum. +//! +//! ### Terminology +//! +//! * **Asset issuance:** The creation of a new asset, whose total supply will belong to the account that issues the asset. +//! * **Asset transfer:** The action of transferring assets from one account to another. +//! * **Asset destruction:** The process of an account removing its entire holding of an asset. +//! * **Fungible asset:** An asset whose units are interchangeable. +//! * **Non-fungible asset:** An asset for which each unit has unique characteristics. +//! +//! ### Goals +//! +//! The assets system in Substrate is designed to make the following possible: +//! +//! * Issue a unique asset to its creator's account. +//! * Move assets between accounts. +//! * Remove an account's balance of an asset when requested by that account's owner and update the asset's total supply. +//! +//! ## Interface +//! +//! ### Dispatchable Functions +//! +//! * `issue` - Issues the total supply of a new fungible asset to the account of the caller of the function. +//! * `transfer` - Transfers an `amount` of units of fungible asset `id` from the balance of +//! the function caller's account (`origin`) to a `target` account. +//! * `destroy` - Destroys the entire holding of a fungible asset `id` associated with the account +//! that called the function. +//! +//! Please refer to the [`Call`](./enum.Call.html) enum and its associated variants for documentation on each function. +//! +//! ### Public Functions +//! +//! +//! * `balance` - Get the asset `id` balance of `who`. +//! * `total_supply` - Get the total supply of an asset `id`. +//! +//! Please refer to the [`Module`](./struct.Module.html) struct for details on publicly available functions. +//! +//! ## Usage +//! +//! The following example shows how to use the Assets module in your runtime by exposing public functions to: +//! +//! * Issue a new fungible asset for a token distribution event (airdrop). +//! * Query the fungible asset holding balance of an account. +//! * Query the total supply of a fungible asset that has been issued. +//! +//! ### Prerequisites +//! +//! Import the Assets module and types and derive your runtime's configuration traits from the Assets module trait. +//! +//! ### Simple Code Snippet +//! +//! ```rust,ignore +//! use support::{decl_module, dispatch::Result}; +//! use system::ensure_signed; +//! +//! pub trait Trait: assets::Trait { } +//! +//! decl_module! { +//! pub struct Module for enum Call where origin: T::Origin { +//! pub fn issue_token_airdrop(origin) -> Result { +//! const ACCOUNT_ALICE: u64 = 1; +//! const ACCOUNT_BOB: u64 = 2; +//! const COUNT_AIRDROP_RECIPIENTS = 2; +//! const TOKENS_FIXED_SUPPLY: u64 = 100; +//! +//! ensure!(!COUNT_AIRDROP_RECIPIENTS.is_zero(), "Divide by zero error."); +//! +//! let sender = ensure_signed(origin)?; +//! let asset_id = Self::next_asset_id(); +//! +//! >::mutate(|asset_id| *asset_id += 1); +//! >::insert((asset_id, &ACCOUNT_ALICE), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS); +//! >::insert((asset_id, &ACCOUNT_BOB), TOKENS_FIXED_SUPPLY / COUNT_AIRDROP_RECIPIENTS); +//! >::insert(asset_id, TOKENS_FIXED_SUPPLY); +//! +//! Self::deposit_event(RawEvent::Issued(asset_id, sender, TOKENS_FIXED_SUPPLY)); +//! Ok(()) +//! } +//! } +//! } +//! ``` +//! +//! ## Related Modules +//! +//! * [`System`](../srml_system/index.html) +//! * [`Support`](../srml_support/index.html) // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] @@ -23,6 +124,7 @@ use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, use primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; use system::ensure_signed; +/// The module configuration trait. pub trait Trait: system::Trait { /// The overarching event type. type Event: From> + Into<::Event>; @@ -34,7 +136,6 @@ pub trait Trait: system::Trait { type AssetId = u32; decl_module! { - // Simple declaration of the `Module` type. Lets the macro know what its working on. pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; /// Issue a new class of fungible assets. There are, and will only ever be, `total` @@ -99,7 +200,7 @@ decl_storage! { Balances: map (AssetId, T::AccountId) => T::Balance; /// The next asset identifier up for grabs. NextAssetId get(next_asset_id): AssetId; - /// The total unit supply of an asset + /// The total unit supply of an asset. TotalSupply: map AssetId => T::Balance; } } @@ -113,7 +214,7 @@ impl Module { >::get((id, who)) } - // Get the total supply of an asset `id` + /// Get the total supply of an asset `id`. pub fn total_supply(id: AssetId) -> T::Balance { >::get(id) } diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index b22fea8ffdcd3b7d716fa31fb80267e7584620bf..6a437ce71acaedc41173fa4eafdc7ef94cea2c2f 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-aura" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" parity-codec = { version = "3.3", default-features = false, features = ["derive"] } serde = { version = "1.0", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index 344ea64869656aa79da8e696da59fef704954760..646ad972d0c48b793fab39bd20922d0bfd764399 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -14,7 +14,37 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Consensus extension module for Aura consensus. This manages offline reporting. +//! # Aura Module +//! +//! - [`aura::Trait`](./trait.Trait.html) +//! - [`Module`](./struct.Module.html) +//! +//! ## Overview +//! +//! The Aura module extends Aura consensus by managing offline reporting. +//! +//! ## Interface +//! +//! ### Public Functions +//! +//! - `slot_duration` - Determine the Aura slot-duration based on the Timestamp module configuration. +//! +//! ## Related Modules +//! +//! - [Staking](../srml_staking/index.html): The Staking module is called in Aura to enforce slashing +//! if validators miss a certain number of slots (see the [`StakingSlasher`](./struct.StakingSlasher.html) +//! struct and associated method). +//! - [Timestamp](../srml_timestamp/index.html): The Timestamp module is used in Aura to track +//! consensus rounds (via `slots`). +//! - [Consensus](../srml_consensus/index.html): The Consensus module does not relate directly to Aura, +//! but serves to manage offline reporting by implementing `ProvideInherent` in a similar way. +//! +//! ## References +//! +//! If you're interested in hacking on this module, it is useful to understand the interaction with +//! `substrate/core/inherents/src/lib.rs` and, specifically, the required implementation of +//! [`ProvideInherent`](../substrate_inherents/trait.ProvideInherent.html) and +//! [`ProvideInherentData`](../substrate_inherents/trait.ProvideInherentData.html) to create and check inherents. #![cfg_attr(not(feature = "std"), no_std)] @@ -23,7 +53,7 @@ pub use timestamp; use rstd::{result, prelude::*}; use srml_support::storage::StorageValue; use srml_support::{decl_storage, decl_module}; -use primitives::traits::{As, Zero}; +use primitives::traits::{SaturatedConversion, Saturating, Zero, One}; use timestamp::OnTimestampSet; #[cfg(feature = "std")] use timestamp::TimestampInherentData; @@ -35,13 +65,13 @@ use inherents::{InherentDataProviders, ProvideInherentData}; mod mock; mod tests; -/// The aura inherent identifier. +/// The Aura inherent identifier. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"auraslot"; -/// The type of the aura inherent. +/// The type of the Aura inherent. pub type InherentType = u64; -/// Auxiliary trait to extract aura inherent data. +/// Auxiliary trait to extract Aura inherent data. pub trait AuraInherentData { /// Get aura inherent data. fn aura_inherent_data(&self) -> result::Result; @@ -107,7 +137,7 @@ impl ProvideInherentData for InherentDataProvider { } } -/// Something which can handle Aura consensus reports. +/// Something that can handle Aura consensus reports. pub trait HandleReport { fn handle_report(report: AuraReport); } @@ -123,8 +153,8 @@ pub trait Trait: timestamp::Trait { decl_storage! { trait Store for Module as Aura { - // The last timestamp. - LastTimestamp get(last) build(|_| T::Moment::sa(0)): T::Moment; + /// The last timestamp. + LastTimestamp get(last) build(|_| 0.into()): T::Moment; } } @@ -132,7 +162,7 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { } } -/// A report of skipped authorities in aura. +/// A report of skipped authorities in Aura. #[derive(Clone, Encode, Decode, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] pub struct AuraReport { @@ -143,14 +173,14 @@ pub struct AuraReport { } impl AuraReport { - /// Call the closure with (validator_indices, punishment_count) for each + /// Call the closure with (`validator_indices`, `punishment_count`) for each /// validator to punish. pub fn punish(&self, validator_count: usize, mut punish_with: F) where F: FnMut(usize, usize) { - // If all validators have been skipped, then it implies some sort of + // If all validators have been skipped, then it implies some sort of // systematic problem common to all rather than a minority of validators - // unfulfilling their specific duties. In this case, it doesn't make + // not fulfilling their specific duties. In this case, it doesn't make // sense to punish anyone, so we guard against it. if self.skipped < validator_count { for index in 0..self.skipped { @@ -161,48 +191,46 @@ impl AuraReport { } impl Module { - /// Determine the Aura slot-duration based on the timestamp module configuration. - pub fn slot_duration() -> u64 { + /// Determine the Aura slot-duration based on the Timestamp module configuration. + pub fn slot_duration() -> T::Moment { // we double the minimum block-period so each author can always propose within - // the majority of their slot. - >::minimum_period().as_().saturating_mul(2) + // the majority of its slot. + >::minimum_period().saturating_mul(2.into()) } fn on_timestamp_set(now: T::Moment, slot_duration: T::Moment) { let last = Self::last(); ::LastTimestamp::put(now.clone()); - if last == T::Moment::zero() { + if last.is_zero() { return; } - assert!(slot_duration > T::Moment::zero(), "Aura slot duration cannot be zero."); + assert!(!slot_duration.is_zero(), "Aura slot duration cannot be zero."); let last_slot = last / slot_duration.clone(); - let first_skipped = last_slot.clone() + T::Moment::sa(1); + let first_skipped = last_slot.clone() + One::one(); let cur_slot = now / slot_duration; assert!(last_slot < cur_slot, "Only one block may be authored per slot."); if cur_slot == first_skipped { return } - let slot_to_usize = |slot: T::Moment| { slot.as_() as usize }; - - let skipped_slots = cur_slot - last_slot - T::Moment::sa(1); + let skipped_slots = cur_slot - last_slot - One::one(); H::handle_report(AuraReport { - start_slot: slot_to_usize(first_skipped), - skipped: slot_to_usize(skipped_slots), + start_slot: first_skipped.saturated_into::(), + skipped: skipped_slots.saturated_into::(), }) } } impl OnTimestampSet for Module { fn on_timestamp_set(moment: T::Moment) { - Self::on_timestamp_set::(moment, T::Moment::sa(Self::slot_duration())) + Self::on_timestamp_set::(moment, Self::slot_duration()) } } -/// A type for performing slashing based on aura reports. +/// A type for performing slashing based on Aura reports. pub struct StakingSlasher(::rstd::marker::PhantomData); impl HandleReport for StakingSlasher { @@ -228,15 +256,16 @@ impl ProvideInherent for Module { None } + /// Verify the validity of the inherent using the timestamp. fn check_inherent(call: &Self::Call, data: &InherentData) -> result::Result<(), Self::Error> { let timestamp = match call { timestamp::Call::set(ref timestamp) => timestamp.clone(), _ => return Ok(()), }; - let timestamp_based_slot = timestamp.as_() / Self::slot_duration(); + let timestamp_based_slot = timestamp / Self::slot_duration(); - let seal_slot = data.aura_inherent_data()?; + let seal_slot = data.aura_inherent_data()?.saturated_into(); if timestamp_based_slot == seal_slot { Ok(()) diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..0c25a98948baf801b2457e4e6f68f4e1dac77390 --- /dev/null +++ b/srml/babe/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "srml-babe" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +hex-literal = "0.1.4" +parity-codec = { version = "3.5.1", default-features = false, features = ["derive"] } +serde = { version = "1.0.90", optional = true } +inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } +rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } +primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +srml-support = { path = "../support", default-features = false } +system = { package = "srml-system", path = "../system", default-features = false } +timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } +staking = { package = "srml-staking", path = "../staking", default-features = false } +session = { package = "srml-session", path = "../session", default-features = false } +babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } + +[dev-dependencies] +lazy_static = "1.3.0" +parking_lot = "0.7.1" +substrate-primitives = { path = "../../core/primitives" } +runtime_io = { package = "sr-io", path = "../../core/sr-io" } +consensus = { package = "srml-consensus", path = "../consensus" } + +[features] +default = ["std"] +std = [ + "serde", + "parity-codec/std", + "rstd/std", + "srml-support/std", + "primitives/std", + "system/std", + "timestamp/std", + "staking/std", + "inherents/std", + "babe-primitives/std", +] diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..3e36481151696f58e6dc87c7233f1b5a5730dfb7 --- /dev/null +++ b/srml/babe/src/lib.rs @@ -0,0 +1,153 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Consensus extension module for BABE consensus. + +#![cfg_attr(not(feature = "std"), no_std)] +#![forbid(unsafe_code, warnings)] +pub use timestamp; + +use rstd::{result, prelude::*}; +use srml_support::{decl_storage, decl_module}; +use timestamp::{OnTimestampSet, Trait}; +use primitives::traits::{SaturatedConversion, Saturating}; +#[cfg(feature = "std")] +use timestamp::TimestampInherentData; +use parity_codec::Decode; +use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; +#[cfg(feature = "std")] +use inherents::{InherentDataProviders, ProvideInherentData}; + +/// The BABE inherent identifier. +pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; + +/// The type of the BABE inherent. +pub type InherentType = u64; + +/// Auxiliary trait to extract BABE inherent data. +pub trait BabeInherentData { + /// Get BABE inherent data. + fn babe_inherent_data(&self) -> result::Result; + /// Replace BABE inherent data. + fn babe_replace_inherent_data(&mut self, new: InherentType); +} + +impl BabeInherentData for InherentData { + fn babe_inherent_data(&self) -> result::Result { + self.get_data(&INHERENT_IDENTIFIER) + .and_then(|r| r.ok_or_else(|| "BABE inherent data not found".into())) + } + + fn babe_replace_inherent_data(&mut self, new: InherentType) { + self.replace_data(INHERENT_IDENTIFIER, &new); + } +} + +/// Provides the slot duration inherent data for BABE. +#[cfg(feature = "std")] +pub struct InherentDataProvider { + slot_duration: u64, +} + +#[cfg(feature = "std")] +impl InherentDataProvider { + pub fn new(slot_duration: u64) -> Self { + Self { + slot_duration + } + } +} + +#[cfg(feature = "std")] +impl ProvideInherentData for InherentDataProvider { + fn on_register( + &self, + providers: &InherentDataProviders, + ) -> result::Result<(), RuntimeString> { + if !providers.has_provider(×tamp::INHERENT_IDENTIFIER) { + // Add the timestamp inherent data provider, as we require it. + providers.register_provider(timestamp::InherentDataProvider) + } else { + Ok(()) + } + } + + fn inherent_identifier(&self) -> &'static inherents::InherentIdentifier { + &INHERENT_IDENTIFIER + } + + fn provide_inherent_data( + &self, + inherent_data: &mut InherentData, + ) -> result::Result<(), RuntimeString> { + let timestamp = inherent_data.timestamp_inherent_data()?; + let slot_num = timestamp / self.slot_duration; + inherent_data.put_data(INHERENT_IDENTIFIER, &slot_num) + } + + fn error_to_string(&self, error: &[u8]) -> Option { + RuntimeString::decode(&mut &error[..]).map(Into::into) + } +} + +decl_storage! { + trait Store for Module as Babe { + // The last timestamp. + LastTimestamp get(last): T::Moment; + } +} + +decl_module! { + pub struct Module for enum Call where origin: T::Origin { } +} + +impl Module { + /// Determine the BABE slot duration based on the Timestamp module configuration. + pub fn slot_duration() -> T::Moment { + // we double the minimum block-period so each author can always propose within + // the majority of their slot. + >::minimum_period().saturating_mul(2.into()) + } +} + +impl OnTimestampSet for Module { + fn on_timestamp_set(_moment: T::Moment) { } +} + +impl ProvideInherent for Module { + type Call = timestamp::Call; + type Error = MakeFatalError; + const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; + + fn create_inherent(_: &InherentData) -> Option { + None + } + + fn check_inherent(call: &Self::Call, data: &InherentData) -> result::Result<(), Self::Error> { + let timestamp = match call { + timestamp::Call::set(ref timestamp) => timestamp.clone(), + _ => return Ok(()), + }; + + let timestamp_based_slot = (timestamp / Self::slot_duration()).saturated_into::(); + let seal_slot = data.babe_inherent_data()?; + if timestamp_based_slot == seal_slot { + Ok(()) + } else { + Err(RuntimeString::from("timestamp set in block doesn’t match slot in seal").into()) + } + } +} diff --git a/srml/balances/Cargo.toml b/srml/balances/Cargo.toml index 804ee603646f4c98a01c471b2e739f18eb4141a3..6c000294ba12e057c864d2f0f3add72b7a93c565 100644 --- a/srml/balances/Cargo.toml +++ b/srml/balances/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-balances" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 721ff32cc28d024568a0fb07e58417b6a1d83ce2..9fe93a9d4a02c1bddb6c866d30f00edd5a05e63c 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -16,40 +16,42 @@ //! # Balances Module //! -//! The balances module provides functionality for handling accounts and balances. To use the balances module, you need -//! to implement the [balances Trait](https://crates.parity.io/srml_balances/trait.Trait.html). Supported dispatchables -//! are documented in the [`Call` enum](https://crates.parity.io/srml_balances/enum.Call.html). +//! The Balances module provides functionality for handling accounts and balances. +//! +//! - [`balances::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! - [`Module`](./struct.Module.html) //! //! ## Overview //! -//! The balances module provides functions for: +//! The Balances module provides functions for: //! -//! - Getting and setting free balances -//! - Retrieving total, reserved and unreserved balances -//! - Repatriating a reserved balance to a beneficiary account that exists -//! - Transferring a balance between accounts (when not reserved) -//! - Slashing an account balance -//! - Account creation and removal -//! - Lookup of an index to reclaim an account -//! - Managing total issuance -//! - Setting and managing locks +//! - Getting and setting free balances. +//! - Retrieving total, reserved and unreserved balances. +//! - Repatriating a reserved balance to a beneficiary account that exists. +//! - Transferring a balance between accounts (when not reserved). +//! - Slashing an account balance. +//! - Account creation and removal. +//! - Managing total issuance. +//! - Setting and managing locks. //! //! ### Terminology //! //! - **Existential Deposit:** The minimum balance required to create or keep an account open. This prevents //! "dust accounts" from filling storage. -//! - **Total Issuance:** The total amount of units in existence in a system. +//! - **Total Issuance:** The total number of units in existence in a system. //! - **Reaping an account:** The act of removing an account by resetting its nonce. Happens after its balance is set //! to zero. //! - **Free Balance:** The portion of a balance that is not reserved. The free balance is the only balance that matters //! for most operations. When this balance falls below the existential deposit, most functionality of the account is //! removed. When both it and the reserved balance are deleted, then the account is said to be dead. //! - **Reserved Balance:** Reserved balance still belongs to the account holder, but is suspended. Reserved balance -//! can still be slashed, but only after all of free balance has been slashed. If the reserved balance falls below the +//! can still be slashed, but only after all the free balance has been slashed. If the reserved balance falls below the //! existential deposit then it and any related functionality will be deleted. When both it and the free balance are //! deleted, then the account is said to be dead. -//! - **Imbalance:** A condition when some funds were created or deducted without equal and opposite accounting. -//! Functions that result in an imbalance will return an object of the `Imbalance` trait that must be handled. +//! - **Imbalance:** A condition when some funds were credited or debited without equal and opposite accounting +//! (i.e. a difference between total issuance and account balances). Functions that result in an imbalance will +//! return an object of the `Imbalance` trait that must be handled. //! - **Lock:** A freeze on a specified amount of an account's free balance until a specified block number. Multiple //! locks always operate over the same funds, so they "overlay" rather than "stack". //! - **Vesting:** Similar to a lock, this is another, but independent, liquidity restriction that reduces linearly @@ -57,117 +59,88 @@ //! //! ### Implementations //! -//! The balances module provides implementations for the following traits. If these traits provide the functionality -//! that you need, then you can avoid coupling with the balances module. +//! The Balances module provides implementations for the following traits. If these traits provide the functionality +//! that you need, then you can avoid coupling with the Balances module. //! -//! - [`Currency`](https://crates.parity.io/srml_support/traits/trait.Currency.html): Functions for dealing with a +//! - [`Currency`](../srml_support/traits/trait.Currency.html): Functions for dealing with a //! fungible assets system. -//! - [`ReservableCurrency`](https://crates.parity.io/srml_support/traits/trait.ReservableCurrency.html): +//! - [`ReservableCurrency`](../srml_support/traits/trait.ReservableCurrency.html): //! Functions for dealing with assets that can be reserved from an account. -//! - [`LockableCurrency`](https://crates.parity.io/srml_support/traits/trait.LockableCurrency.html): Functions for +//! - [`LockableCurrency`](../srml_support/traits/trait.LockableCurrency.html): Functions for //! dealing with accounts that allow liquidity restrictions. -//! - [`Imbalance`](https://crates.parity.io/srml_support/traits/trait.Imbalance.html): Functions for handling +//! - [`Imbalance`](../srml_support/traits/trait.Imbalance.html): Functions for handling //! imbalances between total issuance in the system and account balances. Must be used when a function //! creates new funds (e.g. a reward) or destroys some funds (e.g. a system fee). -//! - [`MakePayment`](https://crates.parity.io/srml_support/traits/trait.MakePayment.html): Simple trait designed +//! - [`MakePayment`](../srml_support/traits/trait.MakePayment.html): Simple trait designed //! for hooking into a transaction payment. -//! - [`IsDeadAccount`](https://crates.parity.io/srml_system/trait.IsDeadAccount.html): Determiner to say whether a +//! - [`IsDeadAccount`](../srml_system/trait.IsDeadAccount.html): Determiner to say whether a //! given account is unused. //! -//! Example of using the `Currency` trait from the treasury module: -//! -//! ```rust,ignore -//! pub trait Trait: system::Trait { -//! /// The staking balance. -//! type Currency: Currency; -//! } -//! ``` -//! //! ## Interface //! //! ### Dispatchable Functions //! -//! The `Call` enum is documented [here](https://crates.parity.io/srml_balances/enum.Call.html). -//! //! - `transfer` - Transfer some liquid free balance to another account. //! - `set_balance` - Set the balances of a given account. The origin of this call must be root. //! //! ### Public Functions //! -//! See the [module](https://crates.parity.io/srml_balances/struct.Module.html) for details on publicly available -//! functions. +//! - `vesting_balance` - Get the amount that is currently being vested and cannot be transferred out of this account. //! //! ## Usage //! -//! The following examples show how to use the balances module in your custom module. -//! -//! ### Import and Balance Transfer +//! The following examples show how to use the Balances module in your custom module. //! -//! Import the `balances` module and derive your module configuration trait with the balances trait. You can now call -//! functions from the module. +//! ### Examples from the SRML //! -//! ```rust,ignore -//! use support::{decl_module, dispatch::Result}; -//! use system::ensure_signed; +//! The Contract module uses the `Currency` trait to handle gas payment, and its types inherit from `Currency`: //! -//! pub trait Trait: balances::Trait {} +//! ``` +//! use srml_support::traits::Currency; +//! # pub trait Trait: system::Trait { +//! # type Currency: Currency; +//! # } //! -//! decl_module! { -//! pub struct Module for enum Call where origin: T::Origin { -//! fn transfer_proxy(origin, to: T::AccountId, value: T::Balance) -> Result { -//! let sender = ensure_signed(origin)?; -//! >::make_transfer(&sender, &to, value)?; +//! pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +//! pub type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; //! -//! Ok(()) -//! } -//! } -//! } +//! # fn main() {} //! ``` //! -//! ### Real Use Example +//! The Staking module uses the `LockableCurrency` trait to lock a stash account's funds: //! -//! Use in the `contract` module (gas.rs): +//! ``` +//! use srml_support::traits::{WithdrawReasons, LockableCurrency}; +//! use primitives::traits::Bounded; +//! pub trait Trait: system::Trait { +//! type Currency: LockableCurrency; +//! } +//! # struct StakingLedger { +//! # stash: ::AccountId, +//! # total: <::Currency as srml_support::traits::Currency<::AccountId>>::Balance, +//! # phantom: std::marker::PhantomData, +//! # } +//! # const STAKING_ID: [u8; 8] = *b"staking "; //! -//! ```rust,ignore -//! pub fn refund_unused_gas( -//! transactor: &T::AccountId, -//! gas_meter: GasMeter, -//! imbalance: balances::NegativeImbalance, +//! fn update_ledger( +//! controller: &T::AccountId, +//! ledger: &StakingLedger //! ) { -//! let gas_spent = gas_meter.spent(); -//! let gas_left = gas_meter.gas_left(); -//! -//! // Increase total spent gas. -//! >::mutate(|block_gas_spent| *block_gas_spent += gas_spent); -//! -//! let refund = >::as_(gas_left) * gas_meter.gas_price; -//! // Refund gas using balances module -//! let refund_imbalance = >::deposit_creating(transactor, refund); -//! // Handle imbalance -//! if let Ok(imbalance) = imbalance.offset(refund_imbalance) { -//! T::GasPayment::on_unbalanced(imbalance); -//! } +//! T::Currency::set_lock( +//! STAKING_ID, +//! &ledger.stash, +//! ledger.total, +//! T::BlockNumber::max_value(), +//! WithdrawReasons::all() +//! ); +//! // >::insert(controller, ledger); // Commented out as we don't have access to Staking's storage here. //! } +//! # fn main() {} //! ``` //! //! ## Genesis config //! -//! The following storage items depend on the genesis config: -//! -//! - `TotalIssuance` -//! - `ExistentialDeposit` -//! - `TransferFee` -//! - `CreationFee` -//! - `Vesting` -//! - `FreeBalance` -//! - `TransactionBaseFee` -//! - `TransactionByteFee` -//! -//! ## Related Modules -//! -//! The balances module depends on the [`system`](https://crates.parity.io/srml_system/index.html) and -//! [`srml_support`](https://crates.parity.io/srml_support/index.html) modules as well as Substrate Core -//! libraries and the Rust standard library. +//! The Balances module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). #![cfg_attr(not(feature = "std"), no_std)] @@ -182,7 +155,7 @@ use srml_support::traits::{ }; use srml_support::dispatch::Result; use primitives::traits::{ - Zero, SimpleArithmetic, As, StaticLookup, Member, CheckedAdd, CheckedSub, + Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, Saturating }; use system::{IsDeadAccount, OnNewAccount, ensure_signed}; @@ -194,7 +167,8 @@ pub use self::imbalances::{PositiveImbalance, NegativeImbalance}; pub trait Subtrait: system::Trait { /// The balance of an account. - type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + As + As + MaybeSerializeDebug; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + + MaybeSerializeDebug + From; /// A function that is invoked when the free-balance has fallen below the existential deposit and /// has been reduced to zero. @@ -208,7 +182,8 @@ pub trait Subtrait: system::Trait { pub trait Trait: system::Trait { /// The balance of an account. - type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + As + As + MaybeSerializeDebug; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + + MaybeSerializeDebug + From; /// A function that is invoked when the free-balance has fallen below the existential deposit and /// has been reduced to zero. @@ -263,10 +238,12 @@ pub struct VestingSchedule { pub per_block: Balance, } -impl> VestingSchedule { +impl VestingSchedule { /// Amount locked at block `n`. - pub fn locked_at>(&self, n: BlockNumber) -> Balance { - if let Some(x) = Balance::sa(n.as_()).checked_mul(&self.per_block) { + pub fn locked_at(&self, n: BlockNumber) -> Balance + where Balance: From + { + if let Some(x) = Balance::from(n).checked_mul(&self.per_block) { self.offset.max(x) - x } else { Zero::zero() @@ -303,10 +280,8 @@ decl_storage! { /// Information regarding the vesting of a given account. pub Vesting get(vesting) build(|config: &GenesisConfig| { config.vesting.iter().filter_map(|&(ref who, begin, length)| { - let begin: u64 = begin.as_(); - let length: u64 = length.as_(); - let begin: T::Balance = As::sa(begin); - let length: T::Balance = As::sa(length); + let begin = >::from(begin); + let length = >::from(length); config.balances.iter() .find(|&&(ref w, _)| w == who) @@ -407,7 +382,8 @@ impl, I: Instance> Module { /// Get the amount that is currently being vested and cannot be transferred out of this account. pub fn vesting_balance(who: &T::AccountId) -> T::Balance { if let Some(v) = Self::vesting(who) { - Self::free_balance(who).min(v.locked_at(>::block_number())) + Self::free_balance(who) + .min(v.locked_at::(>::block_number())) } else { Zero::zero() } @@ -510,7 +486,7 @@ impl, I: Instance> Module { } } -// wrapping these imbalanes in a private module is necessary to ensure absolute privacy +// wrapping these imbalances in a private module is necessary to ensure absolute privacy // of the inner member. mod imbalances { use super::{ @@ -738,9 +714,14 @@ where if locks.is_empty() { return Ok(()) } + let now = >::block_number(); - if Self::locks(who).into_iter() - .all(|l| now >= l.until || new_balance >= l.amount || !l.reasons.contains(reason)) + if locks.into_iter() + .all(|l| + now >= l.until + || new_balance >= l.amount + || !l.reasons.contains(reason) + ) { Ok(()) } else { @@ -814,7 +795,7 @@ where Self::set_free_balance(who, free_balance - free_slash); let remaining_slash = value - free_slash; // NOTE: `slash()` prefers free balance, but assumes that reserve balance can be drawn - // from in extreme circumstances. `can_slash()` should be used prior to `slash()` is avoid having + // from in extreme circumstances. `can_slash()` should be used prior to `slash()` to avoid having // to draw from reserved funds, however we err on the side of punishment if things are inconsistent // or `can_slash` wasn't used appropriately. if !remaining_slash.is_zero() { @@ -1035,7 +1016,7 @@ where impl, I: Instance> MakePayment for Module { fn make_payment(transactor: &T::AccountId, encoded_len: usize) -> Result { - let encoded_len = >::sa(encoded_len as u64); + let encoded_len = T::Balance::from(encoded_len as u32); let transaction_fee = Self::transaction_base_fee() + Self::transaction_byte_fee() * encoded_len; let imbalance = Self::withdraw( transactor, @@ -1056,4 +1037,3 @@ where Self::total_balance(who).is_zero() } } - diff --git a/srml/consensus/Cargo.toml b/srml/consensus/Cargo.toml index 560ad046fbef27aafbcb7e65e8ead2c8e92d5c1b..bcb16a825a963f03adc31c453d8f7a40e571d776 100644 --- a/srml/consensus/Cargo.toml +++ b/srml/consensus/Cargo.toml @@ -1,13 +1,11 @@ [package] name = "srml-consensus" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } substrate-primitives = { path = "../../core/primitives", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } @@ -23,7 +21,6 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io" } default = ["std"] std = [ "serde", - "serde_derive", "parity-codec/std", "substrate-primitives/std", "rstd/std", diff --git a/srml/consensus/src/lib.rs b/srml/consensus/src/lib.rs index 68faf8838224f8a11deb9a0be13337c05a19d17c..696b9d75f4d9732830ddd0154d40203ad64b1bf5 100644 --- a/srml/consensus/src/lib.rs +++ b/srml/consensus/src/lib.rs @@ -16,6 +16,10 @@ //! # Consensus Module //! +//! - [`consensus::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! - [`Module`](./struct.Module.html) +//! //! ## Overview //! //! The consensus module manages the authority set for the native code. It provides support for reporting offline @@ -33,44 +37,37 @@ //! - `set_code` - Set the new code. //! - `set_storage` - Set some items of storage. //! -//! Please refer to the [`Call`](./enum.Call.html) enum and its associated variants for documentation on each function. -//! //! ### Public Functions //! -//! See the [module](./struct.Module.html) for details on publicly available functions. +//! - `authorities` - Get the current set of authorities. These are the session keys. +//! - `set_authorities` - Set the current set of authorities' session keys. +//! - `set_authority_count` - Set the total number of authorities. +//! - `set_authority` - Set a single authority by index. //! //! ## Usage //! -//! ### Prerequisites -//! -//! To use functionality from the consensus module, implement the specific Trait or function that you are invoking -//! from the module: -//! -//! ```rust,ignore -//! impl for consensus::SomeTrait for Module { -//! /// required functions and types for trait included here -//! /// more comprehensive example included below -//! } -//! ``` -//! -//! Alternatively, to set the authorities: -//! -//! ```rust,ignore -//! consensus::set_authorities(&[]) // example included below -//! ``` -//! //! ### Simple Code Snippet //! //! Set authorities: //! -//! ```rust,ignore -//! >::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]) +//! ``` +//! # use srml_consensus as consensus; +//! # fn not_executed() { +//! # let authority1 = T::SessionKey::default(); +//! # let authority2 = T::SessionKey::default(); +//! >::set_authorities(&[authority1, authority2]) +//! # } //! ``` //! //! Log changes in the authorities set: //! -//! ```rust,ignore -//! >::on_finalize(5); // finalize UintAuthorityId(5) +//! ``` +//! # use srml_consensus as consensus; +//! # use primitives::traits::Zero; +//! # use primitives::traits::OnFinalize; +//! # fn not_executed() { +//! >::on_finalize(T::BlockNumber::zero()); +//! # } //! ``` //! //! ### Example from SRML @@ -78,12 +75,21 @@ //! In the staking module, the `consensus::OnOfflineReport` is implemented to monitor offline //! reporting among validators: //! -//! ```rust,ignore +//! ``` +//! # use srml_consensus as consensus; +//! # trait Trait: consensus::Trait { +//! # } +//! # +//! # srml_support::decl_module! { +//! # pub struct Module for enum Call where origin: T::Origin { +//! # } +//! # } +//! # //! impl consensus::OnOfflineReport> for Module { //! fn handle_report(reported_indices: Vec) { //! for validator_index in reported_indices { -//! let v = >::validators()[validator_index as usize].clone(); -//! Self::on_offline_validator(v, 1); +//! // Get validator from session module +//! // Process validator //! } //! } //! } @@ -92,20 +98,24 @@ //! In the GRANDPA module, we use `srml-consensus` to get the set of `next_authorities` before changing //! this set according to the consensus algorithm (which does not rotate sessions in the *normal* way): //! -//! ```rust,ignore +//! ``` +//! # use srml_consensus as consensus; +//! # use consensus::Trait; +//! # fn not_executed() { //! let next_authorities = >::authorities() //! .into_iter() //! .map(|key| (key, 1)) // evenly-weighted. //! .collect::::SessionKey, u64)>>(); +//! # } //! ``` //! //! ## Related Modules //! -//! - [`staking`](../srml_staking/index.html): This module uses `srml-consensus` to monitor offline +//! - [Staking](../srml_staking/index.html): This module uses `srml-consensus` to monitor offline //! reporting among validators. -//! - [`aura`](../srml_aura/index.html): This module does not relate directly to `srml-consensus`, +//! - [Aura](../srml_aura/index.html): This module does not relate directly to `srml-consensus`, //! but serves to manage offline reporting for the Aura consensus algorithm with its own `handle_report` method. -//! - [`grandpa`](../srml_grandpa/index.html): Although GRANDPA does its own voter-set management, +//! - [Grandpa](../srml_grandpa/index.html): Although GRANDPA does its own voter-set management, //! it has a mode where it can track `consensus`, if desired. //! //! ## References @@ -117,7 +127,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; use rstd::prelude::*; use parity_codec as codec; use codec::{Encode, Decode}; @@ -126,13 +136,13 @@ use srml_support::storage::StorageValue; use srml_support::storage::unhashed::StorageVec; use primitives::traits::{MaybeSerializeDebug, Member}; use substrate_primitives::storage::well_known_keys; -use system::{ensure_signed, ensure_inherent}; +use system::{ensure_signed, ensure_none}; use inherents::{ ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError }; #[cfg(any(feature = "std", test))] -use substrate_primitives::ed25519::Public as AuthorityId; +use substrate_primitives::sr25519::Public as AuthorityId; mod mock; mod tests; @@ -288,7 +298,7 @@ decl_module! { /// Note that the previous block's validator missed its opportunity to propose a block. fn note_offline(origin, offline: ::Inherent) { - ensure_inherent(origin)?; + ensure_none(origin)?; T::InherentOfflineReport::handle_report(offline); } @@ -339,7 +349,8 @@ impl Module { AuthorityStorageVec::::items() } - /// Set the current set of authorities' session keys. + /// Set the current set of authorities' session keys. Will not exceed the current + /// authorities count, even if the given `authorities` is longer. /// /// Called by `rotate_session` only. pub fn set_authorities(authorities: &[T::SessionKey]) { @@ -350,7 +361,7 @@ impl Module { } } - /// Set a single authority by index. + /// Set the total number of authorities. pub fn set_authority_count(count: u32) { Self::save_original_authorities(None); AuthorityStorageVec::::set_count(count); diff --git a/srml/contract/COMPLEXITY.md b/srml/contract/COMPLEXITY.md index 9b304055f766cf3907974fee98f78f9a117baa91..c2d75efaba22c0097fd9c08b8c42ff281b7a77d3 100644 --- a/srml/contract/COMPLEXITY.md +++ b/srml/contract/COMPLEXITY.md @@ -85,7 +85,7 @@ execution contexts operate on the AccountDb. All changes are flushed into underl Today `AccountDb` is implemented as a cascade of overlays with the direct storage at the bottom. Each overlay is represented by a `Map`. On a commit from an overlay to an overlay, maps are merged. On commit from an overlay to the bottommost `AccountDb` all changes are flushed to the storage. On revert, the overlay is just discarded. -## get_storage, get_code, get_balance +## get_storage, get_code_hash, get_rent_allowance, get_balance, contract_exists These functions check the local cache for a requested value and, if it is there, the value is returned. Otherwise, these functions will ask an underlying `AccountDb` for the value. This means that the number of lookups is proportional to the depth of the overlay cascade. If the value can't be found before reaching the bottommost `AccountDb`, then a DB read will be performed (in case `get_balance` the function `free_balance` will be invoked). @@ -95,7 +95,7 @@ These functions return an owned value as its result, so memory usage depends on **complexity**: The memory complexity is proportional to the size of the value. The computational complexity is proportional to the depth of the overlay cascade and the size of the value; the cost is dominated by the DB read though. -## set_storage, set_code, set_balance +## set_storage, set_balance, set_rent_allowance These functions only modify the local `Map`. @@ -105,6 +105,12 @@ While these functions only modify the local `Map`, if changes made by them are c **complexity**: Each lookup has a logarithmical computing time to the number of already inserted entries. No additional memory is required. +## create_contract + +Calls `contract_exists` and if it doesn't exist, do not modify the local `Map` similarly to `set_rent_allowance`. + +**complexity**: The computational complexity is proportional to the depth of the overlay cascade and the size of the value; the cost is dominated by the DB read though. No additional memory is required. + ## commit In this function, all cached values will be inserted into the underlying `AccountDb` or into the storage. @@ -292,11 +298,13 @@ This function serializes the address of the caller into the scratch buffer. **complexity**: Assuming that the address is of constant size, this function has constant complexity. -## ext_random_seed +## ext_random -This function serializes the current block's random seed into the scratch buffer. +This function serializes a random number generated by the given subject into the scratch buffer. +The complexity of this function highly depends on the complexity of `System::random`. `max_subject_len` +limits the size of the subject buffer. -**complexity**: Assuming that the random seed is of constant size, this function has constant complexity. +**complexity**: The complexity of this function depends on the implementation of `System::random`. ## ext_now @@ -327,3 +335,25 @@ This function copies slice of data from the scratch buffer to the sandbox memory 1. Storing a specified slice of the scratch buffer into the sandbox memory (see sandboxing memory set) **complexity**: The computing complexity of this function is proportional to the length of the slice. No additional memory is required. + +## ext_set_rent_allowance + +This function receives the following argument: + +- `value` buffer of a marshaled `Balance`, + +It consists of the following steps: + +1. Loading `value` buffer from the sandbox memory and then decoding it. +2. Invoking `set_rent_allowance` AccountDB function. + +**complexity**: Complexity is proportional to the size of the `value`. This function induces a DB write of size proportional to the `value` size (if flushed to the storage), so should be priced accordingly. + +## ext_rent_allowance + +It consists of the following steps: + +1. Invoking `get_rent_allowance` AccountDB function. +2. Serializing the rent allowance of the current contract into the scratch buffer. + +**complexity**: Assuming that the rent allowance is of constant size, this function has constant complexity. diff --git a/srml/contract/Cargo.toml b/srml/contract/Cargo.toml index 2338aabe0d2f7d54980188ec98934fb933aa4de2..7c04758171beb0eeb15916df4043127b0be0a65c 100644 --- a/srml/contract/Cargo.toml +++ b/srml/contract/Cargo.toml @@ -1,15 +1,15 @@ [package] name = "srml-contract" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } pwasm-utils = { version = "0.6.1", default-features = false } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } parity-wasm = { version = "0.31", default-features = false } +wasmi-validation = { version = "0.1", default-features = false } substrate-primitives = { path = "../../core/primitives", default-features = false } runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } runtime-io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -22,15 +22,18 @@ timestamp = { package = "srml-timestamp", path = "../timestamp", default-feature [dev-dependencies] wabt = "~0.7.4" assert_matches = "1.1" -hex-literal = "0.1.0" +hex-literal = "0.2.0" consensus = { package = "srml-consensus", path = "../consensus" } balances = { package = "srml-balances", path = "../balances" } +hex = "0.3" [features] default = ["std"] +core = [ + "wasmi-validation/core", +] std = [ "serde", - "serde_derive", "parity-codec/std", "substrate-primitives/std", "runtime-primitives/std", @@ -42,4 +45,5 @@ std = [ "timestamp/std", "parity-wasm/std", "pwasm-utils/std", + "wasmi-validation/std", ] diff --git a/srml/contract/src/account_db.rs b/srml/contract/src/account_db.rs index 566b1c4c8408415245548c727085a4fd46f883b9..5cae9f05dc1e9669b6d6199b14487085395ee497 100644 --- a/srml/contract/src/account_db.rs +++ b/srml/contract/src/account_db.rs @@ -16,20 +16,28 @@ //! Auxilliaries to help with managing partial changes to accounts state. -use super::{CodeHash, CodeHashOf, Trait, TrieId, AccountInfoOf, BalanceOf, AccountInfo, TrieIdGenerator}; +use super::{ + AliveContractInfo, BalanceOf, CodeHash, ContractInfo, ContractInfoOf, Module, Trait, TrieId, + TrieIdGenerator, +}; use crate::exec::StorageKey; -use system; use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use rstd::prelude::*; -use runtime_primitives::traits::Zero; -use srml_support::{StorageMap, traits::{UpdateBalanceOutcome, - SignedImbalance, Currency, Imbalance}, storage::child}; +use runtime_io::blake2_256; +use runtime_primitives::traits::{Bounded, Zero}; +use srml_support::traits::{Currency, Imbalance, SignedImbalance, UpdateBalanceOutcome}; +use srml_support::{storage::child, StorageMap}; +use system; +// Note: we don't provide Option because we can't create +// the trie_id in the overlay, thus we provide an overlay on the fields +// specifically. pub struct ChangeEntry { balance: Option>, - /// In the case the outer option is None, the code_hash remains untouched, while providing `Some(None)` signifies a removing of the code in question - code: Option>>, + /// If None, the code_hash remains untouched. + code_hash: Option>, + rent_allowance: Option>, storage: BTreeMap>>, } @@ -37,8 +45,9 @@ pub struct ChangeEntry { impl Default for ChangeEntry { fn default() -> Self { ChangeEntry { + rent_allowance: Default::default(), balance: Default::default(), - code: Default::default(), + code_hash: Default::default(), storage: Default::default(), } } @@ -50,10 +59,15 @@ pub trait AccountDb { /// Account is used when overlayed otherwise trie_id must be provided. /// This is for performance reason. /// - /// Trie id can be None iff account doesn't have an associated trie id in >. + /// Trie id is None iff account doesn't have an associated trie id in >. /// Because DirectAccountDb bypass the lookup for this association. fn get_storage(&self, account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option>; - fn get_code(&self, account: &T::AccountId) -> Option>; + /// If account has an alive contract then return the code hash associated. + fn get_code_hash(&self, account: &T::AccountId) -> Option>; + /// If account has an alive contract then return the rent allowance associated. + fn get_rent_allowance(&self, account: &T::AccountId) -> Option>; + /// Returns false iff account has no alive contract nor tombstone. + fn contract_exists(&self, account: &T::AccountId) -> bool; fn get_balance(&self, account: &T::AccountId) -> BalanceOf; fn commit(&mut self, change_set: ChangeSet); @@ -62,10 +76,16 @@ pub trait AccountDb { pub struct DirectAccountDb; impl AccountDb for DirectAccountDb { fn get_storage(&self, _account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option> { - trie_id.and_then(|id| child::get_raw(id, location)) + trie_id.and_then(|id| child::get_raw(id, &blake2_256(location))) + } + fn get_code_hash(&self, account: &T::AccountId) -> Option> { + >::get(account).and_then(|i| i.as_alive().map(|i| i.code_hash)) } - fn get_code(&self, account: &T::AccountId) -> Option> { - >::get(account) + fn get_rent_allowance(&self, account: &T::AccountId) -> Option> { + >::get(account).and_then(|i| i.as_alive().map(|i| i.rent_allowance)) + } + fn contract_exists(&self, account: &T::AccountId) -> bool { + >::exists(account) } fn get_balance(&self, account: &T::AccountId) -> BalanceOf { T::Currency::free_balance(account) @@ -83,42 +103,63 @@ impl AccountDb for DirectAccountDb { continue; } } - if changed.code.is_some() || !changed.storage.is_empty() { - let mut info = if !>::exists(&address) { - let info = AccountInfo { - trie_id: ::TrieIdGenerator::trie_id(&address), - storage_size: 0, - }; - >::insert(&address, &info); + + if changed.code_hash.is_some() + || changed.rent_allowance.is_some() + || !changed.storage.is_empty() + { + let old_info = match >::get(&address) { + Some(ContractInfo::Alive(alive)) => Some(alive), + None => None, + // Cannot commit changes to tombstone contract + Some(ContractInfo::Tombstone(_)) => continue, + }; + + let mut new_info = if let Some(info) = old_info.clone() { info + } else if let Some(code_hash) = changed.code_hash { + AliveContractInfo:: { + code_hash, + storage_size: >::storage_size_offset(), + trie_id: ::TrieIdGenerator::trie_id(&address), + deduct_block: >::block_number(), + rent_allowance: >::max_value(), + last_write: None, + } } else { - >::get(&address).unwrap() + // No contract exist and no code_hash provided + continue; }; - if let Some(code) = changed.code { - if let Some(code) = code { - >::insert(&address, code); - } else { - >::remove(&address); - } + if let Some(rent_allowance) = changed.rent_allowance { + new_info.rent_allowance = rent_allowance; + } + + if let Some(code_hash) = changed.code_hash { + new_info.code_hash = code_hash; + } + + if !changed.storage.is_empty() { + new_info.last_write = Some(>::block_number()); } - let mut new_storage_size = info.storage_size; for (k, v) in changed.storage.into_iter() { - if let Some(value) = child::get::>(&info.trie_id[..], &k) { - new_storage_size -= value.len() as u64; + if let Some(value) = child::get_raw(&new_info.trie_id[..], &blake2_256(&k)) { + new_info.storage_size -= value.len() as u32; } if let Some(value) = v { - new_storage_size += value.len() as u64; - child::put_raw(&info.trie_id[..], &k, &value[..]); + new_info.storage_size += value.len() as u32; + child::put_raw(&new_info.trie_id[..], &blake2_256(&k), &value[..]); } else { - child::kill(&info.trie_id[..], &k); + child::kill(&new_info.trie_id[..], &blake2_256(&k)); } } - if new_storage_size != info.storage_size { - info.storage_size = new_storage_size; - >::insert(&address, info); + if old_info + .map(|old_info| old_info != new_info) + .unwrap_or(true) + { + >::insert(&address, ContractInfo::Alive(new_info)); } } } @@ -139,9 +180,7 @@ pub struct OverlayAccountDb<'a, T: Trait + 'a> { underlying: &'a AccountDb, } impl<'a, T: Trait> OverlayAccountDb<'a, T> { - pub fn new( - underlying: &'a AccountDb, - ) -> OverlayAccountDb<'a, T> { + pub fn new(underlying: &'a AccountDb) -> OverlayAccountDb<'a, T> { OverlayAccountDb { local: RefCell::new(ChangeSet::new()), underlying, @@ -165,12 +204,31 @@ impl<'a, T: Trait> OverlayAccountDb<'a, T> { .insert(location, value); } - pub fn set_code(&mut self, account: &T::AccountId, code: Option>) { + /// Return an error if contract already exists (either if it is alive or tombstone) + pub fn create_contract( + &mut self, + account: &T::AccountId, + code_hash: CodeHash, + ) -> Result<(), &'static str> { + if self.contract_exists(account) { + return Err("Alive contract or tombstone already exists"); + } + + let mut local = self.local.borrow_mut(); + let contract = local.entry(account.clone()).or_insert_with(|| Default::default()); + + contract.code_hash = Some(code_hash); + contract.rent_allowance = Some(>::max_value()); + + Ok(()) + } + /// Assume contract exists + pub fn set_rent_allowance(&mut self, account: &T::AccountId, rent_allowance: BalanceOf) { self.local .borrow_mut() .entry(account.clone()) .or_insert(Default::default()) - .code = Some(code); + .rent_allowance = Some(rent_allowance); } pub fn set_balance(&mut self, account: &T::AccountId, balance: BalanceOf) { self.local @@ -190,12 +248,26 @@ impl<'a, T: Trait> AccountDb for OverlayAccountDb<'a, T> { .cloned() .unwrap_or_else(|| self.underlying.get_storage(account, trie_id, location)) } - fn get_code(&self, account: &T::AccountId) -> Option> { + fn get_code_hash(&self, account: &T::AccountId) -> Option> { self.local .borrow() .get(account) - .and_then(|a| a.code.clone()) - .unwrap_or_else(|| self.underlying.get_code(account)) + .and_then(|changes| changes.code_hash) + .or_else(|| self.underlying.get_code_hash(account)) + } + fn get_rent_allowance(&self, account: &T::AccountId) -> Option> { + self.local + .borrow() + .get(account) + .and_then(|changes| changes.rent_allowance) + .or_else(|| self.underlying.get_rent_allowance(account)) + } + fn contract_exists(&self, account: &T::AccountId) -> bool { + self.local + .borrow() + .get(account) + .map(|a| a.code_hash.is_some()) + .unwrap_or_else(|| self.underlying.contract_exists(account)) } fn get_balance(&self, account: &T::AccountId) -> BalanceOf { self.local @@ -211,12 +283,9 @@ impl<'a, T: Trait> AccountDb for OverlayAccountDb<'a, T> { match local.entry(address) { Entry::Occupied(e) => { let mut value = e.into_mut(); - if changed.balance.is_some() { - value.balance = changed.balance; - } - if changed.code.is_some() { - value.code = changed.code; - } + value.balance = changed.balance.or(value.balance); + value.code_hash = changed.code_hash.or(value.code_hash); + value.rent_allowance = changed.rent_allowance.or(value.rent_allowance); value.storage.extend(changed.storage.into_iter()); } Entry::Vacant(e) => { diff --git a/srml/contract/src/exec.rs b/srml/contract/src/exec.rs index 4e3d34c30fb8a400ce15452d550aca2a1b4981ab..1ab59fa0c28138470eae7420b5d3dd22ce020b3d 100644 --- a/srml/contract/src/exec.rs +++ b/srml/contract/src/exec.rs @@ -14,12 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use super::{CodeHash, Config, ContractAddressFor, Event, RawEvent, Trait, TrieId, BalanceOf, AccountInfoOf}; +use super::{CodeHash, Config, ContractAddressFor, Event, RawEvent, Trait, + TrieId, BalanceOf, ContractInfoOf}; use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; use crate::gas::{GasMeter, Token, approx_gas_for_balance}; use rstd::prelude::*; -use runtime_primitives::traits::{CheckedAdd, CheckedSub, Zero}; +use runtime_primitives::traits::{Bounded, CheckedAdd, CheckedSub, Zero}; use srml_support::{StorageMap, traits::{WithdrawReason, Currency}}; use timestamp; @@ -28,6 +29,9 @@ pub type CallOf = ::Call; pub type MomentOf = ::Moment; pub type SeedOf = ::Hash; +/// A type that represents a topic of an event. At the moment a hash is used. +pub type TopicOf = ::Hash; + #[cfg_attr(test, derive(Debug))] pub struct InstantiateReceipt { pub address: AccountId, @@ -102,11 +106,19 @@ pub trait Ext { /// Returns a reference to the timestamp of the current block fn now(&self) -> &MomentOf; - /// Returns a reference to the random seed for the current block - fn random_seed(&self) -> &SeedOf; + /// Returns a random number for the current block with the given subject. + fn random(&self, subject: &[u8]) -> SeedOf; + + /// Deposit an event with the given topics. + /// + /// There should not be any duplicates in `topics`. + fn deposit_event(&mut self, topics: Vec>, data: Vec); + + /// Set rent allowance of the contract + fn set_rent_allowance(&mut self, rent_allowance: BalanceOf); - /// Deposit an event. - fn deposit_event(&mut self, data: Vec); + /// Rent allowance of the contract + fn rent_allowance(&self) -> BalanceOf; } /// Loader is a companion of the `Vm` trait. It loads an appropriate abstract @@ -182,6 +194,15 @@ impl VmExecResult { } } +/// Struct that records a request to deposit an event with a list of topics. +#[cfg_attr(any(feature = "std", test), derive(Debug, PartialEq, Eq))] +pub struct IndexedEvent { + /// A list of topics this event will be deposited with. + pub topics: Vec, + /// The event to deposit. + pub event: Event, +} + /// A trait that represent a virtual machine. /// /// You can view a virtual machine as something that takes code, an input data buffer, @@ -231,7 +252,7 @@ pub struct ExecutionContext<'a, T: Trait + 'a, V, L> { pub self_trie_id: Option, pub overlay: OverlayAccountDb<'a, T>, pub depth: usize, - pub events: Vec>, + pub events: Vec>, pub calls: Vec<(T::AccountId, T::Call)>, pub config: &'a Config, pub vm: &'a V, @@ -249,7 +270,8 @@ where /// The specified `origin` address will be used as `sender` for pub fn top_level(origin: T::AccountId, cfg: &'a Config, vm: &'a V, loader: &'a L) -> Self { ExecutionContext { - self_trie_id: >::get(&origin).map(|s| s.trie_id), + self_trie_id: >::get(&origin) + .and_then(|i| i.as_alive().map(|i| i.trie_id.clone())), self_account: origin, overlay: OverlayAccountDb::::new(&DirectAccountDb), depth: 0, @@ -263,7 +285,8 @@ where fn nested(&self, overlay: OverlayAccountDb<'a, T>, dest: T::AccountId) -> Self { ExecutionContext { - self_trie_id: >::get(&dest).map(|s| s.trie_id), + self_trie_id: >::get(&dest) + .and_then(|i| i.as_alive().map(|i| i.trie_id.clone())), self_account: dest, overlay, depth: self.depth + 1, @@ -295,7 +318,11 @@ where return Err("not enough gas to pay base call fee"); } - let dest_code_hash = self.overlay.get_code(&dest); + // Assumption: pay_rent doesn't collide with overlay because + // pay_rent will be done on first call and dest contract and balance + // cannot be changed before the first call + crate::rent::pay_rent::(&dest); + let mut output_data = Vec::new(); let (change_set, events, calls) = { @@ -315,7 +342,7 @@ where )?; } - if let Some(dest_code_hash) = dest_code_hash { + if let Some(dest_code_hash) = self.overlay.get_code_hash(&dest) { let executable = self.loader.load_main(&dest_code_hash)?; output_data = self .vm @@ -326,7 +353,6 @@ where caller: self.self_account.clone(), value_transferred: value, timestamp: timestamp::Module::::now(), - random_seed: system::Module::::random_seed(), }, input_data, empty_output_buf, @@ -369,15 +395,11 @@ where &self.self_account, ); - if self.overlay.get_code(&dest).is_some() { - // It should be enough to check only the code. - return Err("contract already exists"); - } - let (change_set, events, calls) = { let mut overlay = OverlayAccountDb::new(&self.overlay); - - overlay.set_code(&dest, Some(code_hash.clone())); + + overlay.create_contract(&dest, code_hash.clone())?; + let mut nested = self.nested(overlay, dest.clone()); // Send funds unconditionally here. If the `endowment` is below existential_deposit @@ -400,7 +422,6 @@ where caller: self.self_account.clone(), value_transferred: endowment, timestamp: timestamp::Module::::now(), - random_seed: system::Module::::random_seed(), }, input_data, EmptyOutputBuf::new(), @@ -409,7 +430,10 @@ where .into_result()?; // Deposit an instantiation event. - nested.events.push(RawEvent::Instantiated(self.self_account.clone(), dest.clone())); + nested.events.push(IndexedEvent { + event: RawEvent::Instantiated(self.self_account.clone(), dest.clone()), + topics: Vec::new(), + }); (nested.overlay.into_change_set(), nested.events, nested.calls) }; @@ -536,8 +560,10 @@ fn transfer<'a, T: Trait, V: Vm, L: Loader>( if transactor != dest { ctx.overlay.set_balance(transactor, new_from_balance); ctx.overlay.set_balance(dest, new_to_balance); - ctx.events - .push(RawEvent::Transfer(transactor.clone(), dest.clone(), value)); + ctx.events.push(IndexedEvent { + event: RawEvent::Transfer(transactor.clone(), dest.clone(), value), + topics: Vec::new(), + }); } Ok(()) @@ -548,7 +574,6 @@ struct CallContext<'a, 'b: 'a, T: Trait + 'b, V: Vm + 'b, L: Loader> { caller: T::AccountId, value_transferred: BalanceOf, timestamp: T::Moment, - random_seed: T::Hash, } impl<'a, 'b: 'a, T, E, V, L> Ext for CallContext<'a, 'b, T, V, L> @@ -614,16 +639,28 @@ where self.value_transferred } - fn random_seed(&self) -> &T::Hash { - &self.random_seed + fn random(&self, subject: &[u8]) -> SeedOf { + system::Module::::random(subject) } fn now(&self) -> &T::Moment { &self.timestamp } - fn deposit_event(&mut self, data: Vec) { - self.ctx.events.push(RawEvent::Contract(self.ctx.self_account.clone(), data)); + fn deposit_event(&mut self, topics: Vec, data: Vec) { + self.ctx.events.push(IndexedEvent { + topics, + event: RawEvent::Contract(self.ctx.self_account.clone(), data), + }); + } + + fn set_rent_allowance(&mut self, rent_allowance: BalanceOf) { + self.ctx.overlay.set_rent_allowance(&self.ctx.self_account, rent_allowance) + } + + fn rent_allowance(&self) -> BalanceOf { + self.ctx.overlay.get_rent_allowance(&self.ctx.self_account) + .unwrap_or(>::max_value()) // Must never be triggered actually } } @@ -640,8 +677,8 @@ where #[cfg(test)] mod tests { use super::{ - ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, - Vm, VmExecResult, InstantiateReceipt, RawEvent, + BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, + Vm, VmExecResult, InstantiateReceipt, RawEvent, IndexedEvent, }; use crate::account_db::AccountDb; use crate::gas::GasMeter; @@ -763,7 +800,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(exec_ch)); + ctx.overlay.create_contract(&BOB, exec_ch).unwrap(); assert_matches!( ctx.call(BOB, value, &mut gas_meter, &data, EmptyOutputBuf::new()), @@ -998,7 +1035,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(return_ch)); + ctx.overlay.create_contract(&BOB, return_ch).unwrap(); let result = ctx.call( dest, @@ -1026,7 +1063,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(input_data_ch)); + ctx.overlay.create_contract(&BOB, input_data_ch).unwrap(); let result = ctx.call( BOB, @@ -1038,7 +1075,7 @@ mod tests { assert_matches!(result, Ok(_)); }); - // This one tests passing the input data into a contract via call. + // This one tests passing the input data into a contract via instantiate. with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); @@ -1085,7 +1122,7 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(recurse_ch)); + ctx.overlay.create_contract(&BOB, recurse_ch).unwrap(); let result = ctx.call( BOB, @@ -1132,8 +1169,8 @@ mod tests { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(origin, &cfg, &vm, &loader); - ctx.overlay.set_code(&dest, Some(bob_ch)); - ctx.overlay.set_code(&CHARLIE, Some(charlie_ch)); + ctx.overlay.create_contract(&dest, bob_ch).unwrap(); + ctx.overlay.create_contract(&CHARLIE, charlie_ch).unwrap(); let result = ctx.call( dest, @@ -1175,8 +1212,8 @@ mod tests { with_externalities(&mut ExtBuilder::default().build(), || { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); - ctx.overlay.set_code(&BOB, Some(bob_ch)); - ctx.overlay.set_code(&CHARLIE, Some(charlie_ch)); + ctx.overlay.create_contract(&BOB, bob_ch).unwrap(); + ctx.overlay.create_contract(&CHARLIE, charlie_ch).unwrap(); let result = ctx.call( BOB, @@ -1242,10 +1279,16 @@ mod tests { // Check that the newly created account has the expected code hash and // there are instantiation event. - assert_eq!(ctx.overlay.get_code(&created_contract_address).unwrap(), dummy_ch); + assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, created_contract_address, 100), - RawEvent::Instantiated(ALICE, created_contract_address), + IndexedEvent { + event: RawEvent::Transfer(ALICE, created_contract_address, 100), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Instantiated(ALICE, created_contract_address), + topics: Vec::new(), + } ]); } ); @@ -1283,7 +1326,7 @@ mod tests { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); ctx.overlay.set_balance(&ALICE, 1000); - ctx.overlay.set_code(&BOB, Some(creator_ch)); + ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), @@ -1294,11 +1337,20 @@ mod tests { // Check that the newly created account has the expected code hash and // there are instantiation event. - assert_eq!(ctx.overlay.get_code(&created_contract_address).unwrap(), dummy_ch); + assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, BOB, 20), - RawEvent::Transfer(BOB, created_contract_address, 15), - RawEvent::Instantiated(BOB, created_contract_address), + IndexedEvent { + event: RawEvent::Transfer(ALICE, BOB, 20), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Transfer(BOB, created_contract_address, 15), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Instantiated(BOB, created_contract_address), + topics: Vec::new(), + }, ]); } ); @@ -1334,7 +1386,7 @@ mod tests { let cfg = Config::preload(); let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); ctx.overlay.set_balance(&ALICE, 1000); - ctx.overlay.set_code(&BOB, Some(creator_ch)); + ctx.overlay.create_contract(&BOB, creator_ch).unwrap(); assert_matches!( ctx.call(BOB, 20, &mut GasMeter::::with_limit(1000, 1), &[], EmptyOutputBuf::new()), @@ -1344,9 +1396,37 @@ mod tests { // The contract wasn't created so we don't expect to see an instantiation // event here. assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, BOB, 20), + IndexedEvent { + event: RawEvent::Transfer(ALICE, BOB, 20), + topics: Vec::new(), + }, ]); } ); } + + #[test] + fn rent_allowance() { + let vm = MockVm::new(); + let mut loader = MockLoader::empty(); + let rent_allowance_ch = loader.insert(|ctx| { + assert_eq!(ctx.ext.rent_allowance(), >::max_value()); + ctx.ext.set_rent_allowance(10); + assert_eq!(ctx.ext.rent_allowance(), 10); + VmExecResult::Ok + }); + + with_externalities(&mut ExtBuilder::default().build(), || { + let cfg = Config::preload(); + let mut ctx = ExecutionContext::top_level(ALICE, &cfg, &vm, &loader); + + let result = ctx.instantiate( + 0, + &mut GasMeter::::with_limit(10000, 1), + &rent_allowance_ch, + &[], + ); + assert_matches!(result, Ok(_)); + }); + } } diff --git a/srml/contract/src/gas.rs b/srml/contract/src/gas.rs index 54199042bccb8ff9507d73b065c595c5c406c89f..1ea519634463c7ed232e99f1ad9c363247c0ca20 100644 --- a/srml/contract/src/gas.rs +++ b/srml/contract/src/gas.rs @@ -16,7 +16,7 @@ use crate::{GasSpent, Module, Trait, BalanceOf, NegativeImbalanceOf}; use runtime_primitives::BLOCK_FULL; -use runtime_primitives::traits::{As, CheckedMul, CheckedSub, Zero}; +use runtime_primitives::traits::{CheckedMul, CheckedSub, Zero, SaturatedConversion}; use srml_support::{StorageValue, traits::{OnUnbalanced, ExistenceRequirement, WithdrawReason, Currency, Imbalance}}; #[cfg(test)] @@ -212,7 +212,7 @@ pub fn buy_gas( // Buy the specified amount of gas. let gas_price = >::gas_price(); - let cost = >>::as_(gas_limit.clone()) + let cost = gas_limit.clone().into() .checked_mul(&gas_price) .ok_or("overflow multiplying gas limit by price")?; @@ -247,19 +247,18 @@ pub fn refund_unused_gas( // also has T::Gas type. >::mutate(|block_gas_spent| *block_gas_spent += gas_spent); - // Refund gas left by the price it was bought. - let refund = >>::as_(gas_left) * gas_meter.gas_price; + // Refund gas left by the price it was bought at. + let refund = gas_left.into() * gas_meter.gas_price; let refund_imbalance = T::Currency::deposit_creating(transactor, refund); if let Ok(imbalance) = imbalance.offset(refund_imbalance) { T::GasPayment::on_unbalanced(imbalance); } } -/// A little handy utility for converting a value in balance units into approximitate value in gas units +/// A little handy utility for converting a value in balance units into approximate value in gas units /// at the given gas price. pub fn approx_gas_for_balance(gas_price: BalanceOf, balance: BalanceOf) -> T::Gas { - let amount_in_gas: BalanceOf = balance / gas_price; - >>::sa(amount_in_gas) + (balance / gas_price).saturated_into::() } /// A simple utility macro that helps to match against a @@ -316,7 +315,7 @@ mod tests { struct DoubleTokenMetadata { multiplier: u64, } - /// A simple token that charges for the given amount multipled to + /// A simple token that charges for the given amount multiplied to /// a multiplier taken from a given metadata. #[derive(Copy, Clone, PartialEq, Eq, Debug)] struct DoubleToken(u64); @@ -324,7 +323,7 @@ mod tests { impl Token for DoubleToken { type Metadata = DoubleTokenMetadata; fn calculate_amount(&self, metadata: &DoubleTokenMetadata) -> u64 { - // Probably you want to use saturating mul in producation code. + // Probably you want to use saturating mul in production code. self.0 * metadata.multiplier } } diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index c919439d54650c294627ab520971a03d8ba07f15..3f05bb8a8fa0e592ba9e401863edae2a4180d0d2 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -16,14 +16,16 @@ //! # Contract Module //! -//! The contract module provides functionality for the runtime to deploy and execute WebAssembly smart-contracts. -//! The supported dispatchable functions are documented as part of the [`Call`](./enum.Call.html) enum. +//! The Contract module provides functionality for the runtime to deploy and execute WebAssembly smart-contracts. +//! +//! - [`contract::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) //! //! ## Overview //! -//! This module extends accounts (see `Balances` module) to have smart-contract functionality. -//! These "smart-contract accounts" have the ability to create smart-contracts and make calls to other contract -//! and non-contract accounts. +//! This module extends accounts based on the `Currency` trait to have smart-contract functionality. It can +//! be used with other modules that implement accounts based on `Currency`. These "smart-contract accounts" +//! have the ability to create smart-contracts and make calls to other contract and non-contract accounts. //! //! The smart-contract code is stored once in a `code_cache`, and later retrievable via its `code_hash`. //! This means that multiple smart-contracts can be instantiated from the same `code_cache`, without replicating @@ -33,9 +35,8 @@ //! This call can alter the storage entries of the smart-contract account, create new smart-contracts, //! or call other smart-contracts. //! -//! Finally, when the `Balances` module determines an account is dead (i.e. account balance fell below the -//! existential deposit), it reaps the account. This will delete the associated code and storage of the -//! smart-contract account. +//! Finally, when an account is reaped, its associated code and storage of the smart-contract account +//! will also be deleted. //! //! ### Gas //! @@ -57,28 +58,22 @@ //! //! ### Dispatchable functions //! -//! * `put_code` - Stores the given binary Wasm code into the chains storage and returns its `code_hash`. -//! +//! * `put_code` - Stores the given binary Wasm code into the chain's storage and returns its `code_hash`. //! * `create` - Deploys a new contract from the given `code_hash`, optionally transferring some balance. //! This creates a new smart contract account and calls its contract deploy handler to initialize the contract. -//! //! * `call` - Makes a call to an account, optionally transferring some balance. //! -//! ### Public functions -//! -//! See the [module](./struct.Module.html) for details on publicly available functions. -//! //! ## Usage //! -//! The contract module is a work in progress. The following examples show how this contract module can be +//! The Contract module is a work in progress. The following examples show how this Contract module can be //! used to create and call contracts. //! -//! * [`pDSL`](https://github.com/Robbepop/pdsl) is a domain specific language which enables writing +//! * [`pDSL`](https://github.com/Robbepop/pdsl) is a domain specific language that enables writing //! WebAssembly based smart contracts in the Rust programming language. This is a work in progress. //! //! ## Related Modules -//! * [`Balances`](https://crates.parity.io/srml_balances/index.html) //! +//! * [Balances](../srml_balances/index.html) #![cfg_attr(not(feature = "std"), no_std)] @@ -88,6 +83,7 @@ mod gas; mod account_db; mod exec; mod wasm; +mod rent; #[cfg(test)] mod tests; @@ -96,16 +92,21 @@ use crate::exec::ExecutionContext; use crate::account_db::{AccountDb, DirectAccountDb}; #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use substrate_primitives::crypto::UncheckedFrom; -use rstd::prelude::*; -use rstd::marker::PhantomData; +use rstd::{prelude::*, marker::PhantomData, convert::TryFrom}; use parity_codec::{Codec, Encode, Decode}; -use runtime_primitives::traits::{Hash, As, SimpleArithmetic,Bounded, StaticLookup}; +use runtime_io::blake2_256; +use runtime_primitives::traits::{ + Hash, SimpleArithmetic, Bounded, StaticLookup, Zero, MaybeSerializeDebug, Member +}; use srml_support::dispatch::{Result, Dispatchable}; -use srml_support::{Parameter, StorageMap, StorageValue, decl_module, decl_event, decl_storage, storage::child}; +use srml_support::{ + Parameter, StorageMap, StorageValue, decl_module, decl_event, decl_storage, storage::child +}; use srml_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency}; use system::{ensure_signed, RawOrigin}; +use substrate_primitives::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; use timestamp; pub type CodeHash = ::Hash; @@ -121,50 +122,160 @@ pub trait ComputeDispatchFee { fn compute_dispatch_fee(call: &Call) -> Balance; } -#[derive(Encode,Decode,Clone,Debug)] /// Information for managing an acocunt and its sub trie abstraction. /// This is the required info to cache for an account -pub struct AccountInfo { - /// unique ID for the subtree encoded as a byte +#[derive(Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum ContractInfo { + Alive(AliveContractInfo), + Tombstone(TombstoneContractInfo), +} + +impl ContractInfo { + /// If contract is alive then return some alive info + pub fn get_alive(self) -> Option> { + if let ContractInfo::Alive(alive) = self { + Some(alive) + } else { + None + } + } + /// If contract is alive then return some reference to alive info + pub fn as_alive(&self) -> Option<&AliveContractInfo> { + if let ContractInfo::Alive(ref alive) = self { + Some(alive) + } else { + None + } + } + /// If contract is alive then return some mutable reference to alive info + pub fn as_alive_mut(&mut self) -> Option<&mut AliveContractInfo> { + if let ContractInfo::Alive(ref mut alive) = self { + Some(alive) + } else { + None + } + } + + /// If contract is tombstone then return some alive info + pub fn get_tombstone(self) -> Option> { + if let ContractInfo::Tombstone(tombstone) = self { + Some(tombstone) + } else { + None + } + } + /// If contract is tombstone then return some reference to tombstone info + pub fn as_tombstone(&self) -> Option<&TombstoneContractInfo> { + if let ContractInfo::Tombstone(ref tombstone) = self { + Some(tombstone) + } else { + None + } + } + /// If contract is tombstone then return some mutable reference to tombstone info + pub fn as_tombstone_mut(&mut self) -> Option<&mut TombstoneContractInfo> { + if let ContractInfo::Tombstone(ref mut tombstone) = self { + Some(tombstone) + } else { + None + } + } +} + +pub type AliveContractInfo = + RawAliveContractInfo, BalanceOf, ::BlockNumber>; + +/// Information for managing an account and its sub trie abstraction. +/// This is the required info to cache for an account. +// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct RawAliveContractInfo { + /// Unique ID for the subtree encoded as a bytes vector. pub trie_id: TrieId, - /// the size of stored value in octet - pub storage_size: u64, + /// The size of stored value in octet. + pub storage_size: u32, + /// The code associated with a given account. + pub code_hash: CodeHash, + /// Pay rent at most up to this value. + pub rent_allowance: Balance, + /// Last block rent has been payed. + pub deduct_block: BlockNumber, + /// Last block child storage has been written. + pub last_write: Option, } -/// Get a trie id (trie id must be unique and collision resistant depending upon its context) -/// Note that it is different than encode because trie id should have collision resistance -/// property (being a proper uniqueid). +pub type TombstoneContractInfo = + RawTombstoneContractInfo<::Hash, ::Hashing>; + +// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. +#[derive(Encode, Decode, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct RawTombstoneContractInfo(H, PhantomData); + +impl RawTombstoneContractInfo +where + H: Member + MaybeSerializeDebug + AsRef<[u8]> + AsMut<[u8]> + Copy + Default + rstd::hash::Hash, + Hasher: Hash, +{ + fn new(storage_root: &[u8], code_hash: H) -> Self { + let mut buf = Vec::new(); + storage_root.using_encoded(|encoded| buf.extend_from_slice(encoded)); + buf.extend_from_slice(code_hash.as_ref()); + RawTombstoneContractInfo(Hasher::hash(&buf[..]), PhantomData) + } +} + +/// Get a trie id (trie id must be unique and collision resistant depending upon its context). +/// Note that it is different than encode because trie id should be collision resistant +/// (being a proper unique identifier). pub trait TrieIdGenerator { - /// get a trie id for an account, using reference to parent account trie id to ensure - /// uniqueness of trie id - /// The implementation must ensure every new trie id is unique: two consecutive call with the + /// Get a trie id for an account, using reference to parent account trie id to ensure + /// uniqueness of trie id. + /// + /// The implementation must ensure every new trie id is unique: two consecutive calls with the /// same parameter needs to return different trie id values. + /// + /// Also, the implementation is responsible for ensuring that `TrieId` starts with + /// `:child_storage:`. + /// TODO: We want to change this, see https://github.com/paritytech/substrate/issues/2325 fn trie_id(account_id: &AccountId) -> TrieId; } -/// Get trie id from `account_id` +/// Get trie id from `account_id`. pub struct TrieIdFromParentCounter(PhantomData); -/// This generator use inner counter for account id and apply hash over `AccountId + -/// accountid_counter` +/// This generator uses inner counter for account id and applies the hash over `AccountId + +/// accountid_counter`. impl TrieIdGenerator for TrieIdFromParentCounter where T::AccountId: AsRef<[u8]> { fn trie_id(account_id: &T::AccountId) -> TrieId { - // note that skipping a value due to error is not an issue here. - // we only need uniqueness, not sequence. - let new_seed = >::mutate(|v| v.wrapping_add(1)); + // Note that skipping a value due to error is not an issue here. + // We only need uniqueness, not sequence. + let new_seed = >::mutate(|v| { + *v = v.wrapping_add(1); + *v + }); let mut buf = Vec::new(); buf.extend_from_slice(account_id.as_ref()); buf.extend_from_slice(&new_seed.to_le_bytes()[..]); - T::Hashing::hash(&buf[..]).as_ref().into() + + // TODO: see https://github.com/paritytech/substrate/issues/2325 + CHILD_STORAGE_KEY_PREFIX.iter() + .chain(b"default:") + .chain(T::Hashing::hash(&buf[..]).as_ref().iter()) + .cloned() + .collect() } } pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; -pub type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +pub type NegativeImbalanceOf = + <::Currency as Currency<::AccountId>>::NegativeImbalance; pub trait Trait: timestamp::Trait { type Currency: Currency; @@ -175,8 +286,8 @@ pub trait Trait: timestamp::Trait { /// The overarching event type. type Event: From> + Into<::Event>; - // As is needed for wasm-utils - type Gas: Parameter + Default + Codec + SimpleArithmetic + Bounded + Copy + As> + As + As; + type Gas: Parameter + Default + Codec + SimpleArithmetic + Bounded + Copy + + Into> + TryFrom>; /// A function type to get the contract address given the creator. type DetermineContractAddress: ContractAddressFor, Self::AccountId>; @@ -184,7 +295,7 @@ pub trait Trait: timestamp::Trait { /// A function type that computes the fee for dispatching the given `Call`. /// /// It is recommended (though not required) for this function to return a fee that would be taken - /// by executive module for regular dispatch. + /// by the Executive module for regular dispatch. type ComputeDispatchFee: ComputeDispatchFee>; /// trieid id generator @@ -194,10 +305,10 @@ pub trait Trait: timestamp::Trait { type GasPayment: OnUnbalanced>; } -/// Simple contract address determintator. +/// Simple contract address determiner. /// -/// Address calculated from the code (of the constructor), input data to the constructor -/// and account id which requested the account creation. +/// Address calculated from the code (of the constructor), input data to the constructor, +/// and the account id that requested the account creation. /// /// Formula: `blake2_256(blake2_256(code) + blake2_256(data) + origin)` pub struct SimpleAddressDeterminator(PhantomData); @@ -218,14 +329,14 @@ where } /// The default dispatch fee computor computes the fee in the same way that -/// implementation of `MakePayment` for balances module does. +/// the implementation of `MakePayment` for the Balances module does. pub struct DefaultDispatchFeeComputor(PhantomData); impl ComputeDispatchFee> for DefaultDispatchFeeComputor { fn compute_dispatch_fee(call: &T::Call) -> BalanceOf { - let encoded_len = call.using_encoded(|encoded| encoded.len()); + let encoded_len = call.using_encoded(|encoded| encoded.len() as u32); let base_fee = >::transaction_base_fee(); let byte_fee = >::transaction_byte_fee(); - base_fee + byte_fee * as As>::sa(encoded_len as u64) + base_fee + byte_fee * encoded_len.into() } } @@ -237,7 +348,7 @@ decl_module! { /// Updates the schedule for metering contracts. /// /// The schedule must have a greater version than the stored schedule. - fn update_schedule(schedule: Schedule) -> Result { + pub fn update_schedule(schedule: Schedule) -> Result { if >::current_schedule().version >= schedule.version { return Err("new schedule must have a greater version than current"); } @@ -248,9 +359,9 @@ decl_module! { Ok(()) } - /// Stores the given binary Wasm code into the chains storage and returns its `codehash`. + /// Stores the given binary Wasm code into the chain's storage and returns its `codehash`. /// You can instantiate contracts only with stored code. - fn put_code( + pub fn put_code( origin, #[compact] gas_limit: T::Gas, code: Vec @@ -277,7 +388,7 @@ decl_module! { /// * If the account is a regular account, any value will be transferred. /// * If no account exists and the call value is not less than `existential_deposit`, /// a regular account will be created and any value will be transferred. - fn call( + pub fn call( origin, dest: ::Source, #[compact] value: BalanceOf, @@ -301,16 +412,21 @@ decl_module! { let result = ctx.call(dest, value, &mut gas_meter, &data, exec::EmptyOutputBuf::new()); if let Ok(_) = result { - // Commit all changes that made it thus far into the persistant storage. + // Commit all changes that made it thus far into the persistent storage. DirectAccountDb.commit(ctx.overlay.into_change_set()); // Then deposit all events produced. - ctx.events.into_iter().for_each(Self::deposit_event); + ctx.events.into_iter().for_each(|indexed_event| { + >::deposit_event_indexed( + &*indexed_event.topics, + ::Event::from(indexed_event.event).into(), + ); + }); } // Refund cost of the unused gas. // - // NOTE: this should go after the commit to the storage, since the storage changes + // NOTE: This should go after the commit to the storage, since the storage changes // can alter the balance of the caller. gas::refund_unused_gas::(&origin, gas_meter, imbalance); @@ -327,13 +443,13 @@ decl_module! { /// /// Creation is executed as follows: /// - /// - the destination address is computed based on the sender and hash of the code. - /// - the smart-contract account is created at the computed address. - /// - the `ctor_code` is executed in the context of the newly created account. Buffer returned + /// - The destination address is computed based on the sender and hash of the code. + /// - The smart-contract account is created at the computed address. + /// - The `ctor_code` is executed in the context of the newly-created account. Buffer returned /// after the execution is saved as the `code` of the account. That code will be invoked /// upon any call received by this account. /// - The contract is initialized. - fn create( + pub fn create( origin, #[compact] endowment: BalanceOf, #[compact] gas_limit: T::Gas, @@ -344,7 +460,7 @@ decl_module! { // Commit the gas upfront. // - // NOTE: it is very important to avoid any state changes before + // NOTE: It is very important to avoid any state changes before // paying for the gas. let (mut gas_meter, imbalance) = gas::buy_gas::(&origin, gas_limit)?; @@ -355,16 +471,21 @@ decl_module! { let result = ctx.instantiate(endowment, &mut gas_meter, &code_hash, &data); if let Ok(_) = result { - // Commit all changes that made it thus far into the persistant storage. + // Commit all changes that made it thus far into the persistent storage. DirectAccountDb.commit(ctx.overlay.into_change_set()); // Then deposit all events produced. - ctx.events.into_iter().for_each(Self::deposit_event); + ctx.events.into_iter().for_each(|indexed_event| { + >::deposit_event_indexed( + &*indexed_event.topics, + ::Event::from(indexed_event.event).into(), + ); + }); } // Refund cost of the unused gas. // - // NOTE: this should go after the commit to the storage, since the storage changes + // NOTE: This should go after the commit to the storage, since the storage changes // can alter the balance of the caller. gas::refund_unused_gas::(&origin, gas_meter, imbalance); @@ -377,6 +498,117 @@ decl_module! { result.map(|_| ()) } + /// Allows block producers to claim a small reward for evicting a contract. If a block producer + /// fails to do so, a regular users will be allowed to claim the reward. + /// + /// If contract is not evicted as a result of this call, no actions are taken and + /// the sender is not eligible for the reward. + fn claim_surcharge(origin, dest: T::AccountId, aux_sender: Option) { + let origin = origin.into(); + let (signed, rewarded) = match origin { + Some(system::RawOrigin::Signed(ref account)) if aux_sender.is_none() => { + (true, account) + }, + Some(system::RawOrigin::None) if aux_sender.is_some() => { + (false, aux_sender.as_ref().expect("checked above")) + }, + _ => return Err("Invalid surcharge claim: origin must be signed or \ + inherent and auxiliary sender only provided on inherent") + }; + + // Add some advantage for block producers (who send unsigned extrinsics) by + // adding a handicap: for signed extrinsics we use a slightly older block number + // for the eviction check. This can be viewed as if we pushed regular users back in past. + let handicap = if signed { + >::signed_claim_handicap() + } else { + Zero::zero() + }; + + // If poking the contract has lead to eviction of the contract, give out the rewards. + if rent::try_evict::(&dest, handicap) == rent::RentOutcome::Evicted { + T::Currency::deposit_into_existing(rewarded, Self::surcharge_reward())?; + } + } + + /// Allows a contract to restore a tombstone by giving its storage. + /// + /// The contract that wants to restore (i.e. origin of the call, or `msg.sender` in Solidity terms) will compute a + /// tombstone with its storage and the given code_hash. If the computed tombstone + /// match the destination one, the destination contract is restored with the rent_allowance` specified, + /// while the origin sends all its funds to the destination and is removed. + fn restore_to( + origin, + dest: T::AccountId, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec + ) { + let origin = ensure_signed(origin)?; + + let mut origin_contract = >::get(&origin) + .and_then(|c| c.get_alive()) + .ok_or("Cannot restore from inexisting or tombstone contract")?; + + let current_block = >::block_number(); + + if origin_contract.last_write == Some(current_block) { + return Err("Origin TrieId written in the current block"); + } + + let dest_tombstone = >::get(&dest) + .and_then(|c| c.get_tombstone()) + .ok_or("Cannot restore to inexisting or alive contract")?; + + let last_write = if !delta.is_empty() { + Some(current_block) + } else { + origin_contract.last_write + }; + + let key_values_taken = delta.iter() + .filter_map(|key| { + child::get_raw(&origin_contract.trie_id, &blake2_256(key)).map(|value| { + child::kill(&origin_contract.trie_id, &blake2_256(key)); + (key, value) + }) + }) + .collect::>(); + + let tombstone = >::new( + // This operation is cheap enough because last_write (delta not included) + // is not this block as it has been checked earlier. + &runtime_io::child_storage_root(&origin_contract.trie_id)[..], + code_hash, + ); + + if tombstone != dest_tombstone { + for (key, value) in key_values_taken { + child::put_raw(&origin_contract.trie_id, &blake2_256(key), &value); + } + + return Err("Tombstones don't match"); + } + + origin_contract.storage_size -= key_values_taken.iter() + .map(|(_, value)| value.len() as u32) + .sum::(); + + >::remove(&origin); + >::insert(&dest, ContractInfo::Alive(RawAliveContractInfo { + trie_id: origin_contract.trie_id, + storage_size: origin_contract.storage_size, + code_hash, + rent_allowance, + deduct_block: current_block, + last_write, + })); + + let origin_free_balance = T::Currency::free_balance(&origin); + T::Currency::make_free_balance_be(&origin, >::zero()); + T::Currency::deposit_creating(&dest, origin_free_balance); + } + fn on_finalize() { >::kill(); } @@ -413,6 +645,29 @@ decl_event! { decl_storage! { trait Store for Module as Contract { + /// Number of block delay an extrinsic claim surcharge has. + /// + /// When claim surchage is called by an extrinsic the rent is checked + /// for current_block - delay + SignedClaimHandicap get(signed_claim_handicap) config(): T::BlockNumber; + /// The minimum amount required to generate a tombstone. + TombstoneDeposit get(tombstone_deposit) config(): BalanceOf; + /// Size of a contract at the time of creation. This is a simple way to ensure + /// that empty contracts eventually gets deleted. + StorageSizeOffset get(storage_size_offset) config(): u32; + /// Price of a byte of storage per one block interval. Should be greater than 0. + RentByteFee get(rent_byte_price) config(): BalanceOf; + /// The amount of funds a contract should deposit in order to offset + /// the cost of one byte. + /// + /// Let's suppose the deposit is 1,000 BU (balance units)/byte and the rent is 1 BU/byte/day, + /// then a contract with 1,000,000 BU that uses 1,000 bytes of storage would pay no rent. + /// But if the balance reduced to 500,000 BU and the storage stayed the same at 1,000, + /// then it would pay 500 BU/day. + RentDepositOffset get(rent_deposit_offset) config(): BalanceOf; + /// Reward that is received by the party whose touch has led + /// to removal of a contract. + SurchargeReward get(surcharge_reward) config(): BalanceOf; /// The fee required to make a transfer. TransferFee get(transfer_fee) config(): BalanceOf; /// The fee required to create an account. @@ -422,38 +677,38 @@ decl_storage! { /// The fee to be paid for making a transaction; the per-byte portion. TransactionByteFee get(transaction_byte_fee) config(): BalanceOf; /// The fee required to create a contract instance. - ContractFee get(contract_fee) config(): BalanceOf = BalanceOf::::sa(21); + ContractFee get(contract_fee) config(): BalanceOf = 21.into(); /// The base fee charged for calling into a contract. - CallBaseFee get(call_base_fee) config(): T::Gas = T::Gas::sa(135); + CallBaseFee get(call_base_fee) config(): T::Gas = 135.into(); /// The base fee charged for creating a contract. - CreateBaseFee get(create_base_fee) config(): T::Gas = T::Gas::sa(175); + CreateBaseFee get(create_base_fee) config(): T::Gas = 175.into(); /// The price of one unit of gas. - GasPrice get(gas_price) config(): BalanceOf = BalanceOf::::sa(1); + GasPrice get(gas_price) config(): BalanceOf = 1.into(); /// The maximum nesting level of a call/create stack. MaxDepth get(max_depth) config(): u32 = 100; /// The maximum amount of gas that could be expended per block. - BlockGasLimit get(block_gas_limit) config(): T::Gas = T::Gas::sa(1_000_000); + BlockGasLimit get(block_gas_limit) config(): T::Gas = 10_000_000.into(); /// Gas spent so far in this block. GasSpent get(gas_spent): T::Gas; /// Current cost schedule for contracts. CurrentSchedule get(current_schedule) config(): Schedule = Schedule::default(); - /// The code associated with a given account. - pub CodeHashOf: map T::AccountId => Option>; /// A mapping from an original code hash to the original code, untouched by instrumentation. pub PristineCode: map CodeHash => Option>; - /// A mapping between an original code hash and instrumented wasm code, ready for the execution. + /// A mapping between an original code hash and instrumented wasm code, ready for execution. pub CodeStorage: map CodeHash => Option; - /// The subtrie counter + /// The subtrie counter. pub AccountCounter: u64 = 0; /// The code associated with a given account. - pub AccountInfoOf: map T::AccountId => Option; + pub ContractInfoOf: map T::AccountId => Option>; } } impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::AccountId) { - >::remove(who); - >::get(who).map(|info| child::kill_storage(&info.trie_id)); + if let Some(ContractInfo::Alive(info)) = >::get(who) { + child::kill_storage(&info.trie_id); + } + >::remove(who); } } @@ -494,7 +749,7 @@ pub struct Schedule { /// Version of the schedule. pub version: u32, - /// Cost of putting a byte of code into the storage. + /// Cost of putting a byte of code into storage. pub put_code_per_byte_cost: Gas, /// Gas cost of a growing memory by single page. @@ -509,8 +764,11 @@ pub struct Schedule { /// Gas cost to deposit an event; the per-byte portion. pub event_data_per_byte_cost: Gas, + /// Gas cost to deposit an event; the cost per topic. + pub event_per_topic_cost: Gas, + /// Gas cost to deposit an event; the base. - pub event_data_base_cost: Gas, + pub event_base_cost: Gas, /// Gas cost per one byte read from the sandbox memory. pub sandbox_data_read_cost: Gas, @@ -518,31 +776,44 @@ pub struct Schedule { /// Gas cost per one byte written to the sandbox memory. pub sandbox_data_write_cost: Gas, - /// How tall the stack is allowed to grow? + /// The maximum number of topics supported by an event. + pub max_event_topics: u32, + + /// Maximum allowed stack height. /// /// See https://wiki.parity.io/WebAssembly-StackHeight to find out /// how the stack frame cost is calculated. pub max_stack_height: u32, - /// What is the maximal memory pages amount is allowed to have for - /// a contract. + /// Maximum number of memory pages allowed for a contract. pub max_memory_pages: u32, + + /// Whether the `ext_println` function is allowed to be used contracts. + /// MUST only be enabled for `dev` chains, NOT for production chains + pub enable_println: bool, + + /// The maximum length of a subject used for PRNG generation. + pub max_subject_len: u32, } -impl> Default for Schedule { +impl> Default for Schedule { fn default() -> Schedule { Schedule { version: 0, - put_code_per_byte_cost: Gas::sa(1), - grow_mem_cost: Gas::sa(1), - regular_op_cost: Gas::sa(1), - return_data_per_byte_cost: Gas::sa(1), - event_data_per_byte_cost: Gas::sa(1), - event_data_base_cost: Gas::sa(1), - sandbox_data_read_cost: Gas::sa(1), - sandbox_data_write_cost: Gas::sa(1), + put_code_per_byte_cost: 1.into(), + grow_mem_cost: 1.into(), + regular_op_cost: 1.into(), + return_data_per_byte_cost: 1.into(), + event_data_per_byte_cost: 1.into(), + event_per_topic_cost: 1.into(), + event_base_cost: 1.into(), + sandbox_data_read_cost: 1.into(), + sandbox_data_write_cost: 1.into(), + max_event_topics: 4, max_stack_height: 64 * 1024, max_memory_pages: 16, + enable_println: false, + max_subject_len: 32, } } } diff --git a/srml/contract/src/rent.rs b/srml/contract/src/rent.rs new file mode 100644 index 0000000000000000000000000000000000000000..3baf043b90d37d16ceefd29e141f5c727a5d3eb0 --- /dev/null +++ b/srml/contract/src/rent.rs @@ -0,0 +1,194 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use crate::{BalanceOf, ContractInfo, ContractInfoOf, Module, TombstoneContractInfo, Trait}; +use runtime_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, + SaturatedConversion}; +use srml_support::traits::{Currency, ExistenceRequirement, Imbalance, WithdrawReason}; +use srml_support::StorageMap; + +#[derive(PartialEq, Eq, Copy, Clone)] +#[must_use] +pub enum RentOutcome { + /// Exempted from rent iff: + /// * rent is offset completely by the `rent_deposit_offset`, + /// * or rent has already been paid for this block number, + /// * or account doesn't have a contract, + /// * or account has a tombstone. + Exempted, + /// Evicted iff: + /// * rent exceed rent allowance, + /// * or can't withdraw the rent, + /// * or go below subsistence threshold. + Evicted, + /// The outstanding dues were paid or were able to be paid. + Ok, +} + +/// Evict and optionally pay dues (or check account can pay them otherwise) at the current +/// block number (modulo `handicap`, read on). +/// +/// `pay_rent` gives an ability to pay or skip paying rent. +/// `handicap` gives a way to check or pay the rent up to a moment in the past instead +/// of current block. +/// +/// NOTE: This function acts eagerly, all modification are committed into the storage. +fn try_evict_or_and_pay_rent( + account: &T::AccountId, + handicap: T::BlockNumber, + pay_rent: bool, +) -> RentOutcome { + let contract = match >::get(account) { + None | Some(ContractInfo::Tombstone(_)) => return RentOutcome::Exempted, + Some(ContractInfo::Alive(contract)) => contract, + }; + + let current_block_number = >::block_number(); + + // How much block has passed since the last deduction for the contract. + let blocks_passed = { + // Calculate an effective block number, i.e. after adjusting for handicap. + let effective_block_number = current_block_number.saturating_sub(handicap); + let n = effective_block_number.saturating_sub(contract.deduct_block); + if n.is_zero() { + // Rent has already been paid + return RentOutcome::Exempted; + } + n + }; + + let balance = T::Currency::free_balance(account); + + // An amount of funds to charge per block for storage taken up by the contract. + let fee_per_block = { + let free_storage = balance + .checked_div(&>::rent_deposit_offset()) + .unwrap_or_else(Zero::zero); + + let effective_storage_size = + >::from(contract.storage_size).saturating_sub(free_storage); + + effective_storage_size + .checked_mul(&>::rent_byte_price()) + .unwrap_or(>::max_value()) + }; + + if fee_per_block.is_zero() { + // The rent deposit offset reduced the fee to 0. This means that the contract + // gets the rent for free. + return RentOutcome::Exempted; + } + + // The minimal amount of funds required for a contract not to be evicted. + let subsistence_threshold = T::Currency::minimum_balance() + >::tombstone_deposit(); + + let dues = fee_per_block + .checked_mul(&blocks_passed.saturated_into::().into()) + .unwrap_or(>::max_value()); + + let dues_limited = dues.min(contract.rent_allowance); + let rent_allowance_exceeded = dues > contract.rent_allowance; + let is_below_subsistence = balance < subsistence_threshold; + let go_below_subsistence = balance.saturating_sub(dues_limited) < subsistence_threshold; + let can_withdraw_rent = T::Currency::ensure_can_withdraw( + account, + dues_limited, + WithdrawReason::Fee, + balance.saturating_sub(dues_limited), + ) + .is_ok(); + + if !rent_allowance_exceeded && can_withdraw_rent && !go_below_subsistence { + // Collect dues + + if pay_rent { + let imbalance = T::Currency::withdraw( + account, + dues, + WithdrawReason::Fee, + ExistenceRequirement::KeepAlive, + ) + .expect( + "Withdraw has been checked above; + go_below_subsistence is false and subsistence > existencial_deposit; + qed", + ); + + >::mutate(account, |contract| { + let contract = contract + .as_mut() + .and_then(|c| c.as_alive_mut()) + .expect("Dead or inexistent account has been exempt above; qed"); + + contract.rent_allowance -= imbalance.peek(); // rent_allowance is not exceeded + contract.deduct_block = current_block_number; + }) + } + + RentOutcome::Ok + } else { + // Evict + + if can_withdraw_rent && !go_below_subsistence { + T::Currency::withdraw( + account, + dues, + WithdrawReason::Fee, + ExistenceRequirement::KeepAlive, + ) + .expect("Can withdraw and don't go below subsistence"); + } else if !is_below_subsistence { + T::Currency::make_free_balance_be(account, subsistence_threshold); + } else { + T::Currency::make_free_balance_be(account, >::zero()); + } + + if !is_below_subsistence { + // The contract has funds above subsistence deposit and that means it can afford to + // leave tombstone. + + // Note: this operation is heavy. + let child_storage_root = runtime_io::child_storage_root(&contract.trie_id); + + let tombstone = >::new( + &child_storage_root[..], + contract.code_hash, + ); + >::insert(account, ContractInfo::Tombstone(tombstone)); + runtime_io::kill_child_storage(&contract.trie_id); + } + + RentOutcome::Evicted + } +} + +/// Make account paying the rent for the current block number +/// +/// NOTE: This function acts eagerly. +pub fn pay_rent(account: &T::AccountId) { + let _ = try_evict_or_and_pay_rent::(account, Zero::zero(), true); +} + +/// Evict the account if it should be evicted at the given block number. +/// +/// `handicap` gives a way to check or pay the rent up to a moment in the past instead +/// of current block. E.g. if the contract is going to be evicted at the current block, +/// `handicap=1` can defer the eviction for 1 block. +/// +/// NOTE: This function acts eagerly. +pub fn try_evict(account: &T::AccountId, handicap: T::BlockNumber) -> RentOutcome { + try_evict_or_and_pay_rent::(account, handicap, false) +} diff --git a/srml/contract/src/tests.rs b/srml/contract/src/tests.rs index 2f80023322d14bb052c0f82504eb075334af0291..aeadc993534bff2e5b0bd7fed3b03002ca5e4a79 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contract/src/tests.rs @@ -19,26 +19,28 @@ #![allow(unused)] +use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; +use crate::{ + BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, + Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, +}; +use assert_matches::assert_matches; +use hex_literal::*; +use parity_codec::{Decode, Encode, KeyedVec}; +use runtime_io; use runtime_io::with_externalities; -use runtime_primitives::testing::{Digest, DigestItem, H256, Header, UintAuthorityId}; +use runtime_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; use runtime_primitives::traits::{BlakeTwo256, IdentityLookup}; use runtime_primitives::BuildStorage; -use runtime_io; -use srml_support::{storage::child, StorageMap, assert_ok, impl_outer_event, impl_outer_dispatch, - impl_outer_origin, traits::Currency}; -use substrate_primitives::Blake2Hasher; -use system::{self, Phase, EventRecord}; -use {wabt, balances, consensus}; -use hex_literal::*; -use assert_matches::assert_matches; -use crate::{ - ContractAddressFor, GenesisConfig, Module, RawEvent, - Trait, ComputeDispatchFee, TrieIdGenerator, TrieId, - AccountInfo, AccountInfoOf, +use srml_support::{ + assert_ok, impl_outer_dispatch, impl_outer_event, impl_outer_origin, storage::child, + traits::Currency, StorageMap, StorageValue }; -use substrate_primitives::storage::well_known_keys; -use parity_codec::{Encode, Decode, KeyedVec}; use std::sync::atomic::{AtomicUsize, Ordering}; +use substrate_primitives::storage::well_known_keys; +use substrate_primitives::Blake2Hasher; +use system::{self, EventRecord, Phase}; +use {balances, consensus, wabt}; mod contract { // Re-export contents of the root. This basically @@ -62,7 +64,7 @@ impl_outer_dispatch! { } } -#[derive(Clone, Eq, PartialEq)] +#[derive(Clone, Eq, PartialEq, Debug)] pub struct Test; impl system::Trait for Test { type Origin = Origin; @@ -117,12 +119,21 @@ impl ContractAddressFor for DummyContractAddressFor { } } -static KEY_COUNTER: AtomicUsize = AtomicUsize::new(0); - pub struct DummyTrieIdGenerator; impl TrieIdGenerator for DummyTrieIdGenerator { fn trie_id(account_id: &u64) -> TrieId { - let mut res = KEY_COUNTER.fetch_add(1, Ordering::Relaxed).to_le_bytes().to_vec(); + use substrate_primitives::storage::well_known_keys; + + let new_seed = >::mutate(|v| { + *v = v.wrapping_add(1); + *v + }); + + // TODO: see https://github.com/paritytech/substrate/issues/2325 + let mut res = vec![]; + res.extend_from_slice(well_known_keys::CHILD_STORAGE_KEY_PREFIX); + res.extend_from_slice(b"default:"); + res.extend_from_slice(&new_seed.to_le_bytes()); res.extend_from_slice(&account_id.to_le_bytes()); res } @@ -138,6 +149,7 @@ impl ComputeDispatchFee for DummyComputeDispatchFee { const ALICE: u64 = 1; const BOB: u64 = 2; const CHARLIE: u64 = 3; +const DJANGO: u64 = 4; pub struct ExtBuilder { existential_deposit: u64, @@ -199,8 +211,14 @@ impl ExtBuilder { ); t.extend( GenesisConfig:: { - transaction_base_fee: 0, - transaction_byte_fee: 0, + signed_claim_handicap: 2, + rent_byte_price: 4, + rent_deposit_offset: 10_000, + storage_size_offset: 8, + surcharge_reward: 150, + tombstone_deposit: 16, + transaction_base_fee: 2, + transaction_byte_fee: 6, transfer_fee: self.transfer_fee, creation_fee: self.creation_fee, contract_fee: 21, @@ -224,13 +242,7 @@ fn refunds_unused_gas() { with_externalities(&mut ExtBuilder::default().build(), || { Balances::deposit_creating(&0, 100_000_000); - assert_ok!(Contract::call( - Origin::signed(0), - 1, - 0, - 100_000, - Vec::new() - )); + assert_ok!(Contract::call(Origin::signed(0), 1, 0, 100_000, Vec::new())); assert_eq!(Balances::free_balance(&0), 100_000_000 - (2 * 135)); }); @@ -238,29 +250,45 @@ fn refunds_unused_gas() { #[test] fn account_removal_removes_storage() { - let unique_id1 = b"unique_id1"; - let unique_id2 = b"unique_id2"; with_externalities( &mut ExtBuilder::default().existential_deposit(100).build(), || { + let trie_id1 = ::TrieIdGenerator::trie_id(&1); + let trie_id2 = ::TrieIdGenerator::trie_id(&2); + let key1 = &[1; 32]; + let key2 = &[2; 32]; + // Set up two accounts with free balance above the existential threshold. { Balances::deposit_creating(&1, 110); - AccountInfoOf::::insert(1, &AccountInfo { - trie_id: unique_id1.to_vec(), - storage_size: 0, - }); - child::put(&unique_id1[..], &b"foo".to_vec(), &b"1".to_vec()); - assert_eq!(child::get(&unique_id1[..], &b"foo".to_vec()), Some(b"1".to_vec())); - child::put(&unique_id1[..], &b"bar".to_vec(), &b"2".to_vec()); + ContractInfoOf::::insert(1, &ContractInfo::Alive(RawAliveContractInfo { + trie_id: trie_id1.clone(), + storage_size: Contract::storage_size_offset(), + deduct_block: System::block_number(), + code_hash: H256::repeat_byte(1), + rent_allowance: 40, + last_write: None, + })); + + let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); + overlay.set_storage(&1, key1.clone(), Some(b"1".to_vec())); + overlay.set_storage(&1, key2.clone(), Some(b"2".to_vec())); + DirectAccountDb.commit(overlay.into_change_set()); Balances::deposit_creating(&2, 110); - AccountInfoOf::::insert(2, &AccountInfo { - trie_id: unique_id2.to_vec(), - storage_size: 0, - }); - child::put(&unique_id2[..], &b"hello".to_vec(), &b"3".to_vec()); - child::put(&unique_id2[..], &b"world".to_vec(), &b"4".to_vec()); + ContractInfoOf::::insert(2, &ContractInfo::Alive(RawAliveContractInfo { + trie_id: trie_id2.clone(), + storage_size: Contract::storage_size_offset(), + deduct_block: System::block_number(), + code_hash: H256::repeat_byte(2), + rent_allowance: 40, + last_write: None, + })); + + let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); + overlay.set_storage(&2, key1.clone(), Some(b"3".to_vec())); + overlay.set_storage(&2, key2.clone(), Some(b"4".to_vec())); + DirectAccountDb.commit(overlay.into_change_set()); } // Transfer funds from account 1 of such amount that after this transfer @@ -272,15 +300,15 @@ fn account_removal_removes_storage() { // Verify that all entries from account 1 is removed, while // entries from account 2 is in place. { - assert_eq!(child::get_raw(&unique_id1[..], &b"foo".to_vec()), None); - assert_eq!(child::get_raw(&unique_id1[..], &b"bar".to_vec()), None); + assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1).is_none()); + assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2).is_none()); assert_eq!( - child::get(&unique_id2[..], &b"hello".to_vec()), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1), Some(b"3".to_vec()) ); assert_eq!( - child::get(&unique_id2[..], &b"world".to_vec()), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key2), Some(b"4".to_vec()) ); } @@ -291,14 +319,16 @@ fn account_removal_removes_storage() { const CODE_RETURN_FROM_START_FN: &str = r#" (module (import "env" "ext_return" (func $ext_return (param i32 i32))) - (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32))) + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (start $start) (func $start (call $ext_deposit_event - (i32.const 8) - (i32.const 4) + (i32.const 0) ;; The topics buffer + (i32.const 0) ;; The topics buffer's length + (i32.const 8) ;; The data buffer + (i32.const 4) ;; The data buffer's length ) (call $ext_return (i32.const 8) @@ -315,7 +345,7 @@ const CODE_RETURN_FROM_START_FN: &str = r#" (data (i32.const 8) "\01\02\03\04") ) "#; -const HASH_RETURN_FROM_START_FN: [u8; 32] = hex!("abb4194bdea47b2904fe90b4fd674bd40d96f423956627df8c39d2b1a791ab9d"); +const HASH_RETURN_FROM_START_FN: [u8; 32] = hex!("66c45bd7c473a1746e1d241176166ef53b1f207f56c5e87d1b6650140704181b"); #[test] fn instantiate_and_call_and_deposit_event() { @@ -326,11 +356,7 @@ fn instantiate_and_call_and_deposit_event() { || { Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contract::put_code( - Origin::signed(ALICE), - 100_000, - wasm, - )); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); // Check at the end to get hash on error easily let creation = Contract::create( @@ -345,33 +371,39 @@ fn instantiate_and_call_and_deposit_event() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_RETURN_FROM_START_FN.into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(BOB, 100) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)) + event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Contract(BOB, vec![1, 2, 3, 4])) + event: MetaEvent::contract(RawEvent::Contract(BOB, vec![1, 2, 3, 4])), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)) + event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], } ]); assert_ok!(creation); - assert!(AccountInfoOf::::exists(BOB)); + assert!(ContractInfoOf::::exists(BOB)); }, ); } @@ -398,7 +430,7 @@ const HASH_DISPATCH_CALL: [u8; 32] = hex!("49dfdcaf9c1553be10634467e95b8e71a3bc1 fn dispatch_call() { // This test can fail due to the encoding changes. In case it becomes too annoying // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let encoded = parity_codec::Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); + let encoded = Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); let wasm = wabt::wat2wasm(CODE_DISPATCH_CALL).unwrap(); @@ -408,11 +440,7 @@ fn dispatch_call() { || { Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contract::put_code( - Origin::signed(ALICE), - 100_000, - wasm, - )); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); // Let's keep this assert even though it's redundant. If you ever need to update the // wasm source this test will fail and will show you the actual hash. @@ -420,10 +448,12 @@ fn dispatch_call() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_DISPATCH_CALL.into())), + topics: vec![], }, ]); @@ -447,24 +477,29 @@ fn dispatch_call() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_DISPATCH_CALL.into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(BOB, 100) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)) + event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)) + event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], }, // Dispatching the call. @@ -472,21 +507,722 @@ fn dispatch_call() { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(CHARLIE, 50) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::Transfer(BOB, CHARLIE, 50, 0) - ) + ), + topics: vec![], }, // Event emited as a result of dispatch. EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Dispatched(BOB, true)) + event: MetaEvent::contract(RawEvent::Dispatched(BOB, true)), + topics: vec![], } ]); }, ); } + +const CODE_SET_RENT: &str = r#" +(module + (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) + (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) + (import "env" "ext_set_rent_allowance" (func $ext_set_rent_allowance (param i32 i32))) + (import "env" "ext_input_size" (func $ext_input_size (result i32))) + (import "env" "ext_input_copy" (func $ext_input_copy (param i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + ;; insert a value of 4 bytes into storage + (func $call_0 + (call $ext_set_storage + (i32.const 1) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + ) + + ;; remove the value inserted by call_1 + (func $call_1 + (call $ext_set_storage + (i32.const 1) + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) + ) + + ;; transfer 50 to ALICE + (func $call_2 + (call $ext_dispatch_call + (i32.const 68) + (i32.const 11) + ) + ) + + ;; do nothing + (func $call_else) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + ;; Dispatch the call according to input size + (func (export "call") + (local $input_size i32) + (set_local $input_size + (call $ext_input_size) + ) + (block $IF_ELSE + (block $IF_2 + (block $IF_1 + (block $IF_0 + (br_table $IF_0 $IF_1 $IF_2 $IF_ELSE + (get_local $input_size) + ) + (unreachable) + ) + (call $call_0) + return + ) + (call $call_1) + return + ) + (call $call_2) + return + ) + (call $call_else) + ) + + ;; Set into storage a 4 bytes value + ;; Set call set_rent_allowance with input + (func (export "deploy") + (local $input_size i32) + (call $ext_set_storage + (i32.const 0) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + (set_local $input_size + (call $ext_input_size) + ) + (call $ext_input_copy + (i32.const 0) + (i32.const 0) + (get_local $input_size) + ) + (call $ext_set_rent_allowance + (i32.const 0) + (get_local $input_size) + ) + ) + + ;; Encoding of 10 in balance + (data (i32.const 0) "\28") + + ;; Encoding of call transfer 50 to CHARLIE + (data (i32.const 68) "\00\00\03\00\00\00\00\00\00\00\C8") +) +"#; + +// Use test_hash_and_code test to get the actual hash if the code changed. +const HASH_SET_RENT: [u8; 32] = hex!("21d6b1d59aa6038fcad632488e9026893a1bbb48581774c771b8f24320697f05"); + +/// Input data for each call in set_rent code +mod call { + pub fn set_storage_4_byte() -> Vec { vec![] } + pub fn remove_storage_4_byte() -> Vec { vec![0] } + pub fn transfer() -> Vec { vec![0, 0] } + pub fn null() -> Vec { vec![0, 0, 0] } +} + +/// Test correspondance of set_rent code and its hash. +/// Also test that encoded extrinsic in code correspond to the correct transfer +#[test] +fn test_set_rent_code_and_hash() { + // This test can fail due to the encoding changes. In case it becomes too annoying + // let's rewrite so as we use this module controlled call or we serialize it in runtime. + let encoded = Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); + assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); + + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_SET_RENT.into())), + topics: vec![], + }, + ]); + } + ); +} + +#[test] +fn storage_size() { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + // Storage size + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); + + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::set_storage_4_byte())); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4 + 4); + + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::remove_storage_4_byte())); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); + } + ); +} + +#[test] +fn deduct_blocks() { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000); + + // Advance 4 blocks + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + // Check result + let rent = (8 + 4 - 3) // storage size = size_offset + deploy_set_storage - deposit_offset + * 4 // rent byte price + * 4; // blocks to rent + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent); + assert_eq!(bob_contract.deduct_block, 5); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent); + + // Advance 7 blocks more + System::initialize(&12, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + // Check result + let rent_2 = (8 + 4 - 2) // storage size = size_offset + deploy_set_storage - deposit_offset + * 4 // rent byte price + * 7; // blocks to rent + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); + assert_eq!(bob_contract.deduct_block, 12); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); + + // Second call on same block should have no effect on rent + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); + assert_eq!(bob_contract.deduct_block, 12); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); + } + ); +} + +#[test] +fn call_contract_removals() { + removals(|| Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null()).is_ok()); +} + +#[test] +fn inherent_claim_surcharge_contract_removals() { + removals(|| Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok()); +} + +#[test] +fn signed_claim_surcharge_contract_removals() { + removals(|| Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok()); +} + +#[test] +fn claim_surcharge_malus() { + // Test surcharge malus for inherent + claim_surcharge(4, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), true); + claim_surcharge(3, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), true); + claim_surcharge(2, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), true); + claim_surcharge(1, || Contract::claim_surcharge(Origin::NONE, BOB, Some(ALICE)).is_ok(), false); + + // Test surcharge malus for signed + claim_surcharge(4, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), true); + claim_surcharge(3, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), false); + claim_surcharge(2, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), false); + claim_surcharge(1, || Contract::claim_surcharge(Origin::signed(ALICE), BOB, None).is_ok(), false); +} + +/// Claim surcharge with the given trigger_call at the given blocks. +/// if removes is true then assert that the contract is a tombstonedead +fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 100, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Advance blocks + System::initialize(&blocks, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert!(trigger_call()); + + if removes { + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + } else { + assert!(ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); + } + } + ); +} + +/// Test for all kind of removals for the given trigger: +/// * if balance is reached and balance > subsistence threshold +/// * if allowance is exceeded +/// * if balance is reached and balance < subsistence threshold +fn removals(trigger_call: impl Fn() -> bool) { + let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + // Balance reached and superior to subsistence threshold + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm.clone())); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 100, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + + // Advance blocks + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + + // Advance blocks + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + } + ); + + // Allowance exceeded + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm.clone())); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 1_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(100u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); + + // Advance blocks + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + + // Advance blocks + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + } + ); + + // Balance reached and inferior to subsistence threshold + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm.clone())); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 50+Balances::minimum_balance(), + 100_000, HASH_SET_RENT.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + + // Transfer funds + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::transfer())); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + + // Advance blocks + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).is_none()); + + // Advance blocks + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).is_none()); + } + ); +} + +const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" +(module + (import "env" "ext_rent_allowance" (func $ext_rent_allowance)) + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func $assert (param i32) + (block $ok + (br_if $ok + (get_local 0) + ) + (unreachable) + ) + ) + + (func (export "call")) + + (func (export "deploy") + ;; fill the scratch buffer with the rent allowance. + (call $ext_rent_allowance) + + ;; assert $ext_scratch_size == 8 + (call $assert + (i32.eq + (call $ext_scratch_size) + (i32.const 8) + ) + ) + + ;; copy contents of the scratch buffer into the contract's memory. + (call $ext_scratch_copy + (i32.const 8) ;; Pointer in memory to the place where to copy. + (i32.const 0) ;; Offset from the start of the scratch buffer. + (i32.const 8) ;; Count of bytes to copy. + ) + + ;; assert that contents of the buffer is equal to >::max_value(). + (call $assert + (i64.eq + (i64.load + (i32.const 8) + ) + (i64.const 0xFFFFFFFFFFFFFFFF) + ) + ) + ) +) +"#; +const HASH_CHECK_DEFAULT_RENT_ALLOWANCE: [u8; 32] = hex!("4f9ec2b94eea522cfff10b77ef4056c631045c00978a457d283950521ecf07b6"); + +#[test] +fn default_rent_allowance_on_create() { + let wasm = wabt::wat2wasm(CODE_CHECK_DEFAULT_RENT_ALLOWANCE).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + // Create + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, + HASH_CHECK_DEFAULT_RENT_ALLOWANCE.into(), + vec![], + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, >::max_value()); + + // Advance blocks + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + + // Check contract is still alive + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive(); + assert!(bob_contract.is_some()) + } + ); +} + +const CODE_RESTORATION: &str = r#" +(module + (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) + (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_dispatch_call + (i32.const 200) ;; Pointer to the start of encoded call buffer + (i32.const 115) ;; Length of the buffer + ) + ) + (func (export "deploy") + ;; Data to restore + (call $ext_set_storage + (i32.const 0) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + + ;; ACL + (call $ext_set_storage + (i32.const 100) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + ) + + ;; Data to restore + (data (i32.const 0) "\28") + + ;; ACL + (data (i32.const 100) "\01") + + ;; Call + (data (i32.const 200) "\01\05\02\00\00\00\00\00\00\00\21\d6\b1\d5\9a\a6\03\8f\ca\d6\32\48\8e\90" + "\26\89\3a\1b\bb\48\58\17\74\c7\71\b8\f2\43\20\69\7f\05\32\00\00\00\00\00\00\00\08\01\00\00" + "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01" + "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + "\00" + ) +) +"#; +const HASH_RESTORATION: [u8; 32] = hex!("b393bfa8de97b02f08ba1580b46100a80c9489a97c8d870691c9ff7236b29bc7"); + +#[test] +fn restorations_dirty_storage_and_different_storage() { + restoration(true, true); +} + +#[test] +fn restorations_dirty_storage() { + restoration(false, true); +} + +#[test] +fn restoration_different_storage() { + restoration(true, false); +} + +#[test] +fn restoration_success() { + restoration(false, false); +} + +fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: bool) { + let acl_key = { + let mut s = [0u8; 32]; + s[0] = 1; + s + }; + + // This test can fail due to the encoding changes. In case it becomes too annoying + // let's rewrite so as we use this module controlled call or we serialize it in runtime. + let encoded = hex::encode(Encode::encode(&Call::Contract(super::Call::restore_to( + BOB, + HASH_SET_RENT.into(), + ::Balance::from(50u32), + vec![acl_key, acl_key], + )))); + + let literal = "0105020000000000000021d6b1d59aa6038fcad632488e9026893a1bbb48581774c771b8f243206\ + 97f053200000000000000080100000000000000000000000000000000000000000000000000000000000000010\ + 0000000000000000000000000000000000000000000000000000000000000"; + + assert_eq!(encoded, literal); + assert_eq!(115, hex::decode(literal).unwrap().len()); + + let restoration_wasm = wabt::wat2wasm(CODE_RESTORATION).unwrap(); + let set_rent_wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, restoration_wasm)); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, set_rent_wasm)); + + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_RESTORATION.into())), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_SET_RENT.into())), + topics: vec![], + }, + ]); + + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, HASH_SET_RENT.into(), + ::Balance::from(0u32).encode() + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 0); + + if test_different_storage { + assert_ok!(Contract::call( + Origin::signed(ALICE), + BOB, 0, 100_000, + call::set_storage_4_byte()) + ); + } + + // Advance 4 blocks + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + + // Trigger rent through call + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + + Balances::deposit_creating(&CHARLIE, 1_000_000); + assert_ok!(Contract::create( + Origin::signed(CHARLIE), + 30_000, + 100_000, HASH_RESTORATION.into(), + ::Balance::from(0u32).encode() + )); + + let django_trie_id = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap().trie_id; + + if !test_restore_to_with_dirty_storage { + // Advance 1 blocks + System::initialize(&6, &[0u8; 32].into(), &[0u8; 32].into()); + } + + assert_ok!(Contract::call( + Origin::signed(ALICE), + DJANGO, 0, 100_000, + vec![], + )); + + if test_different_storage || test_restore_to_with_dirty_storage { + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + let django_contract = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap(); + assert_eq!(django_contract.storage_size, 16); + assert_eq!(django_contract.trie_id, django_trie_id); + assert_eq!(django_contract.deduct_block, System::block_number()); + } else { + let bob_contract = ContractInfoOf::::get(BOB).unwrap() + .get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 50); + assert_eq!(bob_contract.storage_size, 12); + assert_eq!(bob_contract.trie_id, django_trie_id); + assert_eq!(bob_contract.deduct_block, System::block_number()); + assert!(ContractInfoOf::::get(DJANGO).is_none()); + } + } + ); +} diff --git a/srml/contract/src/wasm/code_cache.rs b/srml/contract/src/wasm/code_cache.rs index dab8c4bfa4b04a7ab931688affb74ff807e24af2..da92272c3803a7b9cae15fd26e5fb17861b7cbae 100644 --- a/srml/contract/src/wasm/code_cache.rs +++ b/srml/contract/src/wasm/code_cache.rs @@ -29,7 +29,7 @@ use crate::gas::{GasMeter, Token}; use crate::wasm::{prepare, runtime::Env, PrefabWasmModule}; use crate::{CodeHash, CodeStorage, PristineCode, Schedule, Trait}; use rstd::prelude::*; -use runtime_primitives::traits::{As, CheckedMul, Hash, Bounded}; +use runtime_primitives::traits::{CheckedMul, Hash, Bounded}; use srml_support::StorageMap; /// Gas metering token that used for charging storing code into the code storage. @@ -37,16 +37,15 @@ use srml_support::StorageMap; /// Specifies the code length in bytes. #[cfg_attr(test, derive(Debug, PartialEq, Eq))] #[derive(Copy, Clone)] -pub struct PutCodeToken(u64); +pub struct PutCodeToken(u32); impl Token for PutCodeToken { type Metadata = Schedule; fn calculate_amount(&self, metadata: &Schedule) -> T::Gas { - let code_len_in_gas = >::sa(self.0); metadata .put_code_per_byte_cost - .checked_mul(&code_len_in_gas) + .checked_mul(&self.0.into()) .unwrap_or_else(|| Bounded::max_value()) } } @@ -63,7 +62,7 @@ pub fn save( // The first time instrumentation is on the user. However, consequent reinstrumentation // due to the schedule changes is on governance system. if gas_meter - .charge(schedule, PutCodeToken(original_code.len() as u64)) + .charge(schedule, PutCodeToken(original_code.len() as u32)) .is_out_of_gas() { return Err("there is not enough gas for storing the code"); @@ -72,8 +71,6 @@ pub fn save( let prefab_module = prepare::prepare_contract::(&original_code, schedule)?; let code_hash = T::Hashing::hash(&original_code); - // TODO: #1416 validate the code. If the code is not valid, then don't store it. - >::insert(code_hash, prefab_module); >::insert(code_hash, original_code); diff --git a/srml/contract/src/wasm/env_def/macros.rs b/srml/contract/src/wasm/env_def/macros.rs index 0b112a825858d06b45760ec6c60c67821486fdc5..32d02f5abea76f9bd536377878efb257a26216dc 100644 --- a/srml/contract/src/wasm/env_def/macros.rs +++ b/srml/contract/src/wasm/env_def/macros.rs @@ -167,7 +167,7 @@ macro_rules! register_func { /// will panic if called with unexpected arguments. /// /// It's up to the user of this macro to check signatures of wasm code to be executed -/// and reject the code if any imported function has a mismached signature. +/// and reject the code if any imported function has a mismatched signature. macro_rules! define_env { ( $init_name:ident , < E: $ext_ty:tt > , $( $name:ident ( $ctx:ident $( , $names:ident : $params:ty )* ) @@ -195,7 +195,7 @@ macro_rules! define_env { mod tests { use parity_wasm::elements::FunctionType; use parity_wasm::elements::ValueType; - use runtime_primitives::traits::{As, Zero}; + use runtime_primitives::traits::Zero; use sandbox::{self, ReturnValue, TypedValue}; use crate::wasm::tests::MockExt; use crate::wasm::Runtime; @@ -256,7 +256,7 @@ mod tests { #[test] fn macro_define_func() { define_func!( ext_gas (_ctx, amount: u32) => { - let amount = <::Gas as As>::sa(amount); + let amount = ::Gas::from(amount); if !amount.is_zero() { Ok(()) } else { @@ -308,7 +308,7 @@ mod tests { define_env!(Env, , ext_gas( _ctx, amount: u32 ) => { - let amount = <::Gas as As>::sa(amount); + let amount = ::Gas::from(amount); if !amount.is_zero() { Ok(()) } else { diff --git a/srml/contract/src/wasm/mod.rs b/srml/contract/src/wasm/mod.rs index 51db3b2e5652f7fca6c8dc65bc5f24c0b3b7677b..d86678d383e0955fa0b2364f6d8f876c85ff721b 100644 --- a/srml/contract/src/wasm/mod.rs +++ b/srml/contract/src/wasm/mod.rs @@ -155,8 +155,8 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a, T> { Err(err @ sandbox::Error::Execution) => to_execution_result(runtime, Some(err)), Err(_err @ sandbox::Error::Module) => { // `Error::Module` is returned only if instantiation or linking failed (i.e. - // wasm bianry tried to import a function that is not provided by the host). - // This shouldn't happen because validation proccess ought to reject such binaries. + // wasm binary tried to import a function that is not provided by the host). + // This shouldn't happen because validation process ought to reject such binaries. // // Because panics are really undesirable in the runtime code, we treat this as // a trap for now. Eventually, we might want to revisit this. @@ -177,9 +177,10 @@ mod tests { use crate::exec::{CallReceipt, Ext, InstantiateReceipt, EmptyOutputBuf, StorageKey}; use crate::gas::GasMeter; use crate::tests::{Test, Call}; - use wabt; use crate::wasm::prepare::prepare_contract; use crate::CodeHash; + use wabt; + use hex_literal::hex; #[derive(Debug, PartialEq, Eq)] struct DispatchEntry(Call); @@ -200,12 +201,13 @@ mod tests { #[derive(Default)] pub struct MockExt { storage: HashMap>, + rent_allowance: u64, creates: Vec, transfers: Vec, dispatches: Vec, - events: Vec>, + // (topics, data) + events: Vec<(Vec, Vec)>, next_account_id: u64, - random_seed: H256, } impl Ext for MockExt { type T = Test; @@ -274,12 +276,20 @@ mod tests { &1111 } - fn random_seed(&self) -> &H256{ - &self.random_seed + fn random(&self, subject: &[u8]) -> H256 { + H256::from_slice(subject) + } + + fn deposit_event(&mut self, topics: Vec, data: Vec) { + self.events.push((topics, data)) + } + + fn set_rent_allowance(&mut self, rent_allowance: u64) { + self.rent_allowance = rent_allowance; } - fn deposit_event(&mut self, data: Vec) { - self.events.push(data) + fn rent_allowance(&self) -> u64 { + self.rent_allowance } } @@ -1105,11 +1115,12 @@ mod tests { .unwrap(); } - const CODE_RANDOM_SEED: &str = r#" + const CODE_RANDOM: &str = r#" (module - (import "env" "ext_random_seed" (func $ext_random_seed)) + (import "env" "ext_random" (func $ext_random (param i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1123,7 +1134,10 @@ mod tests { (func (export "call") ;; This stores the block random seed in the scratch buffer - (call $ext_random_seed) + (call $ext_random + (i32.const 40) ;; Pointer in memory to the start of the subject buffer + (i32.const 32) ;; The subject buffer's length + ) ;; assert $ext_scratch_size == 32 (call $assert @@ -1140,59 +1154,71 @@ mod tests { (i32.const 32) ;; Count of bytes to copy. ) - ;; assert the contents of the buffer in 4 x i64 parts matches 1,2,3,4. - (call $assert (i64.eq (i64.load (i32.const 8)) (i64.const 1))) - (call $assert (i64.eq (i64.load (i32.const 16)) (i64.const 2))) - (call $assert (i64.eq (i64.load (i32.const 24)) (i64.const 3))) - (call $assert (i64.eq (i64.load (i32.const 32)) (i64.const 4))) + ;; return the data from the contract + (call $ext_return + (i32.const 8) + (i32.const 32) + ) ) (func (export "deploy")) + + ;; [8,40) is reserved for the result of PRNG. + + ;; the subject used for the PRNG. [40,72) + (data (i32.const 40) + "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F" + "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F" + ) ) "#; #[test] - fn random_seed() { + fn random() { let mut mock_ext = MockExt::default(); - let seed: [u8; 32] = [ - 1,0,0,0,0,0,0,0, - 2,0,0,0,0,0,0,0, - 3,0,0,0,0,0,0,0, - 4,0,0,0,0,0,0,0, - ]; - mock_ext.random_seed = H256::from_slice(&seed); let mut gas_meter = GasMeter::with_limit(50_000, 1); + + let mut return_buf = Vec::new(); execute( - CODE_RANDOM_SEED, + CODE_RANDOM, &[], - &mut Vec::new(), + &mut return_buf, &mut mock_ext, &mut gas_meter, ) .unwrap(); + + // The mock ext just returns the same data that was passed as the subject. + assert_eq!( + &return_buf, + &hex!("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F") + ); } const CODE_DEPOSIT_EVENT: &str = r#" (module - (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32))) + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "call") (call $ext_deposit_event - (i32.const 8) ;; Pointer to the start of encoded call buffer + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 33) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer (i32.const 13) ;; Length of the buffer ) ) (func (export "deploy")) (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 33 bytes. + (data (i32.const 32) "\04\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33" + "\33\33\33\33\33\33\33\33\33") ) "#; #[test] fn deposit_event() { - // This test can fail due to the encoding changes. In case it becomes too annoying - // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); execute( @@ -1203,11 +1229,105 @@ mod tests { &mut gas_meter ) .unwrap(); + + assert_eq!(mock_ext.events, vec![ + (vec![H256::repeat_byte(0x33)], + vec![0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x14, 0x00]) + ]); + assert_eq!(gas_meter.gas_left(), 50_000 - - 4 // Explicit - - 13 - 1 // Deposit event - - 13 // read memory + - 6 // Explicit + - 13 - 1 - 1 // Deposit event + - (13 + 33) // read memory + ); + } + + const CODE_DEPOSIT_EVENT_MAX_TOPICS: &str = r#" +(module + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_deposit_event + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 161) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer + (i32.const 13) ;; Length of the buffer + ) + ) + (func (export "deploy")) + + (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 161 bytes. + (data (i32.const 32) "\14" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02" +"\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03" +"\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04" +"\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05") +) +"#; + + #[test] + fn deposit_event_max_topics() { + // Checks that the runtime traps if there are more than `max_topic_events` topics. + let mut mock_ext = MockExt::default(); + let mut gas_meter = GasMeter::with_limit(50_000, 1); + + assert_eq!( + execute( + CODE_DEPOSIT_EVENT_MAX_TOPICS, + &[], + &mut Vec::new(), + &mut mock_ext, + &mut gas_meter + ), + Err("during execution"), + ); + } + + const CODE_DEPOSIT_EVENT_DUPLICATES: &str = r#" +(module + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_deposit_event + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 129) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer + (i32.const 13) ;; Length of the buffer + ) + ) + (func (export "deploy")) + + (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 129 bytes. + (data (i32.const 32) "\10" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04") +) +"#; + + #[test] + fn deposit_event_duplicates() { + // Checks that the runtime traps if there are duplicates. + let mut mock_ext = MockExt::default(); + let mut gas_meter = GasMeter::with_limit(50_000, 1); + + assert_eq!( + execute( + CODE_DEPOSIT_EVENT_DUPLICATES, + &[], + &mut Vec::new(), + &mut mock_ext, + &mut gas_meter + ), + Err("during execution"), ); - assert_eq!(mock_ext.events, vec![vec![0, 1, 42, 0, 0, 0, 0, 0, 0, 0, 229, 20, 0]]); } } diff --git a/srml/contract/src/wasm/prepare.rs b/srml/contract/src/wasm/prepare.rs index 50edff32971a916da62975a74bf3f23396d64cc0..d780cc1a28328ac6c467fefb7f2094d8988080c0 100644 --- a/srml/contract/src/wasm/prepare.rs +++ b/srml/contract/src/wasm/prepare.rs @@ -26,23 +26,37 @@ use parity_wasm::elements::{self, Internal, External, MemoryType, Type}; use pwasm_utils; use pwasm_utils::rules; use rstd::prelude::*; -use runtime_primitives::traits::As; +use runtime_primitives::traits::{UniqueSaturatedInto, SaturatedConversion}; struct ContractModule<'a, Gas: 'a> { - // An `Option` is used here for loaning (`take()`-ing) the module. - // Invariant: Can't be `None` (i.e. on enter and on exit from the function - // the value *must* be `Some`). + /// A deserialized module. The module is valid (this is Guaranteed by `new` method). + /// + /// An `Option` is used here for loaning (`take()`-ing) the module. + /// Invariant: Can't be `None` (i.e. on enter and on exit from the function + /// the value *must* be `Some`). module: Option, schedule: &'a Schedule, } -impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { +impl<'a, Gas: 'a + From + UniqueSaturatedInto + Clone> ContractModule<'a, Gas> { + /// Creates a new instance of `ContractModule`. + /// + /// Returns `Err` if the `original_code` couldn't be decoded or + /// if it contains an invalid module. fn new( original_code: &[u8], schedule: &'a Schedule, ) -> Result, &'static str> { + use wasmi_validation::{validate_module, PlainValidator}; + let module = - elements::deserialize_buffer(original_code).map_err(|_| "can't decode wasm code")?; + elements::deserialize_buffer(original_code).map_err(|_| "Can't decode wasm code")?; + + // Make sure that the module is valid. + validate_module::(&module).map_err(|_| "Module is not valid")?; + + // Return a `ContractModule` instance with + // __valid__ module. Ok(ContractModule { module: Some(module), schedule, @@ -71,10 +85,10 @@ impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { fn inject_gas_metering(&mut self) -> Result<(), &'static str> { let gas_rules = rules::Set::new( - self.schedule.regular_op_cost.clone().as_(), + self.schedule.regular_op_cost.clone().saturated_into(), Default::default(), ) - .with_grow_cost(self.schedule.grow_mem_cost.clone().as_()) + .with_grow_cost(self.schedule.grow_mem_cost.clone().saturated_into()) .with_forbidden_floats(); let module = self @@ -239,6 +253,12 @@ impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { .get(*type_idx as usize) .ok_or_else(|| "validation: import entry points to a non-existent type")?; + // We disallow importing `ext_println` unless debug features are enabled, + // which should only be allowed on a dev chain + if !self.schedule.enable_println && import.field().as_bytes() == b"ext_println" { + return Err("module imports `ext_println` but debug features disabled"); + } + // We disallow importing `gas` function here since it is treated as implementation detail. if import.field().as_bytes() == b"gas" || !C::can_satisfy(import.field().as_bytes(), func_ty) @@ -264,7 +284,8 @@ impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { /// /// The checks are: /// -/// - module doesn't define an internal memory instance, +/// - provided code is a valid wasm module. +/// - the module doesn't define an internal memory instance, /// - imported memory (if any) doesn't reserve more memory than permitted by the `schedule`, /// - all imported functions from the external environment matches defined by `env` module, /// @@ -297,7 +318,7 @@ pub fn prepare_contract( (initial, Some(maximum)) => MemoryDefinition { initial, maximum }, (_, None) => { // Maximum number of pages should be always declared. - // This isn't a hard requirement and can be treated as a maxiumum set + // This isn't a hard requirement and can be treated as a maximum set // to configured maximum. return Err("Maximum number of pages should be always declared."); } @@ -347,6 +368,8 @@ mod tests { gas(_ctx, _amount: u32) => { unreachable!(); }, nop(_ctx, _unused: u64) => { unreachable!(); }, + + ext_println(_ctx, _ptr: u32, _len: u32) => { unreachable!(); }, ); macro_rules! prepare_test { @@ -430,7 +453,7 @@ mod tests { (func (export "deploy")) ) "#, - Err("Requested initial number of pages should not exceed the requested maximum") + Err("Module is not valid") ); prepare_test!(no_maximum, @@ -479,7 +502,7 @@ mod tests { (func (export "deploy")) ) "#, - Err("Multiple memory imports defined") + Err("Module is not valid") ); prepare_test!(table_import, @@ -497,7 +520,7 @@ mod tests { prepare_test!(global_import, r#" (module - (global $g (import "env" "global") (mut i32)) + (global $g (import "env" "global") i32) (func (export "call")) (func (export "deploy")) ) @@ -572,6 +595,36 @@ mod tests { "#, Err("module imports a non-existent function") ); + + prepare_test!(ext_println_debug_disabled, + r#" + (module + (import "env" "ext_println" (func $ext_println (param i32 i32))) + + (func (export "call")) + (func (export "deploy")) + ) + "#, + Err("module imports `ext_println` but debug features disabled") + ); + + #[test] + fn ext_println_debug_enabled() { + let wasm = wabt::Wat2Wasm::new().validate(false).convert( + r#" + (module + (import "env" "ext_println" (func $ext_println (param i32 i32))) + + (func (export "call")) + (func (export "deploy")) + ) + "# + ).unwrap(); + let mut schedule = Schedule::::default(); + schedule.enable_println = true; + let r = prepare_contract::(wasm.as_ref(), &schedule); + assert_matches!(r, Ok(_)); + } } mod entrypoints { diff --git a/srml/contract/src/wasm/runtime.rs b/srml/contract/src/wasm/runtime.rs index 37ab9fa88708f4514d220ecb7ff4c562aa98f166..873464c5bea0a743577611e23113c93db6978828 100644 --- a/srml/contract/src/wasm/runtime.rs +++ b/srml/contract/src/wasm/runtime.rs @@ -17,14 +17,17 @@ //! Environment definition of the wasm smart-contract runtime. use crate::{Schedule, Trait, CodeHash, ComputeDispatchFee, BalanceOf}; -use crate::exec::{Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey}; +use crate::exec::{ + Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey, + TopicOf, +}; use crate::gas::{GasMeter, Token, GasMeterResult, approx_gas_for_balance}; use sandbox; use system; use rstd::prelude::*; use rstd::mem; use parity_codec::{Decode, Encode}; -use runtime_primitives::traits::{As, CheckedMul, CheckedAdd, Bounded}; +use runtime_primitives::traits::{CheckedMul, CheckedAdd, Bounded, SaturatedConversion}; /// Enumerates all possible *special* trap conditions. /// @@ -108,9 +111,9 @@ pub enum RuntimeToken { ReturnData(u32), /// Dispatch fee calculated by `T::ComputeDispatchFee`. ComputedDispatchFee(Gas), - /// The given number of bytes is read from the sandbox memory and - /// deposit in as an event. - DepositEvent(u32), + /// (topic_count, data_bytes): A buffer of the given size is posted as an event indexed with the + /// given number of topics. + DepositEvent(u32, u32), } impl Token for RuntimeToken { @@ -119,20 +122,35 @@ impl Token for RuntimeToken { fn calculate_amount(&self, metadata: &Schedule) -> T::Gas { use self::RuntimeToken::*; let value = match *self { - Explicit(amount) => Some(>::sa(amount)), + Explicit(amount) => Some(amount.into()), ReadMemory(byte_count) => metadata .sandbox_data_read_cost - .checked_mul(&>::sa(byte_count)), + .checked_mul(&byte_count.into()), WriteMemory(byte_count) => metadata .sandbox_data_write_cost - .checked_mul(&>::sa(byte_count)), + .checked_mul(&byte_count.into()), ReturnData(byte_count) => metadata .return_data_per_byte_cost - .checked_mul(&>::sa(byte_count)), - DepositEvent(byte_count) => metadata - .event_data_per_byte_cost - .checked_mul(&>::sa(byte_count)) - .and_then(|e| e.checked_add(&metadata.event_data_base_cost)), + .checked_mul(&byte_count.into()), + DepositEvent(topic_count, data_byte_count) => { + let data_cost = metadata + .event_data_per_byte_cost + .checked_mul(&data_byte_count.into()); + + let topics_cost = metadata + .event_per_topic_cost + .checked_mul(&topic_count.into()); + + data_cost + .and_then(|data_cost| { + topics_cost.and_then(|topics_cost| { + data_cost.checked_add(&topics_cost) + }) + }) + .and_then(|data_and_topics_cost| + data_and_topics_cost.checked_add(&metadata.event_base_cost) + ) + }, ComputedDispatchFee(gas) => Some(gas), }; @@ -322,7 +340,7 @@ define_env!(Env, , let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() } else { - <::Gas as As>::sa(gas) + gas.saturated_into() }; let ext = &mut ctx.ext; let call_outcome = ctx.gas_meter.with_nested(nested_gas_limit, |nested_meter| { @@ -395,7 +413,7 @@ define_env!(Env, , let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() } else { - <::Gas as As>::sa(gas) + gas.saturated_into() }; let ext = &mut ctx.ext; let instantiate_outcome = ctx.gas_meter.with_nested(nested_gas_limit, |nested_meter| { @@ -509,16 +527,25 @@ define_env!(Env, , Ok(()) }, - // Load the latest block RNG seed into the scratch buffer - ext_random_seed(ctx) => { - ctx.scratch_buf = ctx.ext.random_seed().encode(); + // Stores the random number for the current block for the given subject into the scratch + // buffer. + // + // The data is encoded as T::Hash. The current contents of the scratch buffer are + // overwritten. + ext_random(ctx, subject_ptr: u32, subject_len: u32) => { + // The length of a subject can't exceed `max_subject_len`. + if subject_len > ctx.schedule.max_subject_len { + return Err(sandbox::HostError); + } + + let subject_buf = read_sandbox_memory(ctx, subject_ptr, subject_len)?; + ctx.scratch_buf = ctx.ext.random(&subject_buf).encode(); Ok(()) }, // Load the latest block timestamp into the scratch buffer ext_now(ctx) => { - let now: u64 = As::as_(ctx.ext.now().clone()); - ctx.scratch_buf = now.encode(); + ctx.scratch_buf = ctx.ext.now().encode(); Ok(()) }, @@ -610,22 +637,102 @@ define_env!(Env, , Ok(()) }, - // Deposit a contract event with the data buffer. - ext_deposit_event(ctx, data_ptr: u32, data_len: u32) => { + // Deposit a contract event with the data buffer and optional list of topics. There is a limit + // on the maximum number of topics specified by `max_event_topics`. + // + // - topics_ptr - a pointer to the buffer of topics encoded as `Vec`. The value of this + // is ignored if `topics_len` is set to 0. The topics list can't contain duplicates. + // - topics_len - the length of the topics buffer. Pass 0 if you want to pass an empty vector. + // - data_ptr - a pointer to a raw data buffer which will saved along the event. + // - data_len - the length of the data buffer. + ext_deposit_event(ctx, topics_ptr: u32, topics_len: u32, data_ptr: u32, data_len: u32) => { + let mut topics = match topics_len { + 0 => Vec::new(), + _ => { + let topics_buf = read_sandbox_memory(ctx, topics_ptr, topics_len)?; + Vec::::T>>::decode(&mut &topics_buf[..]) + .ok_or_else(|| sandbox::HostError)? + } + }; + + // If there are more than `max_event_topics`, then trap. + if topics.len() > ctx.schedule.max_event_topics as usize { + return Err(sandbox::HostError); + } + + // Check for duplicate topics. If there are any, then trap. + if has_duplicates(&mut topics) { + return Err(sandbox::HostError); + } + + let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; + match ctx .gas_meter .charge( ctx.schedule, - RuntimeToken::DepositEvent(data_len) + RuntimeToken::DepositEvent(topics.len() as u32, data_len) ) { GasMeterResult::Proceed => (), GasMeterResult::OutOfGas => return Err(sandbox::HostError), } + ctx.ext.deposit_event(topics, event_data); - let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; - ctx.ext.deposit_event(event_data); + Ok(()) + }, + + // Set rent allowance of the contract + // + // - value_ptr: a pointer to the buffer with value, how much to allow for rent + // Should be decodable as a `T::Balance`. Traps otherwise. + // - value_len: length of the value buffer. + ext_set_rent_allowance(ctx, value_ptr: u32, value_len: u32) => { + let value = { + let value_buf = read_sandbox_memory(ctx, value_ptr, value_len)?; + BalanceOf::<::T>::decode(&mut &value_buf[..]) + .ok_or_else(|| sandbox::HostError)? + }; + ctx.ext.set_rent_allowance(value); Ok(()) }, + + // Stores the rent allowance into the scratch buffer. + // + // The data is encoded as T::Balance. The current contents of the scratch buffer are overwritten. + ext_rent_allowance(ctx) => { + ctx.scratch_buf = ctx.ext.rent_allowance().encode(); + + Ok(()) + }, + + // Prints utf8 encoded string from the data buffer. + // Only available on `--dev` chains. + // This function may be removed at any time, superseded by a more general contract debugging feature. + ext_println(ctx, str_ptr: u32, str_len: u32) => { + let data = read_sandbox_memory(ctx, str_ptr, str_len)?; + if let Ok(utf8) = core::str::from_utf8(&data) { + runtime_io::print(utf8); + } + Ok(()) + }, ); + +/// Finds duplicates in a given vector. +/// +/// This function has complexity of O(n log n) and no additional memory is required, although +/// the order of items is not preserved. +fn has_duplicates>(items: &mut Vec) -> bool { + // Sort the vector + items.sort_unstable_by(|a, b| { + Ord::cmp(a.as_ref(), b.as_ref()) + }); + // And then find any two consecutive equal elements. + items.windows(2).any(|w| { + match w { + &[ref a, ref b] => a == b, + _ => false, + } + }) +} diff --git a/srml/council/Cargo.toml b/srml/council/Cargo.toml index 87de0ae0d1f1f29b67af98716ee3964d2a05f27b..c180846b8e969dfde3e126ae5840ef12b7c59db2 100644 --- a/srml/council/Cargo.toml +++ b/srml/council/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-council" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -17,7 +17,7 @@ democracy = { package = "srml-democracy", path = "../democracy", default-feature system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -hex-literal = "0.1.0" +hex-literal = "0.2.0" balances = { package = "srml-balances", path = "../balances" } [features] diff --git a/srml/council/src/motions.rs b/srml/council/src/motions.rs index 3bbe463780c46f910947209e0b45e66f23391e74..e560fadb9c5a49a5a34e7b5b9d45932a480d868c 100644 --- a/srml/council/src/motions.rs +++ b/srml/council/src/motions.rs @@ -205,7 +205,7 @@ mod tests { use crate::tests::{Call, Origin, Event as OuterEvent}; use srml_support::{Hashable, assert_ok, assert_noop}; use system::{EventRecord, Phase}; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; #[test] fn motions_basic_environment_works() { @@ -234,7 +234,8 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)), + topics: vec![], } ]); }); @@ -287,11 +288,13 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(1, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 0, 1)) + event: OuterEvent::motions(RawEvent::Voted(1, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 0, 1)), + topics: vec![], } ]); }); @@ -309,15 +312,18 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 1, 1)) + event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 1, 1)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Disapproved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())) + event: OuterEvent::motions(RawEvent::Disapproved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())), + topics: vec![], } ]); }); @@ -335,19 +341,23 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)) + event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), true, 2, 0)) + event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), true, 2, 0)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Approved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())) + event: OuterEvent::motions(RawEvent::Approved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Executed(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false)) + event: OuterEvent::motions(RawEvent::Executed(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false)), + topics: vec![], } ]); }); diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 9ace6227da636a3aecdb0b1fb5031e120edb6dd0..fb93157981643dd055f2982fba061a316aac6543 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -17,7 +17,7 @@ //! Council system: Handles the voting in and maintenance of council members. use rstd::prelude::*; -use primitives::traits::{Zero, One, As, StaticLookup}; +use primitives::traits::{Zero, One, StaticLookup}; use runtime_io::print; use srml_support::{ StorageValue, StorageMap, dispatch::Result, decl_storage, decl_event, ensure, @@ -230,7 +230,7 @@ decl_module! { let (_, _, expiring) = Self::next_finalize().ok_or("cannot present outside of presentation period")?; let stakes = Self::snapshoted_stakes(); let voters = Self::voters(); - let bad_presentation_punishment = Self::present_slash_per_voter() * BalanceOf::::sa(voters.len() as u64); + let bad_presentation_punishment = Self::present_slash_per_voter() * BalanceOf::::from(voters.len() as u32); ensure!(T::Currency::can_slash(&who, bad_presentation_punishment), "presenter must have sufficient slashable funds"); let mut leaderboard = Self::leaderboard().ok_or("leaderboard must exist while present phase active")?; @@ -313,22 +313,22 @@ decl_storage! { // parameters /// How much should be locked up in order to submit one's candidacy. - pub CandidacyBond get(candidacy_bond) config(): BalanceOf = BalanceOf::::sa(9); + pub CandidacyBond get(candidacy_bond) config(): BalanceOf = 9.into(); /// How much should be locked up in order to be able to submit votes. pub VotingBond get(voting_bond) config(voter_bond): BalanceOf; /// The punishment, per voter, if you provide an invalid presentation. - pub PresentSlashPerVoter get(present_slash_per_voter) config(): BalanceOf = BalanceOf::::sa(1); + pub PresentSlashPerVoter get(present_slash_per_voter) config(): BalanceOf = 1.into(); /// How many runners-up should have their approvals persist until the next vote. pub CarryCount get(carry_count) config(): u32 = 2; /// How long to give each top candidate to present themselves after the vote ends. - pub PresentationDuration get(presentation_duration) config(): T::BlockNumber = T::BlockNumber::sa(1000); + pub PresentationDuration get(presentation_duration) config(): T::BlockNumber = 1000.into(); /// How many vote indexes need to go by after a target voter's last vote before they can be reaped if their /// approvals are moot. pub InactiveGracePeriod get(inactivity_grace_period) config(inactive_grace_period): VoteIndex = 1; /// How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period) config(approval_voting_period): T::BlockNumber = T::BlockNumber::sa(1000); + pub VotingPeriod get(voting_period) config(approval_voting_period): T::BlockNumber = 1000.into(); /// How long each position is active for. - pub TermDuration get(term_duration) config(): T::BlockNumber = T::BlockNumber::sa(5); + pub TermDuration get(term_duration) config(): T::BlockNumber = 5.into(); /// Number of accounts that should be sitting on the council. pub DesiredSeats get(desired_seats) config(): u32; diff --git a/srml/council/src/voting.rs b/srml/council/src/voting.rs index 37c1444a74ee8c2f48e94fee5f94dfc20d7f6a4e..0137cd6d2fc075641bee3c54f0c786a931587a73 100644 --- a/srml/council/src/voting.rs +++ b/srml/council/src/voting.rs @@ -18,7 +18,7 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -use primitives::traits::{Hash, As, Zero}; +use primitives::traits::{Hash, Zero}; use runtime_io::print; use srml_support::dispatch::Result; use srml_support::{StorageValue, StorageMap, IsSubType, decl_module, decl_storage, decl_event, ensure}; @@ -113,10 +113,10 @@ decl_module! { decl_storage! { trait Store for Module as CouncilVoting { - pub CooloffPeriod get(cooloff_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); - pub VotingPeriod get(voting_period) config(): T::BlockNumber = T::BlockNumber::sa(3); + pub CooloffPeriod get(cooloff_period) config(): T::BlockNumber = 1000.into(); + pub VotingPeriod get(voting_period) config(): T::BlockNumber = 3.into(); /// Number of blocks by which to delay enactment of successful, non-unanimous-council-instigated referendum proposals. - pub EnactDelayPeriod get(enact_delay_period) config(): T::BlockNumber = T::BlockNumber::sa(0); + pub EnactDelayPeriod get(enact_delay_period) config(): T::BlockNumber = 0.into(); pub Proposals get(proposals) build(|_| vec![]): Vec<(T::BlockNumber, T::Hash)>; // ordered by expiry. pub ProposalOf get(proposal_of): map T::Hash => Option; pub ProposalVoters get(proposal_voters): map T::Hash => Vec; @@ -270,7 +270,7 @@ mod tests { System::set_block_number(1); let proposal = set_balance_proposal(42); assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); + assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256().into(); @@ -282,7 +282,7 @@ mod tests { System::set_block_number(2); assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![]); + assert_eq!(Democracy::active_referenda(), vec![]); assert_eq!(Balances::free_balance(&42), 0); }); } @@ -303,7 +303,7 @@ mod tests { System::set_block_number(2); assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); + assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); }); } @@ -322,7 +322,7 @@ mod tests { System::set_block_number(2); assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); + assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); }); } @@ -335,7 +335,7 @@ mod tests { assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); + assert_eq!(Democracy::active_referenda().len(), 0); }); } @@ -386,7 +386,7 @@ mod tests { System::set_block_number(4); assert_ok!(CouncilVoting::end_block(System::block_number())); assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(7, set_balance_proposal(42), VoteThreshold::SimpleMajority, 0))]); + assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(7, set_balance_proposal(42), VoteThreshold::SimpleMajority, 0))]); }); } @@ -403,7 +403,7 @@ mod tests { assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); assert_ok!(CouncilVoting::veto(Origin::signed(3), hash)); assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); + assert_eq!(Democracy::active_referenda().len(), 0); }); } @@ -433,7 +433,7 @@ mod tests { System::set_block_number(2); assert_ok!(CouncilVoting::end_block(System::block_number())); assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); + assert_eq!(Democracy::active_referenda().len(), 0); }); } @@ -451,7 +451,7 @@ mod tests { System::set_block_number(2); assert_ok!(CouncilVoting::end_block(System::block_number())); assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SuperMajorityAgainst, 0))]); + assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SuperMajorityAgainst, 0))]); }); } @@ -469,7 +469,7 @@ mod tests { System::set_block_number(2); assert_ok!(CouncilVoting::end_block(System::block_number())); assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SimpleMajority, 0))]); + assert_eq!(Democracy::active_referenda(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SimpleMajority, 0))]); }); } diff --git a/srml/democracy/Cargo.toml b/srml/democracy/Cargo.toml index 0e514cd2df1701d26e9468af8195994dc44f79b3..88d1da1a8cb24008e61a87d3b39323b0f1bd4460 100644 --- a/srml/democracy/Cargo.toml +++ b/srml/democracy/Cargo.toml @@ -1,13 +1,11 @@ [package] name = "srml-democracy" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -24,7 +22,6 @@ balances = { package = "srml-balances", path = "../balances" } default = ["std"] std = [ "serde", - "serde_derive", "safe-mix/std", "parity-codec/std", "rstd/std", diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 4bd7ad60aa1b6fe11cc7c0a346c49aad1b19bd08..c2a9b849f616f1018cfaf7f74b336bb2371da7d9 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -20,7 +20,7 @@ use rstd::prelude::*; use rstd::result; -use primitives::traits::{Zero, As, Bounded}; +use primitives::traits::{Zero, Bounded}; use parity_codec::{Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap}; use srml_support::{decl_module, decl_storage, decl_event, ensure}; @@ -196,7 +196,7 @@ decl_module! { // Indefinite lock is reduced to the maximum voting lock that could be possible. let lock_period = Self::public_delay(); let now = >::block_number(); - let locked_until = now + lock_period * T::BlockNumber::sa(d.1 as u64); + let locked_until = now + lock_period * (d.1 as u32).into(); T::Currency::set_lock(DEMOCRACY_ID, &who, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); Self::deposit_event(RawEvent::Undelegated(who)); } @@ -234,7 +234,7 @@ decl_storage! { /// Those who have locked a deposit. pub DepositOf get(deposit_of): map PropIndex => Option<(BalanceOf, Vec)>; /// How often (in blocks) new public referenda are launched. - pub LaunchPeriod get(launch_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); + pub LaunchPeriod get(launch_period) config(): T::BlockNumber = 1000.into(); /// The minimum amount to be used as a deposit for a public referendum proposal. pub MinimumDeposit get(minimum_deposit) config(): BalanceOf; /// The delay before enactment for all public referenda. @@ -243,9 +243,9 @@ decl_storage! { pub MaxLockPeriods get(max_lock_periods) config(): LockPeriods; /// How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); + pub VotingPeriod get(voting_period) config(): T::BlockNumber = 1000.into(); - /// The next free referendum index, aka the number of referendums started so far. + /// The next free referendum index, aka the number of referenda started so far. pub ReferendumCount get(referendum_count) build(|_| 0 as ReferendumIndex): ReferendumIndex; /// The next referendum index that should be tallied. pub NextTally get(next_tally) build(|_| 0 as ReferendumIndex): ReferendumIndex; @@ -290,7 +290,7 @@ impl Module { /// Get the amount locked in support of `proposal`; `None` if proposal isn't a valid proposal /// index. pub fn locked_for(proposal: PropIndex) -> Option> { - Self::deposit_of(proposal).map(|(d, l)| d * BalanceOf::::sa(l.len() as u64)) + Self::deposit_of(proposal).map(|(d, l)| d * (l.len() as u32).into()) } /// Return true if `ref_index` is an on-going referendum. @@ -298,8 +298,8 @@ impl Module { >::exists(ref_index) } - /// Get all referendums currently active. - pub fn active_referendums() -> Vec<(ReferendumIndex, ReferendumInfo)> { + /// Get all referenda currently active. + pub fn active_referenda() -> Vec<(ReferendumIndex, ReferendumInfo)> { let next = Self::next_tally(); let last = Self::referendum_count(); (next..last).into_iter() @@ -307,8 +307,8 @@ impl Module { .collect() } - /// Get all referendums ready for tally at block `n`. - pub fn maturing_referendums_at(n: T::BlockNumber) -> Vec<(ReferendumIndex, ReferendumInfo)> { + /// Get all referenda ready for tally at block `n`. + pub fn maturing_referenda_at(n: T::BlockNumber) -> Vec<(ReferendumIndex, ReferendumInfo)> { let next = Self::next_tally(); let last = Self::referendum_count(); (next..last).into_iter() @@ -325,9 +325,9 @@ impl Module { )) .map(|(bal, vote)| if vote.is_aye() { - (bal * BalanceOf::::sa(vote.multiplier() as u64), Zero::zero(), bal) + (bal * (vote.multiplier() as u32).into(), Zero::zero(), bal) } else { - (Zero::zero(), bal * BalanceOf::::sa(vote.multiplier() as u64), bal) + (Zero::zero(), bal * (vote.multiplier() as u32).into(), bal) } ).fold((Zero::zero(), Zero::zero(), Zero::zero()), |(a, b, c), (d, e, f)| (a + d, b + e, c + f)); let (del_approve, del_against, del_capital) = Self::tally_delegation(ref_index); @@ -361,7 +361,7 @@ impl Module { .fold((Zero::zero(), Zero::zero()), |(votes_acc, balance_acc), (delegator, (_delegate, periods))| { let lock_periods = if min_lock_periods <= periods { min_lock_periods } else { periods }; let balance = T::Currency::total_balance(&delegator); - let votes = T::Currency::total_balance(&delegator) * BalanceOf::::sa(lock_periods as u64); + let votes = T::Currency::total_balance(&delegator) * (lock_periods as u32).into(); let (del_votes, del_balance) = Self::delegated_votes(ref_index, delegator, lock_periods, recursion_limit - 1); (votes_acc + votes + del_votes, balance_acc + balance + del_balance) }) @@ -469,7 +469,7 @@ impl Module { { // now plus: the base lock period multiplied by the number of periods this voter offered to // lock should they win... - let locked_until = now + lock_period * T::BlockNumber::sa((vote.multiplier()) as u64); + let locked_until = now + lock_period * (vote.multiplier() as u32).into(); // ...extend their bondage until at least then. T::Currency::extend_lock(DEMOCRACY_ID, &a, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); } @@ -498,7 +498,7 @@ impl Module { } // tally up votes for any expiring referenda. - for (index, info) in Self::maturing_referendums_at(now).into_iter() { + for (index, info) in Self::maturing_referenda_at(now).into_iter() { Self::bake_referendum(now.clone(), index, info)?; } diff --git a/srml/democracy/src/vote_threshold.rs b/srml/democracy/src/vote_threshold.rs index 5d9b2b742e679e5a8c58ad39c64c717023e5d937..ee42363d47f819d090eb8f8f9bbde0f143cbfc97 100644 --- a/srml/democracy/src/vote_threshold.rs +++ b/srml/democracy/src/vote_threshold.rs @@ -17,7 +17,7 @@ //! Voting thresholds. #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use parity_codec::{Encode, Decode}; use primitives::traits::{Zero, IntegerSquareRoot}; use rstd::ops::{Add, Mul, Div, Rem}; diff --git a/srml/example/Cargo.toml b/srml/example/Cargo.toml index c62b61f7b33a571faace253e8eabbd186aa103b1..7601a799f81c72564de689121f2b649b3083b734 100644 --- a/srml/example/Cargo.toml +++ b/srml/example/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-example" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false } srml-support = { path = "../support", default-features = false } diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 8ba83bfd88d51583b5c3b2424b712f4866b190ab..33c023ee8a669e3eed5a7d3798179c48895c0935 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -14,8 +14,237 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +//! # Example Module +//! +//! //! The Example: A simple example of a runtime module demonstrating //! concepts, APIs and structures common to most runtime modules. +//! +//! Run `cargo doc --package srml-example --open` to view this module's documentation. +//! +//! ### Documentation Guidelines: +//! +//! +//! +//!
    +//!
  • Documentation comments (i.e. /// comment) - should accompany module functions and be +//! restricted to the module interface, not the internals of the module implementation. Only state inputs, +//! outputs, and a brief description that mentions whether calling it requires root, but without repeating +//! the source code details. Capitalise the first word of each documentation comment and end it with a full +//! stop. See Generic example of annotating source code with documentation comments
  • +//!
  • Self-documenting code - Try to refactor code to be self-documenting.
  • +//!
  • Code comments - Supplement complex code with a brief explanation, not every line of code.
  • +//!
  • Identifiers - surround by backticks (i.e. INHERENT_IDENTIFIER, InherentType, +//! u64)
  • +//!
  • Usage scenarios - should be simple doctests. The compiler should ensure they stay valid.
  • +//!
  • Extended tutorials - should be moved to external files and refer to.
  • +//! +//!
  • Mandatory - include all of the sections/subsections where MUST is specified.
  • +//!
  • Optional - optionally include sections/subsections where CAN is specified.
  • +//!
+//! +//! ### Documentation Template:
+//! +//! Copy and paste this template from srml/example/src/lib.rs into file srml//src/lib.rs of +//! your own custom module and complete it. +//!

+//! // Add heading with custom module name
+//!
+//! \#  Module
+//!
+//! // Add simple description
+//!
+//! // Include the following links that shows what trait needs to be implemented to use the module
+//! // and the supported dispatchables that are documented in the Call enum.
+//!
+//! - \[`::Trait`](./trait.Trait.html)
+//! - \[`Call`](./enum.Call.html)
+//! - \[`Module`](./struct.Module.html)
+//!
+//! \## Overview
+//!
+//!  
+//! // Short description of module purpose.
+//! // Links to Traits that should be implemented.
+//! // What this module is for.
+//! // What functionality the module provides.
+//! // When to use the module (use case examples).
+//! // How it is used.
+//! // Inputs it uses and the source of each input.
+//! // Outputs it produces.
+//!
+//! 
+//! 
+//!
+//! \## Terminology
+//!
+//! // Add terminology used in the custom module. Include concepts, storage items, or actions that you think
+//! // deserve to be noted to give context to the rest of the documentation or module usage. The author needs to
+//! // use some judgment about what is included. We don't want a list of every storage item nor types - the user
+//! // can go to the code for that. For example, "transfer fee" is obvious and should not be included, but
+//! // "free balance" and "reserved balance" should be noted to give context to the module.
+//! // Please do not link to outside resources. The reference docs should be the ultimate source of truth.
+//!
+//! 
+//!
+//! \## Goals
+//!
+//! // Add goals that the custom module is designed to achieve.
+//!
+//! 
+//!
+//! \### Scenarios
+//!
+//! 
+//!
+//! \#### 
+//!
+//! // Describe requirements prior to interacting with the custom module.
+//! // Describe the process of interacting with the custom module for this scenario and public API functions used.
+//!
+//! \## Interface
+//!
+//! \### Supported Origins
+//!
+//! // What origins are used and supported in this module (root, signed, none)
+//! // i.e. root when \`ensure_root\` used
+//! // i.e. none when \`ensure_none\` used
+//! // i.e. signed when \`ensure_signed\` used
+//!
+//! \`inherent\` 
+//!
+//! 
+//! 
+//!
+//! \### Types
+//!
+//! // Type aliases. Include any associated types and where the user would typically define them.
+//!
+//! \`ExampleType\` 
+//!
+//! 
+//!
+//! // Reference documentation of aspects such as `storageItems` and `dispatchable` functions should only be
+//! // included in the https://docs.rs Rustdocs for Substrate and not repeated in the README file.
+//!
+//! \### Dispatchable Functions
+//!
+//! 
+//!
+//! // A brief description of dispatchable functions and a link to the rustdoc with their actual documentation.
+//!
+//! // MUST have link to Call enum
+//! // MUST have origin information included in function doc
+//! // CAN have more info up to the user
+//!
+//! \### Public Functions
+//!
+//! 
+//!
+//! // A link to the rustdoc and any notes about usage in the module, not for specific functions.
+//! // For example, in the balances module: "Note that when using the publicly exposed functions,
+//! // you (the runtime developer) are responsible for implementing any necessary checks
+//! // (e.g. that the sender is the signer) before calling a function that will affect storage."
+//!
+//! 
+//!
+//! // It is up to the writer of the respective module (with respect to how much information to provide).
+//!
+//! \#### Public Inspection functions - Immutable (getters)
+//!
+//! // Insert a subheading for each getter function signature
+//!
+//! \##### \`example_getter_name()\`
+//!
+//! // What it returns
+//! // Why, when, and how often to call it
+//! // When it could panic or error
+//! // When safety issues to consider
+//!
+//! \#### Public Mutable functions (changing state)
+//!
+//! // Insert a subheading for each setter function signature
+//!
+//! \##### \`example_setter_name(origin, parameter_name: T::ExampleType)\`
+//!
+//! // What state it changes
+//! // Why, when, and how often to call it
+//! // When it could panic or error
+//! // When safety issues to consider
+//! // What parameter values are valid and why
+//!
+//! \### Storage Items
+//!
+//! // Explain any storage items included in this module
+//!
+//! \### Digest Items
+//!
+//! // Explain any digest items included in this module
+//!
+//! \### Inherent Data
+//!
+//! // Explain what inherent data (if any) is defined in the module and any other related types
+//!
+//! \### Events:
+//!
+//! // Insert events for this module if any
+//!
+//! \### Errors:
+//!
+//! // Explain what generates errors
+//!
+//! \## Usage
+//!
+//! // Insert 2-3 examples of usage and code snippets that show how to use  module in a custom module.
+//!
+//! \### Prerequisites
+//!
+//! // Show how to include necessary imports for  and derive
+//! // your module configuration trait with the `INSERT_CUSTOM_MODULE_NAME` trait.
+//!
+//! \```rust
+//! use ;
+//! 
+//! pub trait Trait: ::Trait { }
+//! \```
+//!
+//! \### Simple Code Snippet
+//!
+//! // Show a simple example (e.g. how to query a public getter function of )
+//!
+//! \### Example from SRML
+//!
+//! // Show a usage example in an actual runtime
+//!
+//! // See:
+//! // - Substrate TCR https://github.com/parity-samples/substrate-tcr
+//! // - Substrate Kitties https://shawntabrizi.github.io/substrate-collectables-workshop/#/
+//!
+//! \## Genesis Config
+//!
+//! 
+//!
+//! \## Dependencies
+//!
+//! // Dependencies on other SRML modules and the genesis config should be mentioned,
+//! // but not the Rust Standard Library.
+//! // Genesis configuration modifications that may be made to incorporate this module
+//! // Interaction with other modules
+//!
+//! 
+//!
+//! \## Related Modules
+//!
+//! // Interaction with other modules in the form of a bullet point list
+//!
+//! \## References
+//!
+//! 
+//!
+//! // Links to reference material, if applicable. For example, Phragmen, W3F research, etc.
+//! // that the implementation is based on.
+//! 

// Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] @@ -93,7 +322,9 @@ decl_event!( // Generally you'll want to split these into three groups: // - Public calls that are signed by an external account. // - Root calls that are allowed to be made only by the governance system. -// - Inherent calls that are allowed to be made only by the block authors and validators. +// - Unsigned calls that can be of two kinds: +// * "Inherent extrinsics" that are opinions generally held by the block authors that build child blocks. +// * Unsigned Transactions that are of intrinsic recognisable utility to the network, and are validated by the runtime. // // Information about where this dispatch initiated from is provided as the first argument // "origin". As such functions must always look like: @@ -108,10 +339,10 @@ decl_event!( // `fn foo(origin: T::Origin, bar: Bar, baz: Baz) { ... }` // // There are three entries in the `system::Origin` enum that correspond -// to the above bullets: `::Signed(AccountId)`, `::Root` and `::Inherent`. You should always match +// to the above bullets: `::Signed(AccountId)`, `::Root` and `::None`. You should always match // against them as the first thing you do in your function. There are three convenience calls // in system that do the matching for you and return a convenient result: `ensure_signed`, -// `ensure_root` and `ensure_inherent`. +// `ensure_root` and `ensure_none`. decl_module! { // Simple declaration of the `Module` type. Lets the macro know what its working on. pub struct Module for enum Call where origin: T::Origin { @@ -219,7 +450,7 @@ decl_module! { // For instance you can generate extrinsics for the upcoming produced block. fn offchain_worker(_n: T::BlockNumber) { // We don't do anything here. - // but we could dispatch extrinsic (transaction/inherent) using + // but we could dispatch extrinsic (transaction/unsigned/inherent) using // runtime_io::submit_extrinsic } } diff --git a/srml/executive/Cargo.toml b/srml/executive/Cargo.toml index 0526e86ca951c05cdc896886e9f463d860143e2d..7089a2aa9b973b363705041792c54d1bf985206d 100644 --- a/srml/executive/Cargo.toml +++ b/srml/executive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-executive" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -14,7 +14,7 @@ srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } [dev-dependencies] -hex-literal = "0.1.0" +hex-literal = "0.2.0" substrate-primitives = { path = "../../core/primitives" } srml-indices = { path = "../indices" } balances = { package = "srml-balances", path = "../balances" } diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 4c5595dc5e5cab1c663612fc6d482eaebffbf87f..33d26ce42f8a98e40b521f3787001e18fcfece5c 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -14,7 +14,63 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Executive: Handles all of the top-level stuff; essentially just executing blocks/extrinsics. +//! # Executive Module +//! +//! The Executive module acts as the orchestration layer for the runtime. It dispatches incoming +//! extrinsic calls to the respective modules in the runtime. +//! +//! ## Overview +//! +//! The executive module is not a typical SRML module providing functionality around a specific feature. +//! It is a cross-cutting framework component for the SRML. It works in conjunction with the +//! [SRML System module](../srml_system/index.html) to perform these cross-cutting functions. +//! +//! The Executive module provides functions to: +//! +//! - Check transaction validity. +//! - Initialize a block. +//! - Apply extrinsics. +//! - Execute a block. +//! - Finalize a block. +//! - Start an off-chain worker. +//! +//! ### Implementations +//! +//! The Executive module provides the following implementations: +//! +//! - `ExecuteBlock`: Trait that can be used to execute a block. +//! - `Executive`: Type that can be used to make the SRML available from the runtime. +//! +//! ## Usage +//! +//! The default Substrate node template declares the [`Executive`](./struct.Executive.html) type in its library. +//! +//! ### Example +//! +//! `Executive` type declaration from the node template. +//! +//! ``` +//! # use primitives::generic; +//! # use srml_executive as executive; +//! # pub struct UncheckedExtrinsic {}; +//! # pub struct Header {}; +//! # type Context = system::ChainContext; +//! # pub type Block = generic::Block; +//! # pub type Balances = u64; +//! # pub type AllModules = u64; +//! # pub enum Runtime {}; +//! # use primitives::transaction_validity::TransactionValidity; +//! # use primitives::traits::ValidateUnsigned; +//! # impl ValidateUnsigned for Runtime { +//! # type Call = (); +//! # +//! # fn validate_unsigned(_call: &Self::Call) -> TransactionValidity { +//! # TransactionValidity::Invalid(0) +//! # } +//! # } +//! /// Executive: handles dispatch to the various modules. +//! pub type Executive = executive::Executive; +//! ``` #![cfg_attr(not(feature = "std"), no_std)] @@ -23,7 +79,8 @@ use rstd::marker::PhantomData; use rstd::result; use primitives::traits::{ self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize, - OnInitialize, As, Digest, NumberFor, Block as BlockT, OffchainWorker + OnInitialize, Digest, NumberFor, Block as BlockT, OffchainWorker, + ValidateUnsigned, }; use srml_support::{Dispatchable, traits::MakePayment}; use parity_codec::{Codec, Encode}; @@ -48,14 +105,14 @@ mod internal { } } -/// Something that can be used to execute a block. +/// Trait that can be used to execute a block. pub trait ExecuteBlock { - /// Actually execute all transitioning for `block`. + /// Actually execute all transitions for `block`. fn execute_block(block: Block); } -pub struct Executive( - PhantomData<(System, Block, Context, Payment, AllModules)> +pub struct Executive( + PhantomData<(System, Block, Context, Payment, UnsignedValidator, AllModules)> ); impl< @@ -63,15 +120,18 @@ impl< Block: traits::Block, Context: Default, Payment: MakePayment, + UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> ExecuteBlock for Executive where +> ExecuteBlock for Executive +where Block::Extrinsic: Checkable + Codec, >::Checked: Applyable, <>::Checked as Applyable>::Call: Dispatchable, - <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From> + <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From>, + UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call> { fn execute_block(block: Block) { - Executive::::execute_block(block); + Executive::::execute_block(block); } } @@ -80,12 +140,15 @@ impl< Block: traits::Block, Context: Default, Payment: MakePayment, + UnsignedValidator, AllModules: OnInitialize + OnFinalize + OffchainWorker, -> Executive where +> Executive +where Block::Extrinsic: Checkable + Codec, >::Checked: Applyable, <>::Checked as Applyable>::Call: Dispatchable, - <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From> + <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From>, + UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call> { /// Start the execution of a particular block. pub fn initialize_block(header: &System::Header) { @@ -100,20 +163,20 @@ impl< fn initial_checks(block: &Block) { let header = block.header(); - // check parent_hash is correct. + // Check that `parent_hash` is correct. let n = header.number().clone(); assert!( n > System::BlockNumber::zero() && >::block_hash(n - System::BlockNumber::one()) == *header.parent_hash(), "Parent hash should be valid." ); - // check transaction trie root represents the transactions. + // Check that transaction trie root represents the transactions. let xts_root = extrinsics_root::(&block.extrinsics()); header.extrinsics_root().check_equal(&xts_root); assert!(header.extrinsics_root() == &xts_root, "Transaction trie root must be valid."); } - /// Actually execute all transitioning for `block`. + /// Actually execute all transitions for `block`. pub fn execute_block(block: Block) { Self::initialize_block(block.header()); @@ -128,11 +191,11 @@ impl< Self::final_checks(&header); } - /// Execute given extrinsics and take care of post-extrinsics book-keeping + /// Execute given extrinsics and take care of post-extrinsics book-keeping. fn execute_extrinsics_with_book_keeping(extrinsics: Vec, block_number: NumberFor) { extrinsics.into_iter().for_each(Self::apply_extrinsic_no_note); - // post-extrinsics book-keeping. + // post-extrinsics book-keeping >::note_finished_extrinsics(); >::on_finalize(block_number); } @@ -143,7 +206,7 @@ impl< >::note_finished_extrinsics(); >::on_finalize(>::block_number()); - // setup extrinsics + // set up extrinsics >::derive_extrinsics(); >::finalize() } @@ -180,7 +243,7 @@ impl< /// Actually apply an extrinsic given its `encoded_len`; this doesn't note its hash. fn apply_extrinsic_with_len(uxt: Block::Extrinsic, encoded_len: usize, to_note: Option>) -> result::Result { - // Verify the signature is good. + // Verify that the signature is good. let xt = uxt.check(&Default::default()).map_err(internal::ApplyError::BadSignature)?; // Check the size of the block if that extrinsic is applied. @@ -195,7 +258,7 @@ impl< if index < &expected_index { internal::ApplyError::Stale } else { internal::ApplyError::Future } ) } - // pay any fees. + // pay any fees Payment::make_payment(sender, encoded_len).map_err(|_| internal::ApplyError::CantPay)?; // AUDIT: Under no circumstances may this function panic from here onwards. @@ -204,13 +267,13 @@ impl< >::inc_account_nonce(sender); } - // make sure to `note_extrinsic` only after we know it's going to be executed + // Make sure to `note_extrinsic` only after we know it's going to be executed // to prevent it from leaking in storage. if let Some(encoded) = to_note { >::note_extrinsic(encoded); } - // decode parameters and dispatch + // Decode parameters and dispatch let (f, s) = xt.deconstruct(); let r = f.dispatch(s.into()); >::note_applied_extrinsic(&r, encoded_len as u32); @@ -222,10 +285,10 @@ impl< } fn final_checks(header: &System::Header) { - // remove temporaries. + // remove temporaries let new_header = >::finalize(); - // check digest. + // check digest assert_eq!( header.digest().logs().len(), new_header.digest().logs().len(), @@ -243,10 +306,10 @@ impl< assert!(header.state_root() == storage_root, "Storage root must match that calculated."); } - /// Check a given transaction for validity. This doesn't execute any + /// Check a given signed transaction for validity. This doesn't execute any /// side-effects; it merely checks whether the transaction would panic if it were included or not. /// - /// Changes made to the storage should be discarded. + /// Changes made to storage should be discarded. pub fn validate_transaction(uxt: Block::Extrinsic) -> TransactionValidity { // Note errors > 0 are from ApplyError const UNKNOWN_ERROR: i8 = -127; @@ -266,39 +329,37 @@ impl< Err(_) => return TransactionValidity::Invalid(UNKNOWN_ERROR), }; - if let (Some(sender), Some(index)) = (xt.sender(), xt.index()) { - // pay any fees. - if Payment::make_payment(sender, encoded_len).is_err() { - return TransactionValidity::Invalid(ApplyError::CantPay as i8) - } - - // check index - let mut expected_index = >::account_nonce(sender); - if index < &expected_index { - return TransactionValidity::Invalid(ApplyError::Stale as i8) - } - if *index > expected_index + As::sa(256) { - return TransactionValidity::Unknown(ApplyError::Future as i8) - } + match (xt.sender(), xt.index()) { + (Some(sender), Some(index)) => { + // pay any fees + if Payment::make_payment(sender, encoded_len).is_err() { + return TransactionValidity::Invalid(ApplyError::CantPay as i8) + } - let mut deps = Vec::new(); - while expected_index < *index { - deps.push((sender, expected_index).encode()); - expected_index = expected_index + One::one(); - } + // check index + let expected_index = >::account_nonce(sender); + if index < &expected_index { + return TransactionValidity::Invalid(ApplyError::Stale as i8) + } - TransactionValidity::Valid { - priority: encoded_len as TransactionPriority, - requires: deps, - provides: vec![(sender, *index).encode()], - longevity: TransactionLongevity::max_value(), - } - } else { - return TransactionValidity::Invalid(if xt.sender().is_none() { - MISSING_SENDER - } else { - INVALID_INDEX - }) + let index = *index; + let provides = vec![(sender, index).encode()]; + let requires = if expected_index < index { + vec![(sender, index - One::one()).encode()] + } else { + vec![] + }; + + TransactionValidity::Valid { + priority: encoded_len as TransactionPriority, + requires, + provides, + longevity: TransactionLongevity::max_value(), + } + }, + (None, None) => UnsignedValidator::validate_unsigned(&xt.deconstruct().0), + (Some(_), None) => TransactionValidity::Invalid(INVALID_INDEX), + (None, Some(_)) => TransactionValidity::Invalid(MISSING_SENDER), } } @@ -319,7 +380,7 @@ mod tests { use primitives::testing::{Digest, DigestItem, Header, Block}; use srml_support::{traits::Currency, impl_outer_origin, impl_outer_event}; use system; - use hex_literal::{hex, hex_impl}; + use hex_literal::hex; impl_outer_origin! { pub enum Origin for Runtime { @@ -358,8 +419,24 @@ mod tests { type TransferPayment = (); } + impl ValidateUnsigned for Runtime { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> TransactionValidity { + match call { + Call::set_balance(_, _, _) => TransactionValidity::Valid { + priority: 0, + requires: vec![], + provides: vec![], + longevity: std::u64::MAX, + }, + _ => TransactionValidity::Invalid(0), + } + } + } + type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive, system::ChainContext, balances::Module, ()>; + type Executive = super::Executive, system::ChainContext, balances::Module, Runtime, ()>; #[test] fn balance_transfer_dispatch_works() { @@ -397,7 +474,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("49cd58a254ccf6abc4a023d9a22dcfc421e385527a250faec69f8ad0d8ed3e48").into(), + state_root: hex!("5ba497e45e379d80a4524f9509d224e9c175d0fa30f3491481e7e44a6a758adf").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, @@ -481,4 +558,21 @@ mod tests { run_test(false); run_test(true); } + + #[test] + fn validate_unsigned() { + let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69)); + let valid = TransactionValidity::Valid { + priority: 0, + requires: vec![], + provides: vec![], + longevity: 18446744073709551615 + }; + let mut t = new_test_ext(); + + with_externalities(&mut t, || { + assert_eq!(Executive::validate_transaction(xt.clone()), valid); + assert_eq!(Executive::apply_extrinsic(xt), Ok(ApplyOutcome::Fail)); + }); + } } diff --git a/srml/finality-tracker/Cargo.toml b/srml/finality-tracker/Cargo.toml index b23afc58f4dc953ec6b3e15d200393ad4ad56756..c7006a3c3e632b98eca02b44c191f03b947a3897 100644 --- a/srml/finality-tracker/Cargo.toml +++ b/srml/finality-tracker/Cargo.toml @@ -1,13 +1,11 @@ [package] name = "srml-finality-tracker" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" -serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", default-features = false, features = ["derive"] } parity-codec = { version = "3.3", default-features = false } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -25,7 +23,6 @@ parking_lot = "0.7" default = ["std"] std = [ "serde/std", - "serde_derive", "parity-codec/std", "rstd/std", "srml-support/std", diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs index 34be4ea66a590f216ee350550fc43ae8670a3038..2276ad31554a53bc0ae10a7f872e59b28bf762b3 100644 --- a/srml/finality-tracker/src/lib.rs +++ b/srml/finality-tracker/src/lib.rs @@ -26,16 +26,16 @@ use inherents::{ InherentData, MakeFatalError, }; use srml_support::StorageValue; -use primitives::traits::{As, One, Zero}; +use primitives::traits::{One, Zero, SaturatedConversion}; use rstd::{prelude::*, result, cmp, vec}; use parity_codec::Decode; -use srml_system::{ensure_inherent, Trait as SystemTrait}; +use srml_system::{ensure_none, Trait as SystemTrait}; #[cfg(feature = "std")] use parity_codec::Encode; -const DEFAULT_WINDOW_SIZE: u64 = 101; -const DEFAULT_DELAY: u64 = 1000; +const DEFAULT_WINDOW_SIZE: u32 = 101; +const DEFAULT_DELAY: u32 = 1000; /// The identifier for the `finalnum` inherent. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"finalnum"; @@ -100,9 +100,9 @@ decl_storage! { /// The median. Median get(median) build(|_| T::BlockNumber::zero()): T::BlockNumber; /// The number of recent samples to keep from this chain. Default is n-100 - pub WindowSize get(window_size) config(window_size): T::BlockNumber = T::BlockNumber::sa(DEFAULT_WINDOW_SIZE); + pub WindowSize get(window_size) config(window_size): T::BlockNumber = DEFAULT_WINDOW_SIZE.into(); /// The delay after which point things become suspicious. - pub ReportLatency get(report_latency) config(report_latency): T::BlockNumber = T::BlockNumber::sa(DEFAULT_DELAY); + pub ReportLatency get(report_latency) config(report_latency): T::BlockNumber = DEFAULT_DELAY.into(); /// Final hint to apply in the block. `None` means "same as parent". Update: Option; @@ -117,7 +117,7 @@ decl_module! { /// Hint that the author of this block thinks the best finalized /// block is the given number. fn final_hint(origin, #[compact] hint: T::BlockNumber) { - ensure_inherent(origin)?; + ensure_none(origin)?; assert!(!::Update::exists(), "Final hint must be updated only once in the block"); assert!( srml_system::Module::::block_number() >= hint, @@ -154,7 +154,7 @@ impl Module { // the sample size has just been shrunk. { // take into account the item we haven't pushed yet. - let to_prune = (recent.len() + 1).saturating_sub(window_size.as_() as usize); + let to_prune = (recent.len() + 1).saturating_sub(window_size.saturated_into::()); for drained in recent.drain(..to_prune) { let idx = ordered.binary_search(&drained) @@ -188,13 +188,13 @@ impl Module { } }; - let our_window_size = recent.len(); + let our_window_size = recent.len() as u32; ::RecentHints::put(recent); ::OrderedHints::put(ordered); ::Median::put(median); - if T::BlockNumber::sa(our_window_size as u64) == window_size { + if T::BlockNumber::from(our_window_size) == window_size { let now = srml_system::Module::::block_number(); let latency = Self::report_latency(); @@ -372,7 +372,7 @@ mod tests { System::initialize(&i, &parent_hash, &Default::default()); assert_ok!(FinalityTracker::dispatch( Call::final_hint(i-1), - Origin::INHERENT, + Origin::NONE, )); FinalityTracker::on_finalize(i); let hdr = System::finalize(); diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml index a4cf9c9bd0c77fff08f9f8570f0304cf59bf9e0f..7855019af8a4d3af942d4ec895c173a0f3ef39ab 100644 --- a/srml/grandpa/Cargo.toml +++ b/srml/grandpa/Cargo.toml @@ -1,13 +1,11 @@ [package] name = "srml-grandpa" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -#hex-literal = "0.1.0" -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } substrate-primitives = { path = "../../core/primitives", default-features = false } substrate-finality-grandpa-primitives = { path = "../../core/finality-grandpa/primitives", default-features = false } @@ -26,7 +24,6 @@ runtime_io = { package = "sr-io", path = "../../core/sr-io" } default = ["std"] std = [ "serde", - "serde_derive", "parity-codec/std", "substrate-primitives/std", "substrate-finality-grandpa-primitives/std", diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index e9b00662d6e52fed452344acbb44a1c21d3b2f6b..5425ace8bb89e18b5cd398c374d9f61f3ab54f00 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -31,7 +31,7 @@ pub use substrate_finality_grandpa_primitives as fg_primitives; #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; use rstd::prelude::*; use parity_codec as codec; use codec::{Encode, Decode}; @@ -275,8 +275,6 @@ impl Module { in_blocks: T::BlockNumber, forced: Option, ) -> Result { - use primitives::traits::As; - if Self::pending_change().is_none() { let scheduled_at = system::ChainContext::::default().current_height(); @@ -287,7 +285,7 @@ impl Module { // only allow the next forced change when twice the window has passed since // this one. - >::put(scheduled_at + in_blocks * T::BlockNumber::sa(2)); + >::put(scheduled_at + in_blocks * 2.into()); } >::put(StoredPendingChange { diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs index 3050b6a572e0d2d8269cf0a6ba8beb5862248da8..560766f8c62ade033eb8229db0ebc12348ae71ec 100644 --- a/srml/grandpa/src/tests.rs +++ b/srml/grandpa/src/tests.rs @@ -47,6 +47,7 @@ fn authorities_change_logged() { EventRecord { phase: Phase::Finalization, event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(), + topics: vec![], }, ]); }); @@ -77,6 +78,7 @@ fn authorities_change_logged_after_delay() { EventRecord { phase: Phase::Finalization, event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(), + topics: vec![], }, ]); }); diff --git a/srml/indices/Cargo.toml b/srml/indices/Cargo.toml index 8c62cf13b56ba1fcffda4ea8a8b19f0226491885..de496f20c6bbaab9a637275b123abe6f0ace3954 100644 --- a/srml/indices/Cargo.toml +++ b/srml/indices/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-indices" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/indices/src/address.rs b/srml/indices/src/address.rs index c7709e3bec3a5722b0662d141a65c9b494474d6c..123b8bca89753c8d307b40da5a687296c6c372c8 100644 --- a/srml/indices/src/address.rs +++ b/srml/indices/src/address.rs @@ -18,7 +18,8 @@ #[cfg(feature = "std")] use std::fmt; -use crate::{Member, Decode, Encode, As, Input, Output}; +use rstd::convert::TryInto; +use crate::{Member, Decode, Encode, Input, Output}; /// An indices-aware address, which can be either a direct `AccountId` or /// an index. @@ -59,14 +60,20 @@ fn need_more_than(a: T, b: T) -> Option { impl Decode for Address where AccountId: Member + Decode, - AccountIndex: Member + Decode + PartialOrd + Ord + As + As + As + Copy, + AccountIndex: Member + Decode + PartialOrd + Ord + From + Copy, { fn decode(input: &mut I) -> Option { Some(match input.read_byte()? { - x @ 0x00...0xef => Address::Index(As::sa(x)), - 0xfc => Address::Index(As::sa(need_more_than(0xef, u16::decode(input)?)?)), - 0xfd => Address::Index(As::sa(need_more_than(0xffff, u32::decode(input)?)?)), - 0xfe => Address::Index(need_more_than(As::sa(0xffffffffu32), Decode::decode(input)?)?), + x @ 0x00...0xef => Address::Index(AccountIndex::from(x as u32)), + 0xfc => Address::Index(AccountIndex::from( + need_more_than(0xef, u16::decode(input)?)? as u32 + )), + 0xfd => Address::Index(AccountIndex::from( + need_more_than(0xffff, u32::decode(input)?)? + )), + 0xfe => Address::Index( + need_more_than(0xffffffffu32.into(), Decode::decode(input)?)? + ), 0xff => Address::Id(Decode::decode(input)?), _ => return None, }) @@ -75,7 +82,7 @@ impl Decode for Address where impl Encode for Address where AccountId: Member + Encode, - AccountIndex: Member + Encode + PartialOrd + Ord + As + As + As + Copy, + AccountIndex: Member + Encode + PartialOrd + Ord + Copy + From + TryInto, { fn encode_to(&self, dest: &mut T) { match *self { @@ -83,19 +90,26 @@ impl Encode for Address where dest.push_byte(255); dest.push(i); } - Address::Index(i) if i > As::sa(0xffffffffu32) => { - dest.push_byte(254); - dest.push(&i); - } - Address::Index(i) if i > As::sa(0xffffu32) => { - dest.push_byte(253); - dest.push(&As::::as_(i)); - } - Address::Index(i) if i >= As::sa(0xf0u32) => { - dest.push_byte(252); - dest.push(&As::::as_(i)); - } - Address::Index(i) => dest.push_byte(As::::as_(i)), + Address::Index(i) => { + let maybe_u32: Result = i.try_into(); + if let Ok(x) = maybe_u32 { + if x > 0xffff { + dest.push_byte(253); + dest.push(&x); + } + else if x >= 0xf0 { + dest.push_byte(252); + dest.push(&(x as u16)); + } + else { + dest.push_byte(x as u8); + } + + } else { + dest.push_byte(254); + dest.push(&i); + } + }, } } } diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs index 76261796c8b78b6131fb1fb00794b897b473b8c9..509e5c1133ae8dd93a018f69c36755706c3ca6ad 100644 --- a/srml/indices/src/lib.rs +++ b/srml/indices/src/lib.rs @@ -19,10 +19,10 @@ #![cfg_attr(not(feature = "std"), no_std)] -use rstd::{prelude::*, result, marker::PhantomData}; +use rstd::{prelude::*, result, marker::PhantomData, convert::TryInto}; use parity_codec::{Encode, Decode, Codec, Input, Output}; use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage}; -use primitives::traits::{One, SimpleArithmetic, As, StaticLookup, Member}; +use primitives::traits::{One, SimpleArithmetic, StaticLookup, Member}; use system::{IsDeadAccount, OnNewAccount}; use self::address::Address as RawAddress; @@ -33,13 +33,13 @@ pub mod address; mod tests; /// Number of account IDs stored per enum set. -const ENUM_SET_SIZE: usize = 64; +const ENUM_SET_SIZE: u32 = 64; pub type Address = RawAddress<::AccountId, ::AccountIndex>; /// Turn an Id into an Index, or None for the purpose of getting /// a hint at a possibly desired index. -pub trait ResolveHint> { +pub trait ResolveHint { /// Turn an Id into an Index, or None for the purpose of getting /// a hint at a possibly desired index. fn resolve_hint(who: &AccountId) -> Option; @@ -47,9 +47,11 @@ pub trait ResolveHint> { /// Simple encode-based resolve hint implemenntation. pub struct SimpleResolveHint(PhantomData<(AccountId, AccountIndex)>); -impl> ResolveHint for SimpleResolveHint { +impl> + ResolveHint for SimpleResolveHint +{ fn resolve_hint(who: &AccountId) -> Option { - Some(AccountIndex::sa(who.using_encoded(|e| e[0] as usize + e[1] as usize * 256))) + Some(AccountIndex::from(who.using_encoded(|e| e[0] as u32 + e[1] as u32 * 256))) } } @@ -57,7 +59,7 @@ impl> ResolveHint + As + As + As + As + Copy; + type AccountIndex: Parameter + Member + Codec + Default + SimpleArithmetic + Copy; /// Whether an account is dead or not. type IsDeadAccount: IsDeadAccount; @@ -92,20 +94,24 @@ decl_storage! { trait Store for Module as Indices { /// The next free enumeration set. pub NextEnumSet get(next_enum_set) build(|config: &GenesisConfig| { - T::AccountIndex::sa(config.ids.len() / ENUM_SET_SIZE) + (config.ids.len() as u32 / ENUM_SET_SIZE).into() }): T::AccountIndex; /// The enumeration sets. - pub EnumSet get(enum_set): map T::AccountIndex => Vec; + pub EnumSet get(enum_set) build(|config: &GenesisConfig| { + (0..((config.ids.len() as u32) + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE) + .map(|i| ( + i.into(), + config.ids[ + (i * ENUM_SET_SIZE) as usize.. + config.ids.len().min(((i + 1) * ENUM_SET_SIZE) as usize) + ].to_owned(), + )) + .collect::>() + }): map T::AccountIndex => Vec; } add_extra_genesis { config(ids): Vec; - build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { - for i in 0..(config.ids.len() + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE { - storage.insert(GenesisConfig::::hash(&>::key_for(T::AccountIndex::sa(i))).to_vec(), - config.ids[i * ENUM_SET_SIZE..config.ids.len().min((i + 1) * ENUM_SET_SIZE)].to_owned().encode()); - } - }); } } @@ -116,7 +122,7 @@ impl Module { pub fn lookup_index(index: T::AccountIndex) -> Option { let enum_set_size = Self::enum_set_size(); let set = Self::enum_set(index / enum_set_size); - let i: usize = (index % enum_set_size).as_(); + let i: usize = (index % enum_set_size).try_into().ok()?; set.get(i).cloned() } @@ -124,12 +130,18 @@ impl Module { pub fn can_reclaim(try_index: T::AccountIndex) -> bool { let enum_set_size = Self::enum_set_size(); let try_set = Self::enum_set(try_index / enum_set_size); - let i = (try_index % enum_set_size).as_(); - i < try_set.len() && T::IsDeadAccount::is_dead_account(&try_set[i]) + let maybe_usize: Result = (try_index % enum_set_size).try_into(); + if let Ok(i) = maybe_usize { + i < try_set.len() && T::IsDeadAccount::is_dead_account(&try_set[i]) + } else { + false + } } /// Lookup an address to get an Id, if there's one there. - pub fn lookup_address(a: address::Address) -> Option { + pub fn lookup_address( + a: address::Address + ) -> Option { match a { address::Address::Id(i) => Some(i), address::Address::Index(i) => Self::lookup_index(i), @@ -139,7 +151,7 @@ impl Module { // PUBLIC MUTABLES (DANGEROUS) fn enum_set_size() -> T::AccountIndex { - T::AccountIndex::sa(ENUM_SET_SIZE) + ENUM_SET_SIZE.into() } } @@ -152,36 +164,38 @@ impl OnNewAccount for Module { // then check to see if this account id identifies a dead account index. let set_index = try_index / enum_set_size; let mut try_set = Self::enum_set(set_index); - let item_index = (try_index % enum_set_size).as_(); - if item_index < try_set.len() { - if T::IsDeadAccount::is_dead_account(&try_set[item_index]) { - // yup - this index refers to a dead account. can be reused. - try_set[item_index] = who.clone(); - >::insert(set_index, try_set); - - return + if let Ok(item_index) = (try_index % enum_set_size).try_into() { + if item_index < try_set.len() { + if T::IsDeadAccount::is_dead_account(&try_set[item_index]) { + // yup - this index refers to a dead account. can be reused. + try_set[item_index] = who.clone(); + >::insert(set_index, try_set); + + return + } } } } // insert normally as a back up let mut set_index = next_set_index; - // defensive only: this loop should never iterate since we keep NextEnumSet up to date later. + // defensive only: this loop should never iterate since we keep NextEnumSet up to date + // later. let mut set = loop { let set = Self::enum_set(set_index); - if set.len() < ENUM_SET_SIZE { + if set.len() < ENUM_SET_SIZE as usize { break set; } set_index += One::one(); }; - let index = T::AccountIndex::sa(set_index.as_() * ENUM_SET_SIZE + set.len()); + let index = set_index * enum_set_size + T::AccountIndex::from(set.len() as u32); // update set. set.push(who.clone()); // keep NextEnumSet up to date - if set.len() == ENUM_SET_SIZE { + if set.len() == ENUM_SET_SIZE as usize { >::put(set_index + One::one()); } diff --git a/srml/metadata/Cargo.toml b/srml/metadata/Cargo.toml index 1dc8180829652bdbeee749ab7659f758fe9de1f7..0e9ae66540bfa46ab8e11ca03a1ac9b2ead08b25 100644 --- a/srml/metadata/Cargo.toml +++ b/srml/metadata/Cargo.toml @@ -1,13 +1,12 @@ [package] name = "srml-metadata" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] parity-codec = { version = "3.3", default-features = false, features = ["derive"] } -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false } @@ -18,5 +17,4 @@ std = [ "rstd/std", "primitives/std", "serde", - "serde_derive" ] diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs index 9b03daafa65d3e81152e0f44e991b0c924e7b85c..28a513cc07b54d5e32d1b6981096e1bb1a21bec2 100644 --- a/srml/metadata/src/lib.rs +++ b/srml/metadata/src/lib.rs @@ -23,7 +23,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; #[cfg(feature = "std")] use parity_codec::{Decode, Input}; use parity_codec::{Encode, Output}; @@ -253,17 +253,30 @@ impl std::fmt::Debug for DefaultByteGetter { } } +/// Hasher used by storage maps +#[derive(Clone, PartialEq, Eq, Encode)] +#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] +pub enum StorageHasher { + Blake2_128, + Blake2_256, + Twox128, + Twox256, + Twox64Concat, +} + /// A storage function type. #[derive(Clone, PartialEq, Eq, Encode)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] pub enum StorageFunctionType { Plain(DecodeDifferentStr), Map { + hasher: StorageHasher, key: DecodeDifferentStr, value: DecodeDifferentStr, is_linked: bool, }, DoubleMap { + hasher: StorageHasher, key1: DecodeDifferentStr, key2: DecodeDifferentStr, value: DecodeDifferentStr, @@ -279,22 +292,6 @@ pub enum StorageFunctionModifier { Default, } -/// All metadata about the outer dispatch. -#[derive(Clone, PartialEq, Eq, Encode)] -#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct OuterDispatchMetadata { - pub name: DecodeDifferentStr, - pub calls: DecodeDifferentArray, -} - -/// A Call from the outer dispatch. -#[derive(Clone, PartialEq, Eq, Encode)] -#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct OuterDispatchCall { - pub name: DecodeDifferentStr, - pub index: u16, -} - #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] /// Metadata prefixed by a u32 for reserved usage @@ -312,8 +309,10 @@ pub enum RuntimeMetadata { V1(RuntimeMetadataDeprecated), /// Version 2 for runtime metadata. No longer used. V2(RuntimeMetadataDeprecated), - /// Version 3 for runtime metadata. - V3(RuntimeMetadataV3), + /// Version 3 for runtime metadata. No longer used. + V3(RuntimeMetadataDeprecated), + /// Version 4 for runtime metadata. + V4(RuntimeMetadataV4), } /// Enum that should fail. @@ -336,7 +335,7 @@ impl Decode for RuntimeMetadataDeprecated { /// The metadata of a runtime. #[derive(Eq, Encode, PartialEq)] #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))] -pub struct RuntimeMetadataV3 { +pub struct RuntimeMetadataV4 { pub modules: DecodeDifferentArray, } diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml index 036f5a55ec7ee19ce90b11219fd0ad64af2bfa3f..318c6d9f2266b721a24012c60f59cdd526f5f161 100644 --- a/srml/session/Cargo.toml +++ b/srml/session/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-session" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 204eaccc1f94befa5ba604c2531c0a62d7e1c9f9..d13795e4bb09cc4b7bbdf76fe1dc2df9300e65a0 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -14,13 +14,109 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Session manager: is told the validators and allows them to manage their session keys for the -//! consensus module. +//! # Session Module +//! +//! The Session module allows validators to manage their session keys, provides a function for changing +//! the session length, and handles session rotation. +//! +//! - [`session::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! - [`Module`](./struct.Module.html) +//! +//! ## Overview +//! +//! ### Terminology +//! +//! +//! - **Session:** A session is a period of time that has a constant set of validators. Validators can only join +//! or exit the validator set at a session change. It is measured in block numbers and set with `set_length` +//! during a session for use in subsequent sessions. +//! - **Session key:** A session key is actually several keys kept together that provide the various signing +//! functions required by network authorities/validators in pursuit of their duties. +//! - **Session key configuration process:** A session key is set using `set_key` for use in the +//! next session. It is stored in `NextKeyFor`, a mapping between the caller's `AccountID` and the session +//! key provided. `set_key` allows users to set their session key prior to becoming a validator. +//! It is a public call since it uses `ensure_signed`, which checks that the origin is a signed account. +//! As such, the account ID of the origin stored in in `NextKeyFor` may not necessarily be associated with +//! a block author or a validator. The session keys of accounts are removed once their account balance is zero. +//! - **Validator set session key configuration process:** Each session we iterate through the current +//! set of validator account IDs to check if a session key was created for it in the previous session +//! using `set_key`. If it was then we call `set_authority` from the [Consensus module](../srml_consensus/index.html) +//! and pass it a set of session keys (each associated with an account ID) as the session keys for the new +//! validator set. Lastly, if the session key of the current authority does not match any session keys stored under +//! its validator index in the `AuthorityStorageVec` mapping, then we update the mapping with its session +//! key and update the saved list of original authorities if necessary +//! (see https://github.com/paritytech/substrate/issues/1290). Note: Authorities are stored in the Consensus module. +//! They are represented by a validator account ID index from the Session module and allocated with a session +//! key for the length of the session. +//! - **Session length change process:** At the start of the next session we allocate a session index and record the +//! timestamp when the session started. If a `NextSessionLength` was recorded in the previous session, we record +//! it as the new session length. Additionally, if the new session length differs from the length of the +//! next session then we record a `LastLengthChange`. +//! - **Session rotation configuration:** Configure as either a 'normal' (rewardable session where rewards are +//! applied) or 'exceptional' (slashable) session rotation. +//! - **Session rotation process:** The session is changed at the end of the final block of the current session +//! using the `on_finalize` method. It may be called by either an origin or internally from another runtime +//! module at the end of each block. +//! +//! ### Goals +//! +//! The Session module in Substrate is designed to make the following possible: +//! +//! - Set session keys of the validator set for the next session. +//! - Set the length of a session. +//! - Configure and switch between either normal or exceptional session rotations. +//! +//! ## Interface +//! +//! ### Dispatchable Functions +//! +//! - `set_key` - Set a validator's session key for the next session. +//! - `set_length` - Set a new session length to be applied upon the next session change. +//! - `force_new_session` - Force a new session that should be considered either a normal (rewardable) +//! or exceptional rotation. +//! - `on_finalize` - Called when a block is finalized. Will rotate session if it is the last +//! block of the current session. +//! +//! ### Public Functions +//! +//! - `validator_count` - Get the current number of validators. +//! - `last_length_change` - Get the block number when the session length last changed. +//! - `apply_force_new_session` - Force a new session. Can be called by other runtime modules. +//! - `set_validators` - Set the current set of validators. Can only be called by the Staking module. +//! - `check_rotate_session` - Rotate the session and apply rewards if necessary. Called after the Staking +//! module updates the authorities to the new validator set. +//! - `rotate_session` - Change to the next session. Register the new authority set. Update session keys. +//! Enact session length change if applicable. +//! - `ideal_session_duration` - Get the time of an ideal session. +//! - `blocks_remaining` - Get the number of blocks remaining in the current session, +//! excluding the current block. +//! +//! ## Usage +//! +//! ### Example from the SRML +//! +//! The [Staking module](../srml_staking/index.html) uses the Session module to get the validator set. +//! +//! ``` +//! use srml_session as session; +//! # fn not_executed() { +//! +//! let validators = >::validators(); +//! # } +//! # fn main(){} +//! ``` +//! +//! ## Related Modules +//! +//! - [Consensus](../srml_consensus/index.html) +//! - [Staking](../srml_staking/index.html) +//! - [Timestamp](../srml_timestamp/index.html) #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; -use primitives::traits::{As, Zero, One, Convert}; +use primitives::traits::{Zero, One, Convert}; use srml_support::{StorageValue, StorageMap, for_each_tuple, decl_module, decl_event, decl_storage}; use srml_support::{dispatch::Result, traits::OnFreeBalanceZero}; use system::ensure_signed; @@ -51,8 +147,13 @@ macro_rules! impl_session_change { for_each_tuple!(impl_session_change); pub trait Trait: timestamp::Trait + consensus::Trait { + /// Create a session key from an account key. type ConvertAccountIdToSessionKey: Convert>; + + /// Handler when a session changes. type OnSessionChange: OnSessionChange; + + /// The overarching event type. type Event: From> + Into<::Event>; } @@ -60,8 +161,8 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; - /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next - /// session. + /// Sets the session key of a validator (function caller) to `key`. + /// This doesn't take effect until the next session. fn set_key(origin, key: T::SessionKey) { let who = ensure_signed(origin)?; // set new value for next session @@ -78,6 +179,8 @@ decl_module! { Self::apply_force_new_session(apply_rewards) } + /// Called when a block is finalized. Will rotate session if it is the last + /// block of the current session. fn on_finalize(n: T::BlockNumber) { Self::check_rotate_session(n); } @@ -97,14 +200,15 @@ decl_storage! { /// The current set of validators. pub Validators get(validators) config(): Vec; /// Current length of the session. - pub SessionLength get(length) config(session_length): T::BlockNumber = T::BlockNumber::sa(1000); + pub SessionLength get(length) config(session_length): T::BlockNumber = 1000.into(); /// Current index of the session. - pub CurrentIndex get(current_index) build(|_| T::BlockNumber::sa(0)): T::BlockNumber; + pub CurrentIndex get(current_index) build(|_| 0.into()): T::BlockNumber; /// Timestamp when current session started. pub CurrentStart get(current_start) build(|_| T::Moment::zero()): T::Moment; - /// New session is being forced if this entry exists; in which case, the boolean value is whether - /// the new session should be considered a normal rotation (rewardable) or exceptional (slashable). + /// New session is being forced if this entry exists; in which case, the boolean value is true if + /// the new session should be considered a normal rotation (rewardable) and false if the new session + /// should be considered exceptional (slashable). pub ForcingNewSession get(forcing_new_session): Option; /// Block at which the session length last changed. LastLengthChange: Option; @@ -198,7 +302,7 @@ impl Module { }; } - /// Get the time that should have elapsed over a session if everything was working perfectly. + /// Get the time that should elapse over a session if everything is working perfectly. pub fn ideal_session_duration() -> T::Moment { let block_period: T::Moment = >::minimum_period(); let session_length: T::BlockNumber = Self::length(); diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml index cd10f783b1a203eb0f1f93f3be1065179b4984ce..857ea73ee44421cf6ce636e558d858ff969e492c 100644 --- a/srml/staking/Cargo.toml +++ b/srml/staking/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-staking" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "3.3", default-features = false, features = ["derive"] } diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 6d905c37fb94490828fbaa36d021a1dfd07ab37a..1901752666d84427d1e6cf63cdfcef3befe91df3 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -15,53 +15,62 @@ // along with Substrate. If not, see . //! # Staking Module -//! //! -//! The staking module is the means by which a set of network maintainers (known as _authorities_ in some contexts and _validators_ in others) -//! are chosen based upon those who voluntarily place funds under deposit. Under deposit, those funds are rewarded under -//! normal operation but are held at pain of _slash_ (expropriation) should the staked maintainer be found not to be -//! discharging their duties properly. +//! The Staking module is used to manage funds at stake by network maintainers. //! -//! You can start using the Staking module by implementing the staking [`Trait`]. +//! - [`staking::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! - [`Module`](./struct.Module.html) //! //! ## Overview //! +//! The Staking module is the means by which a set of network maintainers (known as _authorities_ in some contexts +//! and _validators_ in others) are chosen based upon those who voluntarily place funds under deposit. Under deposit, +//! those funds are rewarded under normal operation but are held at pain of _slash_ (expropriation) should the +//! staked maintainer be found not to be discharging its duties properly. +//! //! ### Terminology //! //! -//! - Staking: The process of locking up funds for some time, placing them at risk of slashing (loss) in order to become a rewarded maintainer of the network. -//! - Validating: The process of running a node to actively maintain the network, either by producing blocks or guaranteeing finality of the chain. -//! - Nominating: The process of placing staked funds behind one or more validators in order to share in any reward, and punishment, they take. +//! - Staking: The process of locking up funds for some time, placing them at risk of slashing (loss) +//! in order to become a rewarded maintainer of the network. +//! - Validating: The process of running a node to actively maintain the network, either by producing +//! blocks or guaranteeing finality of the chain. +//! - Nominating: The process of placing staked funds behind one or more validators in order to share +//! in any reward, and punishment, they take. //! - Stash account: The account holding an owner's funds used for staking. -//! - Controller account: The account which controls an owner's funds for staking. -//! - Era: A (whole) number of sessions, which is the period that the validator set (and each validator's active nominator set) is recalculated and where rewards are paid out. -//! - Slash: The punishment of a staker by reducing their funds. +//! - Controller account: The account that controls an owner's funds for staking. +//! - Era: A (whole) number of sessions, which is the period that the validator set (and each validator's +//! active nominator set) is recalculated and where rewards are paid out. +//! - Slash: The punishment of a staker by reducing its funds. //! //! ### Goals //! //! -//! The staking system in Substrate NPoS is designed to achieve three goals: +//! The staking system in Substrate NPoS is designed to make the following possible: //! -//! - It should be possible to stake funds that are controlled by a cold wallet. -//! - It should be possible to withdraw some, or deposit more, funds without interrupting the role of an entity. -//! - It should be possible to switch between roles (nominator, validator, idle) with minimal overhead. +//! - Stake funds that are controlled by a cold wallet. +//! - Withdraw some, or deposit more, funds without interrupting the role of an entity. +//! - Switch between roles (nominator, validator, idle) with minimal overhead. //! //! ### Scenarios //! //! #### Staking //! -//! Almost any interaction with the staking module requires a process of _**bonding**_ (also known as -//! being a _staker_). To become *bonded* a fund-holding account known as the _stash account_, which holds some of all of the -//! funds that become frozen in place as part of the staking process, is paired with an active **controller** account which issues -//! instructions on how they shall be used. +//! Almost any interaction with the Staking module requires a process of _**bonding**_ (also known as +//! being a _staker_). To become *bonded*, a fund-holding account known as the _stash account_, which holds +//! some or all of the funds that become frozen in place as part of the staking process, is paired with an +//! active **controller** account, which issues instructions on how they shall be used. //! //! An account pair can become bonded using the [`bond`](./enum.Call.html#variant.bond) call. //! -//! Stash accounts can change their associated controller using the [`set_controller`](./enum.Call.html#variant.set_controller) call. +//! Stash accounts can change their associated controller using the +//! [`set_controller`](./enum.Call.html#variant.set_controller) call. //! -//! There are three possible roles that any staked account pair can be in: `Validator`, `Nominator` and `Idle` (defined in [`StakerStatus`]). There are -//! three corresponding instructions to change between roles, namely: -//! [`validate`](./enum.Call.html#variant.validate), [`nominate`](./enum.Call.html#variant.nominate) and [`chill`](./enum.Call.html#variant.chill). +//! There are three possible roles that any staked account pair can be in: `Validator`, `Nominator` and `Idle` +//! (defined in [`StakerStatus`](./enum.StakerStatus.html)). There are three corresponding instructions to change between roles, namely: +//! [`validate`](./enum.Call.html#variant.validate), [`nominate`](./enum.Call.html#variant.nominate), +//! and [`chill`](./enum.Call.html#variant.chill). //! //! #### Validating //! @@ -86,15 +95,16 @@ //! //! #### Rewards and Slash //! -//! The **reward and slashing** procedure is the core of the staking module, attempting to _embrace valid behavior_ +//! The **reward and slashing** procedure is the core of the Staking module, attempting to _embrace valid behavior_ //! while _punishing any misbehavior or lack of availability_. //! //! Slashing can occur at any point in time, once misbehavior is reported. Once slashing is determined, a value is -//! deducted from the balance of the validator and all the nominators who voted for this validator (values are deducted from the _stash_ account of the slashed entity). +//! deducted from the balance of the validator and all the nominators who voted for this validator +//! (values are deducted from the _stash_ account of the slashed entity). //! //! Similar to slashing, rewards are also shared among a validator and its associated nominators. -//! Yet, the reward funds are not always transferred to the stash account and can be configured. See [Reward Calculation](#reward-calculation) -//! for more details. +//! Yet, the reward funds are not always transferred to the stash account and can be configured. +//! See [Reward Calculation](#reward-calculation) for more details. //! //! #### Chilling //! @@ -106,54 +116,18 @@ //! //! ## Interface //! -//! ### Dispatchable +//! ### Dispatchable Functions //! -//! The Dispatchable functions of the staking module enable the steps needed for entities to accept and change their +//! The dispatchable functions of the Staking module enable the steps needed for entities to accept and change their //! role, alongside some helper functions to get/set the metadata of the module. //! -//! Please refer to the [`Call`] enum and its associated variants for a detailed list of dispatchable functions. +//! ### Public Functions //! -//! ### Public -//! The staking module contains many public storage items and (im)mutable functions. Please refer to the [struct list](#structs) -//! below and the [`Module`] struct definition for more details. +//! The Staking module contains many public storage items and (im)mutable functions. //! //! ## Usage //! -//! -//! ### Snippet: Bonding and Accepting Roles -//! -//! An arbitrary account pair, given that the associated stash has the required funds, can become stakers via the following call: -//! -//! ```rust,ignore -//! // bond account 3 as stash -//! // account 4 as controller -//! // with stash value 1500 units -//! // while the rewards get transferred to the controller account. -//! Staking::bond(Origin::signed(3), 4, 1500, RewardDestination::Controller); -//! ``` -//! -//! To state desire to become a validator: -//! -//! ```rust,ignore -//! // controller account 4 states desire for validation with the given preferences. -//! Staking::validate(Origin::signed(4), ValidatorPrefs::default()); -//! ``` -//! -//! Similarly, to state desire in nominating: -//! -//! ```rust,ignore -//! // controller account 4 nominates for account 10 and 20. -//! Staking::nominate(Origin::signed(4), vec![20, 10]); -//! ``` -//! -//! Finally, account 4 can withdraw from any of the above roles via -//! -//! ```rust,ignore -//! Staking::chill(Origin::signed(4)); -//! ``` -//! -//! You can find the equivalent of the above calls in your [Substrate UI](https://substrate-ui.parity.io). -//! ### Snippet: Reporting Misbehavior +//! ### Example: Reporting Misbehavior //! //! ``` //! use srml_support::{decl_module, dispatch::Result}; @@ -179,26 +153,30 @@ //! //! ### Slot Stake //! -//! The term [`SlotStake`] will be used throughout this section. It refers to a value calculated at the end of each era, -//! containing the _minimum value at stake among all validators._ Note that a validator's value at stake might be a combination of -//! The validator's own stake and the votes it received. See [`Exposure`] for more details. +//! The term [`SlotStake`](./struct.Module.html#method.slot_stake) will be used throughout this section. It refers +//! to a value calculated at the end of each era, containing the _minimum value at stake among all validators._ +//! Note that a validator's value at stake might be a combination of The validator's own stake +//! and the votes it received. See [`Exposure`](./struct.Exposure.html) for more details. //! //! ### Reward Calculation //! //! Rewards are recorded **per-session** and paid **per-era**. The value of the reward for each session is calculated at //! the end of the session based on the timeliness of the session, then accumulated to be paid later. The value of -//! the new _per-session-reward_ is calculated at the end of each era by multiplying [`SlotStake`] and [`SessionReward`] +//! the new _per-session-reward_ is calculated at the end of each era by multiplying `SlotStake` and `SessionReward` //! (`SessionReward` is the multiplication factor, represented by a number between 0 and 1). -//! Once a new era is triggered, rewards are paid to the validators and the associated nominators. +//! Once a new era is triggered, rewards are paid to the validators and their associated nominators. //! -//! The validator can declare an amount, named [`validator_payment`](./struct.ValidatorPrefs.html#structfield.validator_payment), that does not get shared with the nominators at -//! each reward payout through their [`ValidatorPrefs`]. This value gets deducted from the total reward that can be paid. -//! The remaining portion is split among the validator and all of the nominators that nominated the validator, -//! proportional to the value staked behind this validator -//! (_i.e._ dividing the [`own`](./struct.Exposure.html#structfield.own) or [`others`](./struct.Exposure.html#structfield.others) by [`total`](./struct.Exposure.html#structfield.total) in [`Exposure`]). +//! The validator can declare an amount, named +//! [`validator_payment`](./struct.ValidatorPrefs.html#structfield.validator_payment), that does not get shared +//! with the nominators at each reward payout through its [`ValidatorPrefs`](./struct.ValidatorPrefs.html). This value +//! gets deducted from the total reward that can be paid. The remaining portion is split among the validator and all +//! of the nominators that nominated the validator, proportional to the value staked behind this validator (_i.e._ +//! dividing the [`own`](./struct.Exposure.html#structfield.own) or [`others`](./struct.Exposure.html#structfield.others) +//! by [`total`](./struct.Exposure.html#structfield.total) in [`Exposure`](./struct.Exposure.html)). //! -//! All entities who receive a reward have the option to choose their reward destination, -//! through the [`Payee`] storage item (see [`set_payee`](enum.Call.html#variant.set_payee)), to be one of the following: +//! All entities who receive a reward have the option to choose their reward destination +//! through the [`Payee`](./struct.Payee.html) storage item (see [`set_payee`](enum.Call.html#variant.set_payee)), +//! to be one of the following: //! //! - Controller account, (obviously) not increasing the staked value. //! - Stash account, not increasing the staked value. @@ -206,55 +184,60 @@ //! //! ### Slashing details //! -//! A validator can be _reported_ to be offline at any point via [`on_offline_validator`](enum.Call.html#variant.on_offline_validator) public function. -//! Each validator declares how many times it can be _reported_ before it actually gets slashed via their -//! `unstake_threshold` in [`ValidatorPrefs`]. +//! A validator can be _reported_ to be offline at any point via the public function +//! [`on_offline_validator`](enum.Call.html#variant.on_offline_validator). Each validator declares how many times it +//! can be _reported_ before it actually gets slashed via its +//! [`unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold). //! -//! On top of this, staking module also introduces an [`OfflineSlashGrace`], which applies to all validators and prevents -//! them from getting immediately slashed. +//! On top of this, the Staking module also introduces an +//! [`OfflineSlashGrace`](./struct.Module.html#method.offline_slash_grace), which applies +//! to all validators and prevents them from getting immediately slashed. //! -//! Essentially, a validator gets slashed once they have been reported more than [`OfflineSlashGrace`] + [`unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold) times. -//! Getting slashed due to offline report always leads to being _unstaked_ (_i.e._ removed as a validator candidate) as the consequence. +//! Essentially, a validator gets slashed once they have been reported more than +//! [`OfflineSlashGrace`] + [`unstake_threshold`] times. Getting slashed due to offline report always leads +//! to being _unstaked_ (_i.e._ removed as a validator candidate) as the consequence. //! -//! The base slash value is computed _per slash-event_ by multiplying [`OfflineSlash`] and the `total` [`Exposure`]. This value -//! is then multiplied by `2.pow(unstake_threshold)` to obtain the final slash value. -//! All individual accounts' punishments are capped at their total stake (NOTE: This cap should never come into force in a correctly implemented, non-corrupted, well-configured system). +//! The base slash value is computed _per slash-event_ by multiplying +//! [`OfflineSlash`](./struct.Module.html#method.offline_slash) and the `total` `Exposure`. This value is then +//! multiplied by `2.pow(unstake_threshold)` to obtain the final slash value. All individual accounts' punishments are +//! capped at their total stake (NOTE: This cap should never come into force in a correctly implemented, +//! non-corrupted, well-configured system). //! //! ### Additional Fund Management Operations //! //! Any funds already placed into stash can be the target of the following operations: //! -//! The controller account can free a portion (or all) of the funds using the [`unbond`](enum.Call.html#variant.unbond) call. -//! Note that the funds are not immediately accessible. Instead, a duration denoted by [`BondingDuration`] (in number of eras) -//! must pass until the funds can actually be removed. Once the [`BondingDuration`] is over the [`withdraw_unbonded`]((enum.Call.html#variant.withdraw_unbonded)) call can be used +//! The controller account can free a portion (or all) of the funds using the [`unbond`](enum.Call.html#variant.unbond) +//! call. Note that the funds are not immediately accessible. Instead, a duration denoted by +//! [`BondingDuration`](./struct.BondingDuration.html) (in number of eras) must pass until the funds can actually be +//! removed. Once the `BondingDuration` is over, the [`withdraw_unbonded`](./enum.Call.html#variant.withdraw_unbonded) call can be used //! to actually withdraw the funds. //! -//!### Election Algorithm +//! ### Election Algorithm //! //! The current election algorithm is implemented based on Phragmén. //! The reference implementation can be found [here](https://github.com/w3f/consensus/tree/master/NPoS). //! -//! The election algorithm, aside from electing the validators with the most stake value and votes, tries to divide the nominator votes -//! among candidates in an equal manner. To further assure this, an optional post-processing can be applied that iteratively normalizes the nominator staked values -//! until the total difference among votes of a particular nominator are less than a threshold. -//! +//! The election algorithm, aside from electing the validators with the most stake value and votes, tries to divide +//! the nominator votes among candidates in an equal manner. To further assure this, an optional post-processing +//! can be applied that iteractively normalizes the nominator staked values until the total difference among +//! votes of a particular nominator are less than a threshold. //! //! ## GenesisConfig //! -//! See the [`GenesisConfig`] for a list of attributes that can be provided. +//! The Staking module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). //! //! ## Related Modules //! -//! - [**Balances**](https://crates.parity.io/srml_balances/index.html): Used to manage values at stake. -//! - [**Sessions**](https://crates.parity.io/srml_session/index.html): Used to manage sessions. Also, a list of new validators is also stored in the sessions module's `Validators` at the end of each era. -//! - [**System**](https://crates.parity.io/srml_system/index.html): Used to obtain block number and time, among other details. -//! +//! - [Balances](../srml_balances/index.html): Used to manage values at stake. +//! - [Session](../srml_session/index.html): Used to manage sessions. Also, a list of new validators is +//! stored in the Session module's `Validators` at the end of each era. #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] use runtime_io::with_storage; -use rstd::{prelude::*, result}; +use rstd::{prelude::*, result, collections::btree_map::BTreeMap}; use parity_codec::{HasCompact, Encode, Decode}; use srml_support::{StorageValue, StorageMap, EnumerableStorageMap, dispatch::Result}; use srml_support::{decl_module, decl_event, decl_storage, ensure}; @@ -264,7 +247,10 @@ use srml_support::traits::{ }; use session::OnSessionChange; use primitives::Perbill; -use primitives::traits::{Convert, Zero, One, As, StaticLookup, CheckedSub, Saturating, Bounded}; +use primitives::traits::{ + Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, + Bounded, SaturatedConversion +}; #[cfg(feature = "std")] use primitives::{Serialize, Deserialize}; use system::ensure_signed; @@ -273,7 +259,7 @@ mod mock; mod tests; mod phragmen; -use phragmen::{elect, ElectionConfig}; +use phragmen::{elect, ACCURACY, ExtendedBalance}; const RECENT_OFFLINE_COUNT: usize = 32; const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4; @@ -411,12 +397,19 @@ type BalanceOf = <::Currency as Currency<::Ac type PositiveImbalanceOf = <::Currency as Currency<::AccountId>>::PositiveImbalance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +type RawAssignment = (::AccountId, ExtendedBalance); +type Assignment = (::AccountId, ExtendedBalance, BalanceOf); +type ExpoMap = BTreeMap<::AccountId, Exposure<::AccountId, BalanceOf>>; + pub trait Trait: system::Trait + session::Trait { /// The staking balance. type Currency: LockableCurrency; /// Convert a balance into a number used for election calculation. /// This must fit into a `u64` but is allowed to be sensibly lossy. + /// TODO: #1377 + /// The backward convert should be removed as the new Phragmen API returns ratio. + /// The post-processing needs it but will be moved to off-chain. type CurrencyToVote: Convert, u64> + Convert>; /// Some tokens minted. @@ -442,15 +435,15 @@ decl_storage! { /// Minimum number of staking participants before emergency conditions are imposed. pub MinimumValidatorCount get(minimum_validator_count) config(): u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT; /// The length of a staking era in sessions. - pub SessionsPerEra get(sessions_per_era) config(): T::BlockNumber = T::BlockNumber::sa(1000); + pub SessionsPerEra get(sessions_per_era) config(): T::BlockNumber = 1000.into(); /// Maximum reward, per validator, that is provided per acceptable session. - pub SessionReward get(session_reward) config(): Perbill = Perbill::from_billionths(60); + pub SessionReward get(session_reward) config(): Perbill = Perbill::from_parts(60); /// Slash, per validator that is taken for the first time they are found to be offline. - pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); // Perbill::from_fraction() is only for std, so use from_millionths(). + pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); /// Number of instances of offline reports before slashing begins for validators. pub OfflineSlashGrace get(offline_slash_grace) config(): u32; - /// The length of the bonding duration in blocks. - pub BondingDuration get(bonding_duration) config(): T::BlockNumber = T::BlockNumber::sa(1000); + /// The length of the bonding duration in eras. + pub BondingDuration get(bonding_duration) config(): T::BlockNumber = 12.into(); /// Any validators that may never be slashed or forcibly kicked. It's a Vec since they're easy to initialize /// and the performance hit is minimal (we expect no more than four invulnerables) and restricted to testnets. @@ -471,7 +464,7 @@ decl_storage! { pub Nominators get(nominators): linked_map T::AccountId => Vec; /// Nominators for a particular account that is in action right now. You can't iterate through validators here, - /// but you can find them in the `sessions` module. + /// but you can find them in the Session module. /// /// This is keyed by the stash account. pub Stakers get(stakers): map T::AccountId => Exposure>; @@ -515,7 +508,7 @@ decl_storage! { /// We are forcing a new era. pub ForcingNewEra get(forcing_new_era): Option<()>; - /// Most recent `RECENT_OFFLINE_COUNT` instances. (who it was, when it was reported, how many instances they were offline for). + /// Most recent `RECENT_OFFLINE_COUNT` instances. (Who it was, when it was reported, how many instances they were offline for). pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; } add_extra_genesis { @@ -763,16 +756,16 @@ decl_event!( pub enum Event where Balance = BalanceOf, ::AccountId { /// All validators have been rewarded by the given balance. Reward(Balance), - /// One validator (and their nominators) has been given a offline-warning (they're still - /// within their grace). The accrued number of slashes is recorded, too. + /// One validator (and its nominators) has been given an offline-warning (it is still + /// within its grace). The accrued number of slashes is recorded, too. OfflineWarning(AccountId, u32), - /// One validator (and their nominators) has been slashed by the given amount. + /// One validator (and its nominators) has been slashed by the given amount. OfflineSlash(AccountId, Balance), } ); impl Module { - // Just force_new_era without origin check. + /// Just force_new_era without origin check. fn apply_force_new_era(apply_rewards: bool) -> Result { >::put(()); >::apply_force_new_session(apply_rewards) @@ -799,12 +792,12 @@ impl Module { >::insert(controller, ledger); } - /// Slash a given validator by a specific amount. Removes the slash from their balance by preference, + /// Slash a given validator by a specific amount. Removes the slash from the validator's balance by preference, /// and reduces the nominators' balance if needed. fn slash_validator(stash: &T::AccountId, slash: BalanceOf) { // The exposure (backing stake) information of the validator to be slashed. let exposure = Self::stakers(stash); - // The amount we are actually going to slash (can't be bigger than their total exposure) + // The amount we are actually going to slash (can't be bigger than the validator's total exposure) let slash = slash.min(exposure.total); // The amount we'll slash from the validator's stash directly. let own_slash = exposure.own.min(slash); @@ -849,7 +842,7 @@ impl Module { } } - /// Reward a given validator by a specific amount. Add the reward to their, and their nominators' + /// Reward a given validator by a specific amount. Add the reward to the validator's, and its nominators' /// balance, pro-rata based on their exposure, after having removed the validator's pre-payout cut. fn reward_validator(stash: &T::AccountId, reward: BalanceOf) { let off_the_table = reward.min(Self::validators(stash).validator_payment); @@ -877,8 +870,12 @@ impl Module { if ideal_elapsed.is_zero() { return Self::current_session_reward(); } - let per65536: u64 = (T::Moment::sa(65536u64) * ideal_elapsed.clone() / actual_elapsed.max(ideal_elapsed)).as_(); - Self::current_session_reward() * >::sa(per65536) / >::sa(65536u64) + // Assumes we have 16-bits free at the top of T::Moment. Holds true for moment as seconds + // in a u64 for the forseeable future, but more correct would be to handle overflows + // explicitly. + let per65536 = T::Moment::from(65536) * ideal_elapsed.clone() / actual_elapsed.max(ideal_elapsed); + let per65536: BalanceOf = per65536.saturated_into::().into(); + Self::current_session_reward() * per65536 / 65536.into() } /// Session has just changed. We need to determine whether we pay a reward, slash and/or @@ -911,8 +908,10 @@ impl Module { Self::reward_validator(v, reward); } Self::deposit_event(RawEvent::Reward(reward)); - let total_minted = reward * as As>::sa(validators.len()); - let total_rewarded_stake = Self::slot_stake() * as As>::sa(validators.len()); + let len = validators.len() as u32; // validators length can never overflow u64 + let len: BalanceOf = len.into(); + let total_minted = reward * len; + let total_rewarded_stake = Self::slot_stake() * len; T::OnRewardMinted::on_dilution(total_minted, total_rewarded_stake); } @@ -940,22 +939,73 @@ impl Module { /// Select a new validator set from the assembled stakers and their role preferences. /// - /// Returns the new SlotStake value. + /// Returns the new `SlotStake` value. fn select_validators() -> BalanceOf { - let maybe_elected_candidates = elect::( + let maybe_elected_set = elect::( Self::validator_count() as usize, Self::minimum_validator_count().max(1) as usize, >::enumerate(), >::enumerate(), Self::slashable_balance_of, - ElectionConfig::> { - equalize: false, - tolerance: >::sa(10 as u64), - iterations: 10, - } ); - if let Some(elected_candidates) = maybe_elected_candidates { + if let Some(elected_set) = maybe_elected_set { + let elected_stashes = elected_set.0; + let assignments = elected_set.1; + + // helper closure. + let to_balance = |b: ExtendedBalance| >>::convert(b); + let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; + + // The return value of this is safe to be converted to u64. + // The original balance, `b` is within the scope of u64. It is just extended to u128 + // to be properly multiplied by a ratio, which will lead to another value + // less than u64 for sure. The result can then be safely passed to `to_balance`. + // For now the backward convert is used. A simple `TryFrom` is also safe. + let ratio_of = |b, p| (p as ExtendedBalance).saturating_mul(to_votes(b)) / ACCURACY; + + // Compute the actual stake from nominator's ratio. + let mut assignments_with_stakes = assignments.iter().map(|(n, a)|( + n.clone(), + Self::slashable_balance_of(n), + a.iter().map(|(acc, r)| ( + acc.clone(), + *r, + to_balance(ratio_of(Self::slashable_balance_of(n), *r)), + )) + .collect::>>() + )).collect::, Vec>)>>(); + + // update elected candidate exposures. + let mut exposures = >::new(); + elected_stashes + .iter() + .map(|e| (e, Self::slashable_balance_of(e))) + .for_each(|(e, s)| { + exposures.insert(e.clone(), Exposure { own: s, total: s, ..Default::default() }); + }); + + for (n, _, assignment) in &assignments_with_stakes { + for (c, _, s) in assignment { + if let Some(expo) = exposures.get_mut(c) { + // NOTE: simple example where this saturates: + // candidate with max_value stake. 1 nominator with max_value stake. + // Nuked. Sadly there is not much that we can do about this. + // See this test: phragmen_should_not_overflow_xxx() + expo.total = expo.total.saturating_add(*s); + expo.others.push( IndividualExposure { who: n.clone(), value: *s } ); + } + } + } + + // This optimization will most likely be only applied off-chain. + let do_equalise = false; + if do_equalise { + let tolerance = 10 as u128; + let iterations = 10 as usize; + phragmen::equalize::(&mut assignments_with_stakes, &mut exposures, tolerance, iterations); + } + // Clear Stakers and reduce their slash_count. for v in Self::current_elected().iter() { >::remove(v); @@ -966,17 +1016,16 @@ impl Module { } // Populate Stakers and figure out the minimum stake behind a slot. - let mut slot_stake = elected_candidates[0].exposure.total; - for c in &elected_candidates { - if c.exposure.total < slot_stake { - slot_stake = c.exposure.total; + let mut slot_stake = BalanceOf::::max_value(); + for (c, e) in exposures.iter() { + if e.total < slot_stake { + slot_stake = e.total; } - >::insert(c.who.clone(), c.exposure.clone()); + >::insert(c.clone(), e.clone()); } >::put(&slot_stake); // Set the new validator set. - let elected_stashes = elected_candidates.into_iter().map(|i| i.who).collect::>(); >::put(&elected_stashes); >::set_validators( &elected_stashes.into_iter().map(|s| Self::bonded(s).unwrap_or_default()).collect::>() @@ -989,6 +1038,7 @@ impl Module { // We should probably disable all functionality except for block production // and let the chain keep producing blocks until we can decide on a sufficiently // substantial set. + // TODO: #2494 Self::slot_stake() } } @@ -998,8 +1048,6 @@ impl Module { /// /// NOTE: This is called with the controller (not the stash) account id. pub fn on_offline_validator(controller: T::AccountId, count: usize) { - use primitives::traits::CheckedShl; - if let Some(l) = Self::ledger(&controller) { let stash = l.stash; diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs index 9f6732033aa4b8a4cf05a127b627b8173c4fb2ad..56f6419c06ec1704fb80115a5cf1acee46e55de5 100644 --- a/srml/staking/src/phragmen.rs +++ b/srml/staking/src/phragmen.rs @@ -16,43 +16,36 @@ //! Rust implementation of the Phragmén election algorithm. -use rstd::prelude::*; -use primitives::PerU128; -use primitives::traits::{Zero, Saturating, Convert}; -use parity_codec::{HasCompact, Encode, Decode}; -use crate::{Exposure, BalanceOf, Trait, ValidatorPrefs, IndividualExposure}; +use rstd::{prelude::*, collections::btree_map::BTreeMap}; +use primitives::{PerU128}; +use primitives::traits::{Zero, Convert, Saturating}; +use parity_codec::{Encode, Decode}; +use crate::{BalanceOf, Assignment, RawAssignment, ExpoMap, Trait, ValidatorPrefs}; type Fraction = PerU128; -type ExtendedBalance = u128; -const SCALE_FACTOR_64: u128 = u64::max_value() as u128 + 1; - -/// Configure the behavior of the Phragmen election. -/// Might be deprecated. -pub struct ElectionConfig { - /// Perform equalize?. - pub equalize: bool, - /// Number of equalize iterations. - pub iterations: usize, - /// Tolerance of max change per equalize iteration. - pub tolerance: Balance, -} +/// Wrapper around the type used as the _safe_ wrapper around a `balance`. +pub type ExtendedBalance = u128; + +// this is only used while creating the candidate score. Due to reasons explained below +// The more accurate this is, the less likely we choose a wrong candidate. +const SCALE_FACTOR: ExtendedBalance = u32::max_value() as ExtendedBalance + 1; +/// These are used to expose a fixed accuracy to the caller function. The bigger they are, +/// the more accurate we get, but the more likely it is for us to overflow. The case of overflow +/// is handled but accuracy will be lost. 32 or 16 are reasonable values. +pub const ACCURACY: ExtendedBalance = u32::max_value() as ExtendedBalance + 1; /// Wrapper around validation candidates some metadata. #[derive(Clone, Encode, Decode, Default)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct Candidate { +pub struct Candidate { /// The validator's account pub who: AccountId, - /// Exposure struct, holding info about the value that the validator has in stake. - pub exposure: Exposure, /// Intermediary value used to sort candidates. pub score: Fraction, /// Accumulator of the stake of this candidate based on received votes. approval_stake: ExtendedBalance, /// Flag for being elected. elected: bool, - /// This is most often equal to `Exposure.total` but not always. Needed for [`equalize`] - backing_stake: ExtendedBalance } /// Wrapper around the nomination info of a single nominator for a group of validators. @@ -77,14 +70,10 @@ pub struct Edge { who: AccountId, /// Load of this vote. load: Fraction, - /// Final backing stake of this vote. - backing_stake: ExtendedBalance, - /// Index of the candidate stored in the 'candidates' vector + /// Equal to `edge.load / nom.load`. Stored only to be used with post-processing. + ratio: ExtendedBalance, + /// Index of the candidate stored in the 'candidates' vector. candidate_index: usize, - /// Index of the candidate stored in the 'elected_candidates' vector. Used only with equalize. - elected_idx: usize, - /// Indicates if this edge is a vote for an elected candidate. Used only with equalize. - elected: bool, } /// Perform election based on Phragmén algorithm. @@ -93,52 +82,55 @@ pub struct Edge { /// /// Returns an Option of elected candidates, if election is performed. /// Returns None if not enough candidates exist. +/// +/// The returned Option is a tuple consisting of: +/// - The list of elected candidates. +/// - The list of nominators and their associated vote weights. pub fn elect( validator_count: usize, minimum_validator_count: usize, validator_iter: FV, nominator_iter: FN, stash_of: FS, - config: ElectionConfig>, -) -> Option>>> where +) -> Option<(Vec, Vec<(T::AccountId, Vec>)>)> where FV: Iterator>)>, FN: Iterator)>, for <'r> FS: Fn(&'r T::AccountId) -> BalanceOf, { - let into_currency = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; - let into_votes = |b: ExtendedBalance| >>::convert(b); - let mut elected_candidates; + let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; + + // return structures + let mut elected_candidates: Vec; + let mut assigned: Vec<(T::AccountId, Vec>)>; + let mut c_idx_cache = BTreeMap::::new(); // 1- Pre-process candidates and place them in a container, optimisation and add phantom votes. // Candidates who have 0 stake => have no votes or all null-votes. Kick them out not. let mut nominators: Vec> = Vec::with_capacity(validator_iter.size_hint().0 + nominator_iter.size_hint().0); let mut candidates = validator_iter.map(|(who, _)| { let stash_balance = stash_of(&who); - Candidate { - who, - exposure: Exposure { total: stash_balance, own: stash_balance, others: vec![] }, - ..Default::default() - } + (Candidate { who, ..Default::default() }, stash_balance) }) - .filter_map(|mut c| { - c.approval_stake += into_currency(c.exposure.total); + .filter_map(|(mut c, s)| { + c.approval_stake += to_votes(s); if c.approval_stake.is_zero() { None } else { - Some(c) + Some((c, s)) } }) .enumerate() - .map(|(idx, c)| { + .map(|(idx, (c, s))| { nominators.push(Nominator { who: c.who.clone(), edges: vec![ Edge { who: c.who.clone(), candidate_index: idx, ..Default::default() }], - budget: into_currency(c.exposure.total), + budget: to_votes(s), load: Fraction::zero(), }); + c_idx_cache.insert(c.who.clone(), idx); c }) - .collect::>>>(); + .collect::>>(); // 2- Collect the nominators with the associated votes. // Also collect approval stake along the way. @@ -146,17 +138,17 @@ pub fn elect( let nominator_stake = stash_of(&who); let mut edges: Vec> = Vec::with_capacity(nominees.len()); for n in &nominees { - if let Some(idx) = candidates.iter_mut().position(|i| i.who == *n) { - candidates[idx].approval_stake = candidates[idx].approval_stake - .saturating_add(into_currency(nominator_stake)); - edges.push(Edge { who: n.clone(), candidate_index: idx, ..Default::default() }); - } + if let Some(idx) = c_idx_cache.get(n) { + // This candidate is valid + already cached. + candidates[*idx].approval_stake = candidates[*idx].approval_stake + .saturating_add(to_votes(nominator_stake)); + edges.push(Edge { who: n.clone(), candidate_index: *idx, ..Default::default() }); + } // else {} would be wrong votes. We don't really care about it. } - Nominator { who, edges: edges, - budget: into_currency(nominator_stake), + budget: to_votes(nominator_stake), load: Fraction::zero(), } })); @@ -166,6 +158,7 @@ pub fn elect( let validator_count = validator_count.min(candidates.len()); elected_candidates = Vec::with_capacity(validator_count); + assigned = Vec::with_capacity(validator_count); // Main election loop for _round in 0..validator_count { // Loop 1: initialize score @@ -179,13 +172,15 @@ pub fn elect( for e in &n.edges { let c = &mut candidates[e.candidate_index]; if !c.elected && !c.approval_stake.is_zero() { + // Basic fixed-point shifting by 32. + // `n.budget.saturating_mul(SCALE_FACTOR)` will never saturate + // since n.budget cannot exceed u64,despite being stored in u128. yet, + // `*n.load / SCALE_FACTOR` might collapse to zero. Hence, 32 or 16 bits are better scale factors. + // Note that left-associativity in operators precedence is crucially important here. let temp = - // Basic fixed-point shifting by 64. - // This will never saturate since n.budget cannot exceed u64,despite being stored in u128. - // Note that left-associativity in operators precedence is crucially important here. - n.budget.saturating_mul(SCALE_FACTOR_64) / c.approval_stake - * (*n.load / SCALE_FACTOR_64); - c.score = Fraction::from_max_value((*c.score).saturating_add(temp)); + n.budget.saturating_mul(SCALE_FACTOR) / c.approval_stake + * (*n.load / SCALE_FACTOR); + c.score = Fraction::from_parts((*c.score).saturating_add(temp)); } } } @@ -201,168 +196,201 @@ pub fn elect( for n in &mut nominators { for e in &mut n.edges { if e.who == winner.who { - e.load = Fraction::from_max_value(*winner.score - *n.load); + e.load = Fraction::from_parts(*winner.score - *n.load); n.load = winner.score; } } } - elected_candidates.push(winner.clone()); + elected_candidates.push(winner.who.clone()); } else { break } - } - // end of all rounds + } // end of all rounds // 4.1- Update backing stake of candidates and nominators for n in &mut nominators { + let mut assignment = (n.who.clone(), vec![]); for e in &mut n.edges { - // if the target of this vote is among the winners, otherwise let go. - if let Some(c) = elected_candidates.iter_mut().find(|c| c.who == e.who) { - e.elected = true; - e.backing_stake = n.budget.saturating_mul(*e.load) / n.load.max(1); - c.backing_stake = c.backing_stake.saturating_add(e.backing_stake); - if c.who != n.who { - // Only update the exposure if this vote is from some other account. - c.exposure.total = c.exposure.total.saturating_add(into_votes(e.backing_stake)); - c.exposure.others.push( - IndividualExposure { who: n.who.clone(), value: into_votes(e.backing_stake) } - ); + if let Some(c) = elected_candidates.iter().find(|c| **c == e.who) { + if *c != n.who { + let ratio = { + // Full support. No need to calculate. + if *n.load == *e.load { ACCURACY } + else { + // This should not saturate. Safest is to just check + if let Some(r) = ACCURACY.checked_mul(*e.load) { + r / n.load.max(1) + } else { + // Just a simple trick. + *e.load / (n.load.max(1) / ACCURACY) + } + } + }; + e.ratio = ratio; + assignment.1.push((e.who.clone(), ratio)); } } } - } - // Optionally perform equalize post-processing. - if config.equalize { - let tolerance = config.tolerance; - let equalize_iterations = config.iterations; - - // Fix indexes - nominators.iter_mut().for_each(|n| { - n.edges.iter_mut().for_each(|e| { - if let Some(idx) = elected_candidates.iter().position(|c| c.who == e.who) { - e.elected_idx = idx; + if assignment.1.len() > 0 { + // To ensure an assertion indicating: no stake from the nominator going to waste, + // we add a minimal post-processing to equally assign all of the leftover stake ratios. + let vote_count = assignment.1.len() as ExtendedBalance; + let l = assignment.1.len(); + let sum = assignment.1.iter().map(|a| a.1).sum::(); + let diff = ACCURACY.checked_sub(sum).unwrap_or(0); + let diff_per_vote= diff / vote_count; + + if diff_per_vote > 0 { + for i in 0..l { + assignment.1[i%l].1 = + assignment.1[i%l].1 + .saturating_add(diff_per_vote); } - }); - }); + } - for _i in 0..equalize_iterations { - let mut max_diff = >::zero(); - nominators.iter_mut().for_each(|mut n| { - let diff = equalize::(&mut n, &mut elected_candidates, tolerance); - if diff > max_diff { - max_diff = diff; - } - }); - if max_diff < tolerance { - break; + // `remainder` is set to be less than maximum votes of a nominator (currently 16). + // safe to cast it to usize. + let remainder = diff - diff_per_vote * vote_count; + for i in 0..remainder as usize { + assignment.1[i%l].1 = + assignment.1[i%l].1 + .saturating_add(1); } + assigned.push(assignment); } } + } else { // if we have less than minimum, use the previous validator set. return None } - Some(elected_candidates) + Some((elected_candidates, assigned)) } /// Performs equalize post-processing to the output of the election algorithm /// This function mutates the input parameters, most noticeably it updates the exposure of /// the elected candidates. -/// The return value is to tolerance at which the function has stopped. +/// +/// No value is returned from the function and the `expo_map` parameter is updated. pub fn equalize( - nominator: &mut Nominator, - elected_candidates: &mut Vec>>, - _tolerance: BalanceOf -) -> BalanceOf { - let into_currency = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; - let into_votes = |b: ExtendedBalance| >>::convert(b); - let tolerance = into_currency(_tolerance); - - let mut elected_edges = nominator.edges - .iter_mut() - .filter(|e| e.elected) - .collect::>>(); - - if elected_edges.len() == 0 { - return >::zero(); + assignments: &mut Vec<(T::AccountId, BalanceOf, Vec>)>, + expo_map: &mut ExpoMap, + tolerance: ExtendedBalance, + iterations: usize, +) { + for _i in 0..iterations { + let mut max_diff = 0; + assignments.iter_mut().for_each(|(n, budget, assignment)| { + let diff = do_equalize::(&n, *budget, assignment, expo_map, tolerance); + if diff > max_diff { + max_diff = diff; + } + }); + if max_diff < tolerance { + break; + } } +} + +fn do_equalize( + nominator: &T::AccountId, + budget_balance: BalanceOf, + elected_edges_balance: &mut Vec>, + expo_map: &mut ExpoMap, + tolerance: ExtendedBalance +) -> ExtendedBalance { + let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance; + let to_balance = |v: ExtendedBalance| >>::convert(v); + let budget = to_votes(budget_balance); + + // Convert all stakes to extended. Result is Vec<(Acc, Ratio, Balance)> + let mut elected_edges = elected_edges_balance + .into_iter() + .map(|e| (e.0.clone(), e.1, to_votes(e.2))) + .collect::>(); let stake_used = elected_edges .iter() - .fold(0, |s, e| s.saturating_add(e.backing_stake)); - let backed_stakes = elected_edges + .fold(0 as ExtendedBalance, |s, e| s.saturating_add(e.2)); + + let backed_stakes_iter = elected_edges .iter() - .map(|e| elected_candidates[e.elected_idx].backing_stake) - .collect::>(); + .filter_map(|e| expo_map.get(&e.0)) + .map(|e| to_votes(e.total)); + let backing_backed_stake = elected_edges .iter() - .filter(|e| e.backing_stake > 0) - .map(|e| elected_candidates[e.elected_idx].backing_stake) + .filter(|e| e.2 > 0) + .filter_map(|e| expo_map.get(&e.0)) + .map(|e| to_votes(e.total)) .collect::>(); let mut difference; if backing_backed_stake.len() > 0 { - let max_stake = *backing_backed_stake + let max_stake = backing_backed_stake .iter() .max() .expect("vector with positive length will have a max; qed"); - let min_stake = *backed_stakes - .iter() + let min_stake = backed_stakes_iter .min() - .expect("vector with positive length will have a min; qed"); + .expect("iterator with positive length will have a min; qed"); + difference = max_stake.saturating_sub(min_stake); - difference = difference.saturating_add(nominator.budget.saturating_sub(stake_used)); + difference = difference.saturating_add(budget.saturating_sub(stake_used)); if difference < tolerance { - return into_votes(difference); + return difference; } } else { - difference = nominator.budget; + difference = budget; } // Undo updates to exposure elected_edges.iter_mut().for_each(|e| { - // NOTE: no assertions in the runtime, but this should nonetheless be indicative. - //assert_eq!(elected_candidates[e.elected_idx].who, e.who); - elected_candidates[e.elected_idx].backing_stake -= e.backing_stake; - elected_candidates[e.elected_idx].exposure.total -= into_votes(e.backing_stake); - e.backing_stake = 0; + if let Some(expo) = expo_map.get_mut(&e.0) { + expo.total = expo.total.saturating_sub(to_balance(e.2)); + } + e.2 = 0; }); - elected_edges.sort_unstable_by_key(|e| elected_candidates[e.elected_idx].backing_stake); + elected_edges.sort_unstable_by_key(|e| e.2); let mut cumulative_stake: ExtendedBalance = 0; let mut last_index = elected_edges.len() - 1; - let budget = nominator.budget; elected_edges.iter_mut().enumerate().for_each(|(idx, e)| { - let stake = elected_candidates[e.elected_idx].backing_stake; - - let stake_mul = stake.saturating_mul(idx as ExtendedBalance); - let stake_sub = stake_mul.saturating_sub(cumulative_stake); - if stake_sub > budget { - last_index = idx.checked_sub(1).unwrap_or(0); - return + if let Some(expo) = expo_map.get_mut(&e.0) { + let stake: ExtendedBalance = to_votes(expo.total); + + let stake_mul = stake.saturating_mul(idx as ExtendedBalance); + let stake_sub = stake_mul.saturating_sub(cumulative_stake); + if stake_sub > budget { + last_index = idx.checked_sub(1).unwrap_or(0); + return + } + cumulative_stake = cumulative_stake.saturating_add(stake); } - cumulative_stake = cumulative_stake.saturating_add(stake); }); - let last_stake = elected_candidates[elected_edges[last_index].elected_idx].backing_stake; + let last_stake = elected_edges[last_index].2; let split_ways = last_index + 1; - let excess = nominator.budget + let excess = budget .saturating_add(cumulative_stake) .saturating_sub(last_stake.saturating_mul(split_ways as ExtendedBalance)); - let nominator_address = nominator.who.clone(); elected_edges.iter_mut().take(split_ways).for_each(|e| { - let c = &mut elected_candidates[e.elected_idx]; - e.backing_stake = (excess / split_ways as ExtendedBalance) - .saturating_add(last_stake) - .saturating_sub(c.backing_stake); - c.exposure.total = c.exposure.total.saturating_add(into_votes(e.backing_stake)); - c.backing_stake = c.backing_stake.saturating_add(e.backing_stake); - if let Some(i_expo) = c.exposure.others.iter_mut().find(|i| i.who == nominator_address) { - i_expo.value = into_votes(e.backing_stake); + if let Some(expo) = expo_map.get_mut(&e.0) { + e.2 = (excess / split_ways as ExtendedBalance) + .saturating_add(last_stake) + .saturating_sub(to_votes(expo.total)); + expo.total = expo.total.saturating_add(to_balance(e.2)); + if let Some(i_expo) = expo.others.iter_mut().find(|i| i.who == nominator.clone()) { + i_expo.value = to_balance(e.2); + } } }); - into_votes(difference) + + // Store back the individual edge weights. + elected_edges.iter().enumerate().for_each(|(idx, e)| elected_edges_balance[idx].2 = to_balance(e.2)); + + difference } diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index e62b59d4892d7057de8f3e0e441aa7764e45eb59..17885dc2510220718ad1f510a5372d403cfab56e 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -21,11 +21,45 @@ use super::*; use runtime_io::with_externalities; use phragmen; -use primitives::PerU128; use srml_support::{assert_ok, assert_noop, assert_eq_uvec, EnumerableStorageMap}; use mock::{Balances, Session, Staking, System, Timestamp, Test, ExtBuilder, Origin}; use srml_support::traits::{Currency, ReservableCurrency}; +#[inline] +fn check_exposure(acc: u64) { + let expo = Staking::stakers(&acc); + assert_eq!(expo.total as u128, expo.own as u128 + expo.others.iter().map(|e| e.value as u128).sum::()); +} + +#[inline] +fn check_exposure_all() { + Staking::current_elected().into_iter().for_each(|acc| check_exposure(acc)); +} + +#[inline] +fn assert_total_expo(acc: u64, val: u64) { + let expo = Staking::stakers(&acc); + assert_eq!(expo.total, val); +} + +#[inline] +fn bond_validator(acc: u64, val: u64) { + // a = controller + // a + 1 = stash + let _ = Balances::make_free_balance_be(&(acc+1), val); + assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller)); + assert_ok!(Staking::validate(Origin::signed(acc), ValidatorPrefs::default())); +} + +#[inline] +fn bond_nominator(acc: u64, val: u64, target: Vec) { + // a = controller + // a + 1 = stash + let _ = Balances::make_free_balance_be(&(acc+1), val); + assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller)); + assert_ok!(Staking::nominate(Origin::signed(acc), target)); +} + #[test] fn basic_setup_works() { // Verifies initial conditions of mock @@ -55,7 +89,7 @@ fn basic_setup_works() { assert_eq!(Staking::nominators(101), vec![11, 21]); // Account 10 is exposed by 1000 * balance_factor from their own stash in account 11 + the default nominator vote - assert_eq!(Staking::stakers(11), Exposure { total: 1124, own: 1000, others: vec![ IndividualExposure { who: 101, value: 124 }] }); + assert_eq!(Staking::stakers(11), Exposure { total: 1125, own: 1000, others: vec![ IndividualExposure { who: 101, value: 125 }] }); // Account 20 is exposed by 1000 * balance_factor from their own stash in account 21 + the default nominator vote assert_eq!(Staking::stakers(21), Exposure { total: 1375, own: 1000, others: vec![ IndividualExposure { who: 101, value: 375 }] }); @@ -70,11 +104,14 @@ fn basic_setup_works() { assert_eq!(Staking::current_session_reward(), 10); // initial slot_stake - assert_eq!(Staking::slot_stake(), 1124); // Naive + assert_eq!(Staking::slot_stake(), 1125); // Naive // initial slash_count of validators assert_eq!(Staking::slash_count(&11), 0); assert_eq!(Staking::slash_count(&21), 0); + + // All exposures must be correct. + check_exposure_all(); }); } @@ -97,6 +134,31 @@ fn no_offline_should_work() { }); } +#[test] +fn change_controller_works() { + with_externalities(&mut ExtBuilder::default().build(), + || { + assert_eq!(Staking::bonded(&11), Some(10)); + + assert!(>::enumerate().map(|(c, _)| c).collect::>().contains(&11)); + // 10 can control 11 who is initially a validator. + assert_ok!(Staking::chill(Origin::signed(10))); + assert!(!>::enumerate().map(|(c, _)| c).collect::>().contains(&11)); + + assert_ok!(Staking::set_controller(Origin::signed(11), 5)); + + System::set_block_number(1); + Session::check_rotate_session(System::block_number()); + assert_eq!(Staking::current_era(), 1); + + assert_noop!( + Staking::validate(Origin::signed(10), ValidatorPrefs::default()), + "not a controller" + ); + assert_ok!(Staking::validate(Origin::signed(5), ValidatorPrefs::default())); + }) +} + #[test] fn invulnerability_should_work() { // Test that users can be invulnerable from slashing and being kicked @@ -282,7 +344,7 @@ fn rewards_should_work() { .sessions_per_era(3) .build(), || { - let delay = 0; + let delay = 1; // this test is only in the scope of one era. Since this variable changes // at the last block/new era, we'll save it. let session_reward = 10; @@ -305,7 +367,6 @@ fn rewards_should_work() { assert_eq!(Balances::total_balance(&2), 500); // add a dummy nominator. - // NOTE: this nominator is being added 'manually'. a Further test (nomination_and_reward..) will add it via '.nominate()' >::insert(&11, Exposure { own: 500, // equal division indicates that the reward will be equally divided among validator and nominator. total: 1000, @@ -316,8 +377,7 @@ fn rewards_should_work() { assert_eq!(Staking::payee(2), RewardDestination::Stash); assert_eq!(Staking::payee(11), RewardDestination::Controller); - let mut block = 3; - // Block 3 => Session 1 => Era 0 + let mut block = 3; // Block 3 => Session 1 => Era 0 System::set_block_number(block); Timestamp::set_timestamp(block*5); // on time. Session::check_rotate_session(System::block_number()); @@ -354,16 +414,16 @@ fn rewards_should_work() { #[test] fn multi_era_reward_should_work() { - // should check that: + // Should check that: // The value of current_session_reward is set at the end of each era, based on - // slot_stake and session_reward. Check and verify this. + // slot_stake and session_reward. with_externalities(&mut ExtBuilder::default() .session_length(3) .sessions_per_era(3) .nominate(false) .build(), || { - let delay = 0; + let delay = 1; let session_reward = 10; // This is set by the test config builder. @@ -378,12 +438,12 @@ fn multi_era_reward_should_work() { let mut block = 3; // Block 3 => Session 1 => Era 0 System::set_block_number(block); - Timestamp::set_timestamp(block*5); // on time. + Timestamp::set_timestamp(block*5); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 1); - // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. + // session triggered: the reward value stashed should be 10 assert_eq!(Staking::current_session_reward(), session_reward); assert_eq!(Staking::current_era_reward(), session_reward); @@ -413,14 +473,14 @@ fn multi_era_reward_should_work() { assert_eq!(Staking::current_session_reward(), new_session_reward); // fast forward to next era: - block=12;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); - block=15;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + block=12; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + block=15; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); // intermediate test. assert_eq!(Staking::current_era_reward(), 2*new_session_reward); // new era is triggered here. - block=18;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + block=18; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); // pay time assert_eq!(Balances::total_balance(&10), 3*new_session_reward + recorded_balance); @@ -515,31 +575,28 @@ fn staking_should_work() { #[test] fn less_than_needed_candidates_works() { - // Test the situation where the number of validators are less than `ValidatorCount` but more than - // The expected behavior is to choose all the candidates that have some vote. with_externalities(&mut ExtBuilder::default() .minimum_validator_count(1) .validator_count(4) .nominate(false) .build(), || { - assert_eq!(Staking::era_length(), 1); assert_eq!(Staking::validator_count(), 4); assert_eq!(Staking::minimum_validator_count(), 1); + assert_eq_uvec!(Session::validators(), vec![30, 20, 10]); - // 10 and 20 are now valid candidates. - // trigger era System::set_block_number(1); Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 1); - // both validators will be chosen again. NO election algorithm is even executed. + // Previous set is selected. NO election algorithm is even executed. assert_eq_uvec!(Session::validators(), vec![30, 20, 10]); // But the exposure is updated in a simple way. No external votes exists. This is purely self-vote. - assert_eq!(Staking::stakers(10).others.iter().map(|e| e.who).collect::>>(), vec![]); - assert_eq!(Staking::stakers(20).others.iter().map(|e| e.who).collect::>>(), vec![]); - assert_eq!(Staking::stakers(30).others.iter().map(|e| e.who).collect::>>(), vec![]); + assert_eq!(Staking::stakers(10).others.len(), 0); + assert_eq!(Staking::stakers(20).others.len(), 0); + assert_eq!(Staking::stakers(30).others.len(), 0); + check_exposure_all(); }); } @@ -560,13 +617,15 @@ fn no_candidate_emergency_condition() { // initial validators assert_eq_uvec!(Session::validators(), vec![10, 20, 30, 40]); + let _ = Staking::chill(Origin::signed(10)); + // trigger era System::set_block_number(1); Session::check_rotate_session(System::block_number()); - assert_eq!(Staking::current_era(), 1); - // No one nominates => no one has a proper vote => no change + // Previous ones are elected. chill is invalidates. TODO: #2494 assert_eq_uvec!(Session::validators(), vec![10, 20, 30, 40]); + assert_eq!(Staking::current_elected().len(), 0); }); } @@ -656,15 +715,15 @@ fn nominating_and_rewards_should_work() { // total expo of 10, with 1200 coming from nominators (externals), according to phragmen. assert_eq!(Staking::stakers(11).own, 1000); - assert_eq!(Staking::stakers(11).total, 1000 + 798); + assert_eq!(Staking::stakers(11).total, 1000 + 800); // 2 and 4 supported 10, each with stake 600, according to phragmen. - assert_eq!(Staking::stakers(11).others.iter().map(|e| e.value).collect::>>(), vec![399, 399]); + assert_eq!(Staking::stakers(11).others.iter().map(|e| e.value).collect::>>(), vec![400, 400]); assert_eq!(Staking::stakers(11).others.iter().map(|e| e.who).collect::>>(), vec![3, 1]); // total expo of 20, with 500 coming from nominators (externals), according to phragmen. assert_eq!(Staking::stakers(21).own, 1000); - assert_eq!(Staking::stakers(21).total, 1000 + 1200); + assert_eq!(Staking::stakers(21).total, 1000 + 1198); // 2 and 4 supported 20, each with stake 250, according to phragmen. - assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), vec![600, 600]); + assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), vec![599, 599]); assert_eq!(Staking::stakers(21).others.iter().map(|e| e.who).collect::>>(), vec![3, 1]); // They are not chosen anymore @@ -685,9 +744,11 @@ fn nominating_and_rewards_should_work() { assert_eq!(Balances::total_balance(&4), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11)); // 10 got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 - assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9 + 2) ; + assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9); // 10 got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11 assert_eq!(Balances::total_balance(&20), initial_balance + 5*new_session_reward/11); + + check_exposure_all(); }); } @@ -701,7 +762,7 @@ fn nominators_also_get_slashed() { assert_eq!(Staking::offline_slash_grace(), 0); // Account 10 has not been reported offline assert_eq!(Staking::slash_count(&10), 0); - >::put(Perbill::from_percent(12)); + >::put(Perbill::from_percent(12)); // Set payee to controller assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); @@ -735,6 +796,7 @@ fn nominators_also_get_slashed() { // initial + first era reward + slash assert_eq!(Balances::total_balance(&10), initial_balance + 10 - validator_slash); assert_eq!(Balances::total_balance(&2), initial_balance - nominator_slash); + check_exposure_all(); // Because slashing happened. assert!(Staking::forcing_new_era().is_some()); }); @@ -1050,6 +1112,8 @@ fn validator_payment_prefs_work() { assert_eq!(Balances::total_balance(&10), 1); // Rest of the reward will be shared and paid to the nominator in stake. assert_eq!(Balances::total_balance(&2), 500 + shared_cut/2); + + check_exposure_all(); }); } @@ -1220,6 +1284,8 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment( assert_eq!(Staking::slash_count(&11), 4); // check the balance of 10 (slash will be deducted from free balance.) assert_eq!(Balances::free_balance(&11), 1000 + 10 - 50 /*5% of 1000*/ * 8 /*2**3*/); + + check_exposure_all(); }); } @@ -1432,11 +1498,12 @@ fn phragmen_poc_works() { assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).collect::>>(), vec![333, 333]); assert_eq!(Staking::stakers(21).others.iter().map(|e| e.value).sum::>(), 666); assert_eq!(Staking::stakers(21).others.iter().map(|e| e.who).collect::>>(), vec![3, 1]); + check_exposure_all(); }); } #[test] -fn phragmen_election_works_with_post_processing() { +fn phragmen_poc_2_works() { // tests the encapsulated phragmen::elect function. // Votes [ // ('10', 1000, ['10']), @@ -1448,32 +1515,6 @@ fn phragmen_election_works_with_post_processing() { // Sequential Phragmén gives // 10 is elected with stake 1705.7377049180327 and score 0.0004878048780487805 // 30 is elected with stake 1344.2622950819673 and score 0.0007439024390243903 - - // 10 has load 0.0004878048780487805 and supported - // 10 with stake 1000.0 - // 20 has load 0 and supported - // 20 with stake 0 - // 30 has load 0.0007439024390243903 and supported - // 30 with stake 1000.0 - // 2 has load 0.0004878048780487805 and supported - // 10 with stake 50.0 20 with stake 0.0 - // 4 has load 0.0007439024390243903 and supported - // 10 with stake 655.7377049180328 30 with stake 344.26229508196724 - - // Sequential Phragmén with post processing gives - // 10 is elected with stake 1525.0 and score 0.0004878048780487805 - // 30 is elected with stake 1525.0 and score 0.0007439024390243903 - - // 10 has load 0.0004878048780487805 and supported - // 10 with stake 1000.0 - // 20 has load 0 and supported - // 20 with stake 0 - // 30 has load 0.0007439024390243903 and supported - // 30 with stake 1000.0 - // 2 has load 0.0004878048780487805 and supported - // 10 with stake 50.0 20 with stake 0.0 - // 4 has load 0.0007439024390243903 and supported - // 10 with stake 475.0 30 with stake 525.0 with_externalities(&mut ExtBuilder::default().nominate(false).build(), || { // initial setup of 10 and 20, both validators assert_eq_uvec!(Session::validators(), vec![20, 10]); @@ -1497,30 +1538,17 @@ fn phragmen_election_works_with_post_processing() { >::enumerate(), >::enumerate(), Staking::slashable_balance_of, - ElectionConfig::> { - equalize: true, - tolerance: >::sa(10 as u64), - iterations: 10, - } ); - let winners = winners.unwrap(); + let (winners, assignment) = winners.unwrap(); // 10 and 30 must be the winners - assert_eq!(winners.iter().map(|w| w.who).collect::>>(), vec![11, 31]); - - let winner_10 = winners.iter().filter(|w| w.who == 11).nth(0).unwrap(); - let winner_30 = winners.iter().filter(|w| w.who == 31).nth(0).unwrap(); - - // Check exposures - assert_eq!(winner_10.exposure.total, 1000 + 525); - assert_eq!(winner_10.score, PerU128::from_max_value(165991398498018762665060784113057664)); - assert_eq!(winner_10.exposure.others[0].value, 475); - assert_eq!(winner_10.exposure.others[1].value, 50); - - assert_eq!(winner_30.exposure.total, 1000 + 525); - assert_eq!(winner_30.score, PerU128::from_max_value(253136882709478612992230401826229321)); - assert_eq!(winner_30.exposure.others[0].value, 525); + assert_eq!(winners, vec![11, 31]); + assert_eq!(assignment, vec![ + (3, vec![(11, 2816371998), (31, 1478595298)]), + (1, vec![(11, 4294967296)]), + ]); + check_exposure_all(); }) } @@ -1593,6 +1621,7 @@ fn switching_roles() { System::set_block_number(6); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![2, 20]); + check_exposure_all(); }); } @@ -1728,6 +1757,7 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() { assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(1)); // same for 10 assert_eq!(Balances::free_balance(&10), initial_balance_10 + 10 + reward.max(1)); + check_exposure_all(); }); } @@ -1741,17 +1771,6 @@ fn phragmen_linear_worse_case_equalize() { .fair(true) .build(), || { - let bond_validator = |a, b| { - let _ = Balances::deposit_creating(&(a-1), b); - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - let _ = Balances::deposit_creating(&(a-1), b); - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - for i in &[10, 20, 30, 40] { assert_ok!(Staking::set_payee(Origin::signed(*i), RewardDestination::Controller)); } bond_validator(50, 1000); @@ -1763,8 +1782,8 @@ fn phragmen_linear_worse_case_equalize() { bond_nominator(6, 1000, vec![21, 31]); bond_nominator(8, 1000, vec![31, 41]); bond_nominator(110, 1000, vec![41, 51]); - bond_nominator(112, 1000, vec![51, 61]); - bond_nominator(114, 1000, vec![61, 71]); + bond_nominator(120, 1000, vec![51, 61]); + bond_nominator(130, 1000, vec![61, 71]); assert_eq_uvec!(Session::validators(), vec![40, 30]); assert_ok!(Staking::set_validator_count(7)); @@ -1776,20 +1795,22 @@ fn phragmen_linear_worse_case_equalize() { // Sequential Phragmén with post processing gives // 10 is elected with stake 3000.0 and score 0.00025 + // 20 is elected with stake 2017.7421569824219 and score 0.0005277777777777777 // 30 is elected with stake 2008.8712884829595 and score 0.0003333333333333333 + // 40 is elected with stake 2000.0001049958742 and score 0.0005555555555555556 // 50 is elected with stake 2000.0001049958742 and score 0.0003333333333333333 // 60 is elected with stake 1991.128921508789 and score 0.0004444444444444444 - // 20 is elected with stake 2017.7421569824219 and score 0.0005277777777777777 - // 40 is elected with stake 2000.0001049958742 and score 0.0005555555555555556 // 70 is elected with stake 1982.2574230340813 and score 0.0007222222222222222 + check_exposure_all(); + assert_eq!(Staking::stakers(11).total, 3000); - assert_eq!(Staking::stakers(31).total, 2035); - assert_eq!(Staking::stakers(51).total, 2000); - assert_eq!(Staking::stakers(61).total, 1968); - assert_eq!(Staking::stakers(21).total, 2035); - assert_eq!(Staking::stakers(41).total, 2024); - assert_eq!(Staking::stakers(71).total, 1936); + assert_eq!(Staking::stakers(21).total, 2209); + assert_eq!(Staking::stakers(31).total, 2027); + assert_eq!(Staking::stakers(41).total, 2010); + assert_eq!(Staking::stakers(51).total, 2010); + assert_eq!(Staking::stakers(61).total, 1998); + assert_eq!(Staking::stakers(71).total, 1983); }) } @@ -1809,6 +1830,7 @@ fn phragmen_chooses_correct_number_of_validators() { Session::check_rotate_session(System::block_number()); assert_eq!(Session::validators().len(), 1); + check_exposure_all(); }) } @@ -1816,18 +1838,9 @@ fn phragmen_chooses_correct_number_of_validators() { #[test] fn phragmen_score_should_be_accurate_on_large_stakes() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - + .nominate(false) + .build(), + || { bond_validator(2, u64::max_value()); bond_validator(4, u64::max_value()); bond_validator(6, u64::max_value()-1); @@ -1837,184 +1850,114 @@ fn phragmen_score_should_be_accurate_on_large_stakes() { Session::check_rotate_session(System::block_number()); assert_eq!(Session::validators(), vec![4, 2]); + check_exposure_all(); }) } #[test] fn phragmen_should_not_overflow_validators() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_exposure = |a| { - let expo = Staking::stakers(&a); - assert_eq!(expo.total, expo.own + expo.others.iter().map(|e| e.value).sum::()); - }; - - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - + .nominate(false) + .build(), + || { let _ = Staking::chill(Origin::signed(10)); let _ = Staking::chill(Origin::signed(20)); bond_validator(2, u64::max_value()); bond_validator(4, u64::max_value()); - bond_nominator(6, u64::max_value()/2, vec![1, 3]); - bond_nominator(8, u64::max_value()/2, vec![1, 3]); + bond_nominator(6, u64::max_value()/2, vec![3, 5]); + bond_nominator(8, u64::max_value()/2, vec![3, 5]); System::set_block_number(2); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![4, 2]); - check_exposure(4); - check_exposure(2); + + // This test will fail this. Will saturate. + // check_exposure_all(); + assert_eq!(Staking::stakers(3).total, u64::max_value()); + assert_eq!(Staking::stakers(5).total, u64::max_value()); }) } #[test] fn phragmen_should_not_overflow_nominators() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_exposure = |a| { - let expo = Staking::stakers(&a); - assert_eq!(expo.total, expo.own + expo.others.iter().map(|e| e.value).sum::()); - }; - + .nominate(false) + .build(), + || { let _ = Staking::chill(Origin::signed(10)); let _ = Staking::chill(Origin::signed(20)); - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - bond_validator(2, u64::max_value()/2); bond_validator(4, u64::max_value()/2); - bond_nominator(6, u64::max_value(), vec![1, 3]); - bond_nominator(8, u64::max_value(), vec![1, 3]); + bond_nominator(6, u64::max_value(), vec![3, 5]); + bond_nominator(8, u64::max_value(), vec![3, 5]); System::set_block_number(2); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![4, 2]); - check_exposure(4); - check_exposure(2); + + // Saturate. + assert_eq!(Staking::stakers(3).total, u64::max_value()); + assert_eq!(Staking::stakers(5).total, u64::max_value()); }) } #[test] fn phragmen_should_not_overflow_ultimate() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .build() - , || { - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_exposure = |a| { - let expo = Staking::stakers(&a); - assert_eq!(expo.total, expo.own + expo.others.iter().map(|e| e.value).sum::()); - }; - - for i in 1..=8 { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } - + .nominate(false) + .build(), + || { bond_validator(2, u64::max_value()); bond_validator(4, u64::max_value()); - bond_nominator(6, u64::max_value(), vec![1, 3]); - bond_nominator(8, u64::max_value(), vec![1, 3]); + bond_nominator(6, u64::max_value(), vec![3, 5]); + bond_nominator(8, u64::max_value(), vec![3, 5]); System::set_block_number(2); Session::check_rotate_session(System::block_number()); assert_eq_uvec!(Session::validators(), vec![4, 2]); - check_exposure(4); - check_exposure(2); + + // Saturate. + assert_eq!(Staking::stakers(3).total, u64::max_value()); + assert_eq!(Staking::stakers(5).total, u64::max_value()); }) } #[test] -fn large_scale_test() { +fn phragmen_large_scale_test() { with_externalities(&mut ExtBuilder::default() - .nominate(false) - .minimum_validator_count(1) - .validator_count(20) - .build() - , || { + .nominate(false) + .minimum_validator_count(1) + .validator_count(20) + .build(), + || { let _ = Staking::chill(Origin::signed(10)); let _ = Staking::chill(Origin::signed(20)); - - let bond_validator = |a, b| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::validate(Origin::signed(a), ValidatorPrefs::default())); - }; - let bond_nominator = |a, b, v| { - assert_ok!(Staking::bond(Origin::signed(a-1), a, b, RewardDestination::Controller)); - assert_ok!(Staking::nominate(Origin::signed(a), v)); - }; - let check_expo = |e: Exposure| { - assert_eq!(e.total, e.own + e.others.iter().fold(0, |s, v| s + v.value)); - }; - + let _ = Staking::chill(Origin::signed(30)); let prefix = 200; - for i in prefix..=(prefix+50) { - let _ = Balances::make_free_balance_be(&i, u64::max_value()); - } bond_validator(prefix + 2, 1); - bond_validator(prefix + 4, 105); - bond_validator(prefix + 6, 3879248198); + bond_validator(prefix + 4, 100); + bond_validator(prefix + 6, 1000000); bond_validator(prefix + 8, 100000000001000); bond_validator(prefix + 10, 100000000002000); - bond_validator(prefix + 12, 150000000000000); + bond_validator(prefix + 12, 100000000003000); bond_validator(prefix + 14, 400000000000000); - bond_validator(prefix + 16, 524611669156413); - bond_validator(prefix + 18, 700000000000000); - bond_validator(prefix + 20, 797663650978304); - bond_validator(prefix + 22, 900003879248198); - bond_validator(prefix + 24, 997530000000000); - bond_validator(prefix + 26, 1000000000010000); - bond_validator(prefix + 28, 1000000000020000); - bond_validator(prefix + 30, 1000003879248198); - bond_validator(prefix + 32, 1200000000000000); - bond_validator(prefix + 34, 7997659802817256); - bond_validator(prefix + 36, 18000000000000000); - bond_validator(prefix + 38, 20000033025753738); - bond_validator(prefix + 40, 500000000000100000); - bond_validator(prefix + 42, 500000000000200000); - - Balances::make_free_balance_be(&50, u64::max_value()); - Balances::make_free_balance_be(&49, u64::max_value()); - bond_nominator(50, 990000068998617227, vec![ - prefix + 1, + bond_validator(prefix + 16, 400000000001000); + bond_validator(prefix + 18, 18000000000000000); + bond_validator(prefix + 20, 20000000000000000); + bond_validator(prefix + 22, 500000000000100000); + bond_validator(prefix + 24, 500000000000200000); + + bond_nominator(50, 990000000000000000, vec![ prefix + 3, prefix + 5, prefix + 7, @@ -2026,38 +1969,66 @@ fn large_scale_test() { prefix + 19, prefix + 21, prefix + 23, - prefix + 25, - prefix + 27, - prefix + 29, - prefix + 31, - prefix + 33, - prefix + 35, - prefix + 37, - prefix + 39, - prefix + 41, - prefix + 43, - prefix + 45] + prefix + 25] ); System::set_block_number(1); Session::check_rotate_session(System::block_number()); + // For manual inspection + println!("Validators are {:?}", Session::validators()); + println!("Validators are {:#?}", + Session::validators() + .iter() + .map(|v| (v.clone(), Staking::stakers(v+1))) + .collect::)>>() + ); + // Each exposure => total == own + sum(others) - Session::validators().iter().for_each(|acc| check_expo(Staking::stakers(acc-1))); + check_exposure_all(); // aside from some error, stake must be divided correctly + let individual_expo_sum: u128 = Session::validators() + .iter() + .map(|v| Staking::stakers(v+1)) + .fold(0u128, |s, v| if v.others.len() > 0 { s + v.others[0].value as u128 } else { s }); assert!( - 990000068998617227 - - Session::validators() - .iter() - .map(|v| Staking::stakers(v-1)) - .fold(0, |s, v| if v.others.len() > 0 { s + v.others[0].value } else { s }) - < 100 + 990000000000000000 - individual_expo_sum < 100, + format!( + "Nominator stake = {} / SUM(individual expo) = {} / diff = {}", + 990000000000000000u64, + individual_expo_sum, + 990000000000000000 - individual_expo_sum + ) ); + }) +} - // For manual inspection - println!("Validators are {:?}", Session::validators()); - println!("Validators are {:#?}", - Session::validators().iter().map(|v| (v.clone(), Staking::stakers(v-1)) ).collect::)>>()); +#[test] +fn phragmen_large_scale_test_2() { + with_externalities(&mut ExtBuilder::default() + .nominate(false) + .minimum_validator_count(1) + .validator_count(2) + .build(), + || { + let _ = Staking::chill(Origin::signed(10)); + let _ = Staking::chill(Origin::signed(20)); + let nom_budget: u64 = 1_000_000_000_000_000_000; + let c_budget: u64 = 4_000_000; + + bond_validator(2, c_budget as u64); + bond_validator(4, c_budget as u64); + + bond_nominator(50, nom_budget, vec![3, 5]); + + System::set_block_number(1); + Session::check_rotate_session(System::block_number()); + + // Each exposure => total == own + sum(others) + check_exposure_all(); + + assert_total_expo(3, nom_budget / 2 + c_budget); + assert_total_expo(5, nom_budget / 2 + c_budget); }) -} \ No newline at end of file +} diff --git a/srml/sudo/Cargo.toml b/srml/sudo/Cargo.toml index 220127ba3b67cdbe1096bd04925cb7f8ebe8b3a8..29ef579516fd58d7fe52f7611a3a678753b539ed 100644 --- a/srml/sudo/Cargo.toml +++ b/srml/sudo/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "srml-sudo" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } sr-std = { path = "../../core/sr-std", default-features = false } +sr-io = { path = "../../core/sr-io", default-features = false } sr-primitives = { path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } srml-support-procedural = { path = "../support/procedural" } @@ -24,6 +24,7 @@ std = [ "serde", "parity-codec/std", "sr-std/std", + "sr-io/std", "sr-primitives/std", "srml-support/std", "system/std", diff --git a/srml/sudo/src/lib.rs b/srml/sudo/src/lib.rs index 88e3a9c9655918ef4cc95a43dce0c6c94010c9a7..1caeac73b8b98ff6477cb6d8d00562baad6b2d6c 100644 --- a/srml/sudo/src/lib.rs +++ b/srml/sudo/src/lib.rs @@ -16,51 +16,31 @@ //! # Sudo Module //! +//! - [`sudo::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! //! ## Overview //! -//! The sudo module allows for a single account (called the "sudo key") +//! The Sudo module allows for a single account (called the "sudo key") //! to execute dispatchable functions that require a `Root` call //! or designate a new account to replace them as the sudo key. //! Only one account can be the sudo key at a time. //! -//! You can start using the sudo module by implementing the sudo [`Trait`]. -//! -//! Supported dispatchable functions are documented in the [`Call`] enum. -//! //! ## Interface //! //! ### Dispatchable Functions //! -//! Only the sudo key can call the dispatchable functions from the sudo module. +//! Only the sudo key can call the dispatchable functions from the Sudo module. //! //! * `sudo` - Make a `Root` call to a dispatchable function. //! * `set_key` - Assign a new account to be the sudo key. //! -//! Please refer to the [`Call`] enum and its associated variants for documentation on each function. -//! //! ## Usage //! -//! ### Prerequisites -//! -//! To use the sudo module in your runtime, you must implement the following trait in your runtime: -//! -//! ```ignore -//! impl sudo::Trait for Runtime { -//! type Event = Event; -//! type Proposal = Call; -//! } -//! ``` -//! -//! You can then import the Sudo module in your `construct_runtime!` macro with: -//! -//! ```ignore -//! Sudo: sudo, -//! ``` -//! //! ### Executing Privileged Functions //! -//! The sudo module itself is not intended to be used within other modules. -//! Instead, you can build "privileged functions" in other modules that require `Root` origin. +//! The Sudo module itself is not intended to be used within other modules. +//! Instead, you can build "privileged functions" (i.e. functions that require `Root` origin) in other modules. //! You can execute these privileged functions by calling `sudo` with the sudo key account. //! Privileged functions cannot be directly executed via an extrinsic. //! @@ -70,8 +50,8 @@ //! //! This is an example of a module that exposes a privileged function: //! -//! ```ignore -//! use support::{decl_module, dispatch::Result}; +//! ``` +//! use srml_support::{decl_module, dispatch::Result}; //! use system::ensure_root; //! //! pub trait Trait: system::Trait {} @@ -87,31 +67,13 @@ //! } //! } //! } -//! ``` -//! -//! ### Example from SRML -//! -//! The consensus module exposes a `set_code` privileged function -//! that allows you to set the on-chain Wasm runtime code: -//! -//! ```ignore -//! /// Set the new code. -//! pub fn set_code(new: Vec) { -//! storage::unhashed::put_raw(well_known_keys::CODE, &new); -//! } +//! # fn main() {} //! ``` //! //! ## Genesis Config //! -//! To use the sudo module, you need to set an initial superuser account as the sudo `key`. -//! -//! ```ignore -//! GenesisConfig { -//! sudo: Some(SudoConfig { -//! key: AccountId, -//! }) -//! } -//! ``` +//! The Sudo module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). +//! You need to set an initial superuser account as the sudo `key`. //! //! ## Related Modules //! @@ -126,7 +88,10 @@ use sr_std::prelude::*; use sr_primitives::traits::StaticLookup; -use srml_support::{StorageValue, Parameter, Dispatchable, decl_module, decl_event, decl_storage, ensure}; +use srml_support::{ + StorageValue, Parameter, Dispatchable, decl_module, decl_event, + decl_storage, ensure +}; use system::ensure_signed; pub trait Trait: system::Trait { @@ -150,8 +115,15 @@ decl_module! { let sender = ensure_signed(origin)?; ensure!(sender == Self::key(), "only the current sudo key can sudo"); - let ok = proposal.dispatch(system::RawOrigin::Root.into()).is_ok(); - Self::deposit_event(RawEvent::Sudid(ok)); + let res = match proposal.dispatch(system::RawOrigin::Root.into()) { + Ok(_) => true, + Err(e) => { + sr_io::print(e); + false + } + }; + + Self::deposit_event(RawEvent::Sudid(res)); } /// Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo key. diff --git a/srml/support/Cargo.toml b/srml/support/Cargo.toml index a126160d671e01b0b72b04ff561a2816bf573785..22635106dfa4e6204329f5066d850b7fef328e57 100644 --- a/srml/support/Cargo.toml +++ b/srml/support/Cargo.toml @@ -1,14 +1,12 @@ [package] name = "srml-support" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = { version = "0.1.0", optional = true } -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } -parity-codec = { version = "3.4", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } +codec = { package = "parity-codec", version = "3.5.1", default-features = false, features = ["derive"] } srml-metadata = { path = "../metadata", default-features = false } sr-std = { path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } @@ -20,18 +18,17 @@ once_cell = { version = "0.1.6", default-features = false, optional = true } bitmask = { version = "0.5", default-features = false } [dev-dependencies] -pretty_assertions = "0.5.1" +pretty_assertions = "0.6.1" +srml-system = { path = "../system", default-features = false } [features] default = ["std"] std = [ - "hex-literal", "once_cell", "bitmask/std", "serde", - "serde_derive", "runtime_io/std", - "parity-codec/std", + "codec/std", "sr-std/std", "sr-primitives/std", "srml-metadata/std", diff --git a/srml/support/procedural/Cargo.toml b/srml/support/procedural/Cargo.toml index 180c4be6b6d4caea39bbdccb941cc4e75707470f..fba706c17e890bccf203cc8171b0e904cd529cfe 100644 --- a/srml/support/procedural/Cargo.toml +++ b/srml/support/procedural/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-support-procedural" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -11,6 +11,6 @@ proc-macro = true srml-support-procedural-tools = { path = "./tools" } sr-api-macros = { path = "../../../core/sr-api-macros" } -proc-macro2 = "0.4" -quote = { version = "0.6" } -syn = { version = "0.15", features = ["full"] } +proc-macro2 = "0.4.27" +quote = { version = "0.6.12" } +syn = { version = "0.15.32", features = ["full"] } diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs index 342745efde0ef4fbb4f203a39a1c7dd172f0787d..abd7e90951b58d23588c312add27f56d1f428a21 100644 --- a/srml/support/procedural/src/lib.rs +++ b/srml/support/procedural/src/lib.rs @@ -40,66 +40,104 @@ use proc_macro::TokenStream; /// } /// ``` /// -/// Declaration is set with this header `(pub) trait Store for Module as Example` -/// with `Store` a (pub) trait generated associating each storage to the Module and -/// `as Example` setting the prefix used for storages of this module, it must be unique, -/// another module with same name and same inner storage name will conflict. +/// Declaration is set with the header `(pub) trait Store for Module as Example`, +/// with `Store` a (pub) trait generated associating each storage item to the `Module` and +/// `as Example` setting the prefix used for storage items of this module. `Example` must be unique: +/// another module with the same name and the same inner storage item name will conflict. /// -/// Basic storage consist of a name and a type, supported types are: -/// * storage value: `Foo: type`: implements [StorageValue](https://crates.parity.io/srml_support/storage/trait.StorageValue.html) -/// * storage map: `Foo: map type => type`: implements [StorageMap](https://crates.parity.io/srml_support/storage/trait.StorageMap.html) -/// * storage linked map: `Foo: linked_map type => type`: implements [StorageMap](https://crates.parity.io/srml_support/storage/trait.StorageMap.html) and [EnumarableStorageMap](https://crates.parity.io/srml_support/storage/trait.EnumerableStorageMap.html) -/// * storage double map: Foo: double_map u32, $hash(u32) => u32;` implements `StorageDoubleMap` with hasher $hash one available in `Hashable` trait -/// /!\ be careful while choosing the Hash, indeed malicious could craft second keys to lower the trie. +/// Basic storage consists of a name and a type; supported types are: /// -/// And it can be extended as such: +/// * Value: `Foo: type`: Implements the [`StorageValue`](../srml_support/storage/trait.StorageValue.html) trait. +/// * Map: `Foo: map hasher($hash) type => type`: Implements the +/// [`StorageMap`](../srml_support/storage/trait.StorageMap.html) trait +/// with `$hash` representing a choice of hashing algorithms available in the +/// [`Hashable`](../srml_support/trait.Hashable.html) trait. +/// +/// `hasher($hash)` is optional and its default is `blake2_256`. +/// +/// /!\ Be careful with each key in the map that is inserted in the trie `$hash(module_name ++ " " ++ storage_name ++ encoding(key))`. +/// If the keys are not trusted (e.g. can be set by a user), a cryptographic `hasher` such as +/// `blake2_256` must be used. Otherwise, other values in storage can be compromised. +/// +/// * Linked map: `Foo: linked_map hasher($hash) type => type`: Same as `Map` but also implements +/// the [`EnumerableStorageMap`](../srml_support/storage/trait.EnumerableStorageMap.html) trait. +/// +/// * Double map: `Foo: double_map hasher($hash) u32, $hash2(u32) => u32`: Implements the +/// [`StorageDoubleMap`](../srml_support/storage/trait.StorageDoubleMap.html) trait with +/// `$hash` and `$hash2` representing choices of hashing algorithms available in the +/// [`Hashable`](../srml_support/trait.Hashable.html) trait. +/// +/// `hasher($hash)` is optional and its default is `blake2_256`. +/// +/// /!\ Be careful with each key pair in the double map that is inserted in the trie. +/// The final key is calculated as follows: +/// +/// ```nocompile +/// $hash(module_name ++ " " ++ storage_name ++ encoding(first_key)) ++ $hash2(encoding(second_key)) +/// ``` +/// +/// If the first key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. +/// Otherwise, other values of all storage items can be compromised. +/// +/// If the second key is untrusted, a cryptographic `hasher` such as `blake2_256` must be used. +/// Otherwise, other items in storage with the same first key can be compromised. +/// +/// Basic storage can be extended as such: /// /// `#vis #name get(#getter) config(#field_name) build(#closure): #type = #default;` -/// * `#vis`: set the visibility of the structure -/// * `#name`: name of the storage, used as a prefix in the storage -/// * [optional] `get(#getter)`: implements the function #getter to `Module` -/// * [optional] `config(#field_name)`: `field_name` is optional if get is set: include in `GenesisConfig` -/// * [optional] `build(#closure)`: closure called with storage overlays -/// * `#type`: storage type -/// * [optional] `#default`: value returned when none -/// -/// Storages are accessible in multiples ways, using: -/// * the structure: `Foo::` -/// * the `Store` trait structure: ` as Store>::Foo` -/// * the getter on the module which calls get on the structure: `Module::::foo()` +/// +/// * `#vis`: Set the visibility of the structure. `pub` or nothing. +/// * `#name`: Name of the storage item, used as a prefix in storage. +/// * [optional] `get(#getter)`: Implements the function #getter to `Module`. +/// * [optional] `config(#field_name)`: `field_name` is optional if get is set. +/// Will include the item in `GenesisConfig`. +/// * [optional] `build(#closure)`: Closure called with storage overlays. +/// * `#type`: Storage type. +/// * [optional] `#default`: Value returned when none. +/// +/// Storage items are accessible in multiple ways: +/// +/// * The structure: `Foo::` +/// * The `Store` trait structure: ` as Store>::Foo` +/// * The getter on the module that calls get on the structure: `Module::::foo()` /// /// ## GenesisConfig /// /// An optional `GenesisConfig` struct for storage initialization can be defined, either /// when at least one storage field requires default initialization -/// (both `get` and `config` or `build`), or specifically as in : +/// (both `get` and `config` or `build`), or specifically as in: +/// /// ```nocompile /// decl_storage! { /// trait Store for Module as Example { +/// +/// // Your storage items /// } /// add_extra_genesis { /// config(genesis_field): GenesisFieldType; /// config(genesis_field2): GenesisFieldType; /// ... /// build(|_: &mut StorageOverlay, _: &mut ChildrenStorageOverlay, _: &GenesisConfig| { -/// // Modification of storages +/// // Modification of storage /// }) /// } /// } /// ``` -/// This struct can be expose as `Config` by `decl_runtime` macro. /// -/// ### Module with instances +/// This struct can be exposed as `Config` by the `decl_runtime!` macro. +/// +/// ### Module with Instances +/// +/// The `decl_storage!` macro supports building modules with instances with the following syntax +/// (`DefaultInstance` type is optional): /// -/// `decl_storage!` macro support building modules with instances with the following syntax: (DefaultInstance type -/// is optional) /// ```nocompile /// trait Store for Module, I: Instance=DefaultInstance> as Example {} /// ``` /// -/// Then the genesis config is generated with two generic parameter `GenesisConfig` -/// and storages are now accessible using two generic parameters like: -/// `>::get()` or `Dummy::::get()` +/// Then the genesis config is generated with two generic parameters (i.e. `GenesisConfig`) +/// and storage items are accessible using two generic parameters, e.g.: +/// `>::get()` or `Dummy::::get()`. #[proc_macro] pub fn decl_storage(input: TokenStream) -> TokenStream { storage::transformation::decl_storage_impl(input) diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs index 5a8f7f65d5d8e835e59fc691844ee18166ffb70a..720ed21c240dfa675849f9ccadd928acea0f4137 100644 --- a/srml/support/procedural/src/storage/impls.rs +++ b/srml/support/procedural/src/storage/impls.rs @@ -67,13 +67,13 @@ impl<'a, I: Iterator> Impls<'a, I> { let mutate_impl = if !is_option { quote!{ - >::put(&val, storage) + >::put(&val, storage) } } else { quote!{ match val { - Some(ref val) => >::put(&val, storage), - None => >::kill(storage), + Some(ref val) => >::put(&val, storage), + None => >::kill(storage), } } }; @@ -96,9 +96,12 @@ impl<'a, I: Iterator> Impls<'a, I> { // generator for value quote!{ #( #[ #attrs ] )* - #visibility struct #name<#traitinstance: #traittype, #instance #bound_instantiable #equal_default_instance>(#scrate::storage::generator::PhantomData<(#traitinstance #comma_instance)>); + #visibility struct #name<#traitinstance: #traittype, #instance #bound_instantiable #equal_default_instance> + (#scrate::rstd::marker::PhantomData<(#traitinstance #comma_instance)>); - impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::storage::generator::StorageValue<#typ> for #name<#traitinstance, #instance> { + impl<#traitinstance: #traittype, #instance #bound_instantiable> + #scrate::storage::hashed::generator::StorageValue<#typ> for #name<#traitinstance, #instance> + { type Query = #value_type; /// Get the storage key. @@ -107,20 +110,20 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Load the value from the provided storage instance. - fn get(storage: &S) -> Self::Query { - storage.get(>::key()) + fn get>(storage: &S) -> Self::Query { + storage.get(>::key()) .#option_simple_1(|| #fielddefault) } /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Self::Query { - storage.take(>::key()) + fn take>(storage: &mut S) -> Self::Query { + storage.take(>::key()) .#option_simple_1(|| #fielddefault) } /// Mutate the value under a key. - fn mutate R, S: #scrate::GenericStorage>(f: F, storage: &S) -> R { - let mut val = >::get(storage); + fn mutate R, S: #scrate::HashedStorage<#scrate::Twox128>>(f: F, storage: &mut S) -> R { + let mut val = >::get(storage); let ret = f(&mut val); #mutate_impl ; @@ -130,7 +133,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } } - pub fn map(self, kty: &syn::Type) -> TokenStream2 { + pub fn map(self, hasher: TokenStream2, kty: &syn::Type) -> TokenStream2 { let Self { scrate, visibility, @@ -147,15 +150,17 @@ impl<'a, I: Iterator> Impls<'a, I> { let DeclStorageTypeInfos { typ, value_type, is_option, .. } = type_infos; let option_simple_1 = option_unwrap(is_option); + let as_map = quote!{ > }; + let mutate_impl = if !is_option { quote!{ - >::insert(key, &val, storage) + #as_map::insert(key, &val, storage) } } else { quote!{ match val { - Some(ref val) => >::insert(key, &val, storage), - None => >::remove(key, storage), + Some(ref val) => #as_map::insert(key, &val, storage), + None => #as_map::remove(key, storage), } } }; @@ -178,11 +183,16 @@ impl<'a, I: Iterator> Impls<'a, I> { // generator for map quote!{ #( #[ #attrs ] )* - #visibility struct #name<#traitinstance: #traittype, #instance #bound_instantiable #equal_default_instance>(#scrate::storage::generator::PhantomData<(#traitinstance #comma_instance)>); + #visibility struct #name<#traitinstance: #traittype, #instance #bound_instantiable #equal_default_instance> + (#scrate::rstd::marker::PhantomData<(#traitinstance #comma_instance)>); - impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::storage::generator::StorageMap<#kty, #typ> for #name<#traitinstance, #instance> { + impl<#traitinstance: #traittype, #instance #bound_instantiable> + #scrate::storage::hashed::generator::StorageMap<#kty, #typ> for #name<#traitinstance, #instance> + { type Query = #value_type; + type Hasher = #scrate::#hasher; + /// Get the prefix key in storage. fn prefix() -> &'static [u8] { #final_prefix @@ -190,26 +200,26 @@ impl<'a, I: Iterator> Impls<'a, I> { /// Get the storage key used to fetch a value corresponding to a specific key. fn key_for(x: &#kty) -> #scrate::rstd::vec::Vec { - let mut key = >::prefix().to_vec(); + let mut key = #as_map::prefix().to_vec(); #scrate::codec::Encode::encode_to(x, &mut key); key } /// Load the value associated with the given key from the map. - fn get(key: &#kty, storage: &S) -> Self::Query { - let key = >::key_for(key); + fn get>(key: &#kty, storage: &S) -> Self::Query { + let key = #as_map::key_for(key); storage.get(&key[..]).#option_simple_1(|| #fielddefault) } /// Take the value, reading and removing it. - fn take(key: &#kty, storage: &S) -> Self::Query { - let key = >::key_for(key); + fn take>(key: &#kty, storage: &mut S) -> Self::Query { + let key = #as_map::key_for(key); storage.take(&key[..]).#option_simple_1(|| #fielddefault) } /// Mutate the value under a key - fn mutate R, S: #scrate::GenericStorage>(key: &#kty, f: F, storage: &S) -> R { - let mut val = >::get(key, storage); + fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &mut S) -> R { + let mut val = #as_map::get(key, storage); let ret = f(&mut val); #mutate_impl ; @@ -220,7 +230,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } } - pub fn linked_map(self, kty: &syn::Type) -> TokenStream2 { + pub fn linked_map(self, hasher: TokenStream2, kty: &syn::Type) -> TokenStream2 { let Self { scrate, visibility, @@ -264,8 +274,8 @@ impl<'a, I: Iterator> Impls<'a, I> { let name_lowercase = name.to_string().to_lowercase(); let inner_module = syn::Ident::new(&format!("__linked_map_details_for_{}_do_not_use", name_lowercase), name.span()); let linkage = syn::Ident::new(&format!("__LinkageFor{}DoNotUse", name), name.span()); - let phantom_data = quote! { #scrate::storage::generator::PhantomData }; - let as_map = quote!{ > }; + let phantom_data = quote! { #scrate::rstd::marker::PhantomData }; + let as_map = quote!{ > }; let put_or_insert = quote! { match linkage { Some(linkage) => storage.put(key_for, &(val, linkage)), @@ -316,14 +326,17 @@ impl<'a, I: Iterator> Impls<'a, I> { pub _data: #phantom_data, } - impl<'a, S: #scrate::GenericStorage, #traitinstance: #traittype, #instance #bound_instantiable> Iterator for Enumerator<'a, S, #kty, (#typ, #traitinstance, #instance)> + impl<'a, S: #scrate::HashedStorage<#scrate::#hasher>, #traitinstance: #traittype, #instance #bound_instantiable> + Iterator for Enumerator<'a, S, #kty, (#typ, #traitinstance, #instance)> where #traitinstance: 'a { type Item = (#kty, #typ); fn next(&mut self) -> Option { let next = self.next.take()?; - let key_for = as #scrate::storage::generator::StorageMap<#kty, #typ>>::key_for(&next); + let key_for = + as #scrate::storage::hashed::generator::StorageMap<#kty, #typ>>::key_for(&next); + let (val, linkage): (#typ, Linkage<#kty>) = self.storage.get(&*key_for) .expect("previous/next only contain existing entires; we enumerate using next; entry exists; qed"); self.next = linkage.next; @@ -336,26 +349,26 @@ impl<'a, I: Iterator> Impls<'a, I> { /// /// Takes care of updating previous and next elements points /// as well as updates head if the element is first or last. - fn remove_linkage(linkage: Linkage<#kty>, storage: &S); + fn remove_linkage>(linkage: Linkage<#kty>, storage: &mut S); /// Read the contained data and it's linkage. - fn read_with_linkage(storage: &S, key: &[u8]) -> Option<(#value_type, Linkage<#kty>)>; + fn read_with_linkage>(storage: &S, key: &[u8]) -> Option<(#value_type, Linkage<#kty>)>; /// Generate linkage for newly inserted element. /// /// Takes care of updating head and previous head's pointer. - fn new_head_linkage( - storage: &S, + fn new_head_linkage>( + storage: &mut S, key: &#kty, ) -> Linkage<#kty>; /// Read current head pointer. - fn read_head(storage: &S) -> Option<#kty>; + fn read_head>(storage: &S) -> Option<#kty>; /// Overwrite current head pointer. /// /// If `None` is given head is removed from storage. - fn write_head(storage: &S, head: Option<&#kty>); + fn write_head>(storage: &mut S, head: Option<&#kty>); } } }; @@ -365,9 +378,9 @@ impl<'a, I: Iterator> Impls<'a, I> { #visibility struct #name<#traitinstance: #traittype, #instance #bound_instantiable #equal_default_instance>(#phantom_data<(#traitinstance #comma_instance)>); impl<#traitinstance: #traittype, #instance #bound_instantiable> self::#inner_module::Utils<#traitinstance, #instance> for #name<#traitinstance, #instance> { - fn remove_linkage( + fn remove_linkage>( linkage: self::#inner_module::Linkage<#kty>, - storage: &S, + storage: &mut S, ) { use self::#inner_module::Utils; @@ -394,15 +407,15 @@ impl<'a, I: Iterator> Impls<'a, I> { } } - fn read_with_linkage( + fn read_with_linkage>( storage: &S, key: &[u8], ) -> Option<(#value_type, self::#inner_module::Linkage<#kty>)> { storage.get(key) } - fn new_head_linkage( - storage: &S, + fn new_head_linkage>( + storage: &mut S, key: &#kty, ) -> self::#inner_module::Linkage<#kty> { use self::#inner_module::Utils; @@ -433,11 +446,11 @@ impl<'a, I: Iterator> Impls<'a, I> { } } - fn read_head(storage: &S) -> Option<#kty> { + fn read_head>(storage: &S) -> Option<#kty> { storage.get(#final_head_key) } - fn write_head(storage: &S, head: Option<&#kty>) { + fn write_head>(storage: &mut S, head: Option<&#kty>) { match head { Some(head) => storage.put(#final_head_key, head), None => storage.kill(#final_head_key), @@ -451,9 +464,13 @@ impl<'a, I: Iterator> Impls<'a, I> { #structure - impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::storage::generator::StorageMap<#kty, #typ> for #name<#traitinstance, #instance> { + impl<#traitinstance: #traittype, #instance #bound_instantiable> + #scrate::storage::hashed::generator::StorageMap<#kty, #typ> for #name<#traitinstance, #instance> + { type Query = #value_type; + type Hasher = #scrate::#hasher; + /// Get the prefix key in storage. fn prefix() -> &'static [u8] { #final_prefix @@ -467,12 +484,12 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Load the value associated with the given key from the map. - fn get(key: &#kty, storage: &S) -> Self::Query { + fn get>(key: &#kty, storage: &S) -> Self::Query { storage.get(&*#as_map::key_for(key)).#option_simple_1(|| #fielddefault) } /// Take the value, reading and removing it. - fn take(key: &#kty, storage: &S) -> Self::Query { + fn take>(key: &#kty, storage: &mut S) -> Self::Query { use self::#inner_module::Utils; let res: Option<(#value_type, self::#inner_module::Linkage<#kty>)> = storage.take(&*#as_map::key_for(key)); @@ -486,12 +503,12 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Remove the value under a key. - fn remove(key: &#kty, storage: &S) { + fn remove>(key: &#kty, storage: &mut S) { #as_map::take(key, storage); } /// Store a value to be associated with the given key from the map. - fn insert(key: &#kty, val: &#typ, storage: &S) { + fn insert>(key: &#kty, val: &#typ, storage: &mut S) { use self::#inner_module::Utils; let key_for = &*#as_map::key_for(key); @@ -505,7 +522,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } /// Mutate the value under a key - fn mutate R, S: #scrate::GenericStorage>(key: &#kty, f: F, storage: &S) -> R { + fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &mut S) -> R { use self::#inner_module::Utils; let key_for = &*#as_map::key_for(key); @@ -519,20 +536,22 @@ impl<'a, I: Iterator> Impls<'a, I> { } } - impl<#traitinstance: 'static + #traittype, #instance #bound_instantiable> #scrate::storage::generator::EnumerableStorageMap<#kty, #typ> for #name<#traitinstance, #instance> { - fn head(storage: &S) -> Option<#kty> { + impl<#traitinstance: 'static + #traittype, #instance #bound_instantiable> + #scrate::storage::hashed::generator::EnumerableStorageMap<#kty, #typ> for #name<#traitinstance, #instance> + { + fn head>(storage: &S) -> Option<#kty> { use self::#inner_module::Utils; Self::read_head(storage) } - fn enumerate<'a, S: #scrate::GenericStorage>(storage: &'a S) -> #scrate::storage::generator::Box + 'a> where + fn enumerate<'a, S: #scrate::HashedStorage<#scrate::#hasher>>(storage: &'a S) -> #scrate::rstd::boxed::Box + 'a> where #kty: 'a, #typ: 'a, { use self::#inner_module::{Utils, Enumerator}; - #scrate::storage::generator::Box::new(Enumerator { + #scrate::rstd::boxed::Box::new(Enumerator { next: Self::read_head(storage), storage, _data: #phantom_data::<(#typ, #traitinstance, #instance)>::default(), @@ -542,7 +561,7 @@ impl<'a, I: Iterator> Impls<'a, I> { } } - pub fn double_map(self, k1ty: &syn::Type, k2ty: &syn::Type, k2_hasher: TokenStream2) -> TokenStream2 { + pub fn double_map(self, hasher: TokenStream2, k1ty: &syn::Type, k2ty: &syn::Type, k2_hasher: TokenStream2) -> TokenStream2 { let Self { scrate, visibility, @@ -593,11 +612,22 @@ impl<'a, I: Iterator> Impls<'a, I> { // generator for double map quote!{ #( #[ #attrs ] )* - #visibility struct #name<#traitinstance: #traittype, #instance #bound_instantiable #equal_default_instance>(#scrate::storage::generator::PhantomData<(#traitinstance #comma_instance)>); + #visibility struct #name<#traitinstance: #traittype, #instance #bound_instantiable #equal_default_instance> + (#scrate::rstd::marker::PhantomData<(#traitinstance #comma_instance)>); - impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::storage::unhashed::generator::StorageDoubleMap<#k1ty, #k2ty, #typ> for #name<#traitinstance, #instance> { + impl<#traitinstance: #traittype, #instance #bound_instantiable> + #scrate::storage::unhashed::generator::StorageDoubleMap<#k1ty, #k2ty, #typ> for #name<#traitinstance, #instance> + { type Query = #value_type; + fn prefix_for(k1: &#k1ty) -> Vec { + use #scrate::storage::hashed::generator::StorageHasher; + + let mut key = #as_double_map::prefix().to_vec(); + #scrate::codec::Encode::encode_to(k1, &mut key); + #scrate::#hasher::hash(&key[..]).to_vec() + } + fn prefix() -> &'static [u8] { #final_prefix } @@ -608,17 +638,17 @@ impl<'a, I: Iterator> Impls<'a, I> { key } - fn get(key1: &#k1ty, key2: &#k2ty, storage: &S) -> Self::Query { + fn get(key1: &#k1ty, key2: &#k2ty, storage: &S) -> Self::Query { let key = #as_double_map::key_for(key1, key2); storage.get(&key).#option_simple_1(|| #fielddefault) } - fn take(key1: &#k1ty, key2: &#k2ty, storage: &S) -> Self::Query { + fn take(key1: &#k1ty, key2: &#k2ty, storage: &mut S) -> Self::Query { let key = #as_double_map::key_for(key1, key2); storage.take(&key).#option_simple_1(|| #fielddefault) } - fn mutate R, S: #scrate::GenericUnhashedStorage>(key1: &#k1ty, key2: &#k2ty, f: F, storage: &S) -> R { + fn mutate R, S: #scrate::UnhashedStorage>(key1: &#k1ty, key2: &#k2ty, f: F, storage: &mut S) -> R { let mut val = #as_double_map::get(key1, key2, storage); let ret = f(&mut val); diff --git a/srml/support/procedural/src/storage/mod.rs b/srml/support/procedural/src/storage/mod.rs index 82290e0de458fb8f658b96199787d5dd86b97b9f..ce81dd95c5a2e0f5200f6454e14a9741b1b9a509 100644 --- a/srml/support/procedural/src/storage/mod.rs +++ b/srml/support/procedural/src/storage/mod.rs @@ -18,20 +18,37 @@ //! `decl_storage` macro // end::description[] -use srml_support_procedural_tools::syn_ext as ext; -use srml_support_procedural_tools::{ToTokens, Parse, custom_keyword, custom_keyword_impl}; - +use srml_support_procedural_tools::{ToTokens, Parse, syn_ext as ext}; use syn::{Ident, Token}; -use syn::token::CustomKeyword; +use proc_macro2::TokenStream as TokenStream2; +use quote::quote; mod impls; pub mod transformation; +mod keyword { + syn::custom_keyword!(hiddencrate); + syn::custom_keyword!(add_extra_genesis); + syn::custom_keyword!(extra_genesis_skip_phantom_data_field); + syn::custom_keyword!(config); + syn::custom_keyword!(build); + syn::custom_keyword!(get); + syn::custom_keyword!(map); + syn::custom_keyword!(linked_map); + syn::custom_keyword!(double_map); + syn::custom_keyword!(blake2_256); + syn::custom_keyword!(blake2_128); + syn::custom_keyword!(twox_256); + syn::custom_keyword!(twox_128); + syn::custom_keyword!(twox_64_concat); + syn::custom_keyword!(hasher); +} + /// Parsing usage only #[derive(Parse, ToTokens, Debug)] struct StorageDefinition { - pub hidden_crate: Option, + pub hidden_crate: ext::Opt, pub visibility: syn::Visibility, pub trait_token: Token![trait], pub ident: Ident, @@ -49,25 +66,25 @@ struct StorageDefinition { pub as_token: Token![as], pub crate_ident: Ident, pub content: ext::Braces>, - pub extra_genesis: Option, - pub extra_genesis_skip_phantom_data_field: Option, + pub extra_genesis: ext::Opt, + pub extra_genesis_skip_phantom_data_field: ext::Opt, } #[derive(Parse, ToTokens, Debug)] struct SpecificHiddenCrate { - pub keyword: ext::CustomToken, + pub keyword: keyword::hiddencrate, pub ident: ext::Parens, } #[derive(Parse, ToTokens, Debug)] struct AddExtraGenesis { - pub extragenesis_keyword: ext::CustomToken, + pub extragenesis_keyword: keyword::add_extra_genesis, pub content: ext::Braces, } #[derive(Parse, ToTokens, Debug)] struct ExtraGenesisSkipPhantomDataField { - pub genesis_phantom_keyword: ext::CustomToken, + pub genesis_phantom_keyword: keyword::extra_genesis_skip_phantom_data_field, pub token: Token![;], } @@ -85,7 +102,7 @@ enum AddExtraGenesisLineEnum { #[derive(Parse, ToTokens, Debug)] struct AddExtraGenesisLine { pub attrs: ext::OuterAttributes, - pub config_keyword: ext::CustomToken, + pub config_keyword: keyword::config, pub extra_field: ext::Parens, pub coldot_token: Token![:], pub extra_type: syn::Type, @@ -100,9 +117,9 @@ struct DeclStorageLine { pub visibility: syn::Visibility, // name pub name: Ident, - pub getter: Option, - pub config: Option, - pub build: Option, + pub getter: ext::Opt, + pub config: ext::Opt, + pub build: ext::Opt, pub coldot_token: Token![:], pub storage_type: DeclStorageType, pub default_value: ext::Opt, @@ -111,19 +128,19 @@ struct DeclStorageLine { #[derive(Parse, ToTokens, Debug)] struct DeclStorageGetter { - pub getter_keyword: ext::CustomToken, + pub getter_keyword: keyword::get, pub getfn: ext::Parens, } #[derive(Parse, ToTokens, Debug)] struct DeclStorageConfig { - pub config_keyword: ext::CustomToken, + pub config_keyword: keyword::config, pub expr: ext::Parens>, } #[derive(Parse, ToTokens, Debug)] struct DeclStorageBuild { - pub build_keyword: ext::CustomToken, + pub build_keyword: keyword::build, pub expr: ext::Parens, } @@ -137,7 +154,8 @@ enum DeclStorageType { #[derive(Parse, ToTokens, Debug)] struct DeclStorageMap { - pub map_keyword: ext::CustomToken, + pub map_keyword: keyword::map, + pub hasher: ext::Opt, pub key: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, @@ -145,7 +163,8 @@ struct DeclStorageMap { #[derive(Parse, ToTokens, Debug)] struct DeclStorageLinkedMap { - pub map_keyword: ext::CustomToken, + pub map_keyword: keyword::linked_map, + pub hasher: ext::Opt, pub key: syn::Type, pub ass_keyword: Token![=>], pub value: syn::Type, @@ -153,20 +172,23 @@ struct DeclStorageLinkedMap { #[derive(Parse, ToTokens, Debug)] struct DeclStorageDoubleMap { - pub map_keyword: ext::CustomToken, + pub map_keyword: keyword::double_map, + pub hasher: ext::Opt, pub key1: syn::Type, pub comma_keyword: Token![,], - pub key2_hasher: DeclStorageDoubleMapHasher, + pub key2_hasher: Hasher, pub key2: ext::Parens, pub ass_keyword: Token![=>], pub value: syn::Type, } #[derive(Parse, ToTokens, Debug)] -enum DeclStorageDoubleMapHasher { - Blake2_256(ext::CustomToken), - Twox256(ext::CustomToken), - Twox128(ext::CustomToken), +enum Hasher { + Blake2_256(keyword::blake2_256), + Blake2_128(keyword::blake2_128), + Twox256(keyword::twox_256), + Twox128(keyword::twox_128), + Twox64Concat(keyword::twox_64_concat), } #[derive(Parse, ToTokens, Debug)] @@ -175,17 +197,50 @@ struct DeclStorageDefault { pub expr: syn::Expr, } -custom_keyword_impl!(SpecificHiddenCrate, "hiddencrate", "hiddencrate as keyword"); -custom_keyword_impl!(DeclStorageConfig, "config", "build as keyword"); -custom_keyword!(ConfigKeyword, "config", "config as keyword"); -custom_keyword!(BuildKeyword, "build", "build as keyword"); -custom_keyword_impl!(DeclStorageBuild, "build", "storage build config"); -custom_keyword_impl!(AddExtraGenesis, "add_extra_genesis", "storage extra genesis"); -custom_keyword_impl!(DeclStorageGetter, "get", "storage getter"); -custom_keyword!(MapKeyword, "map", "map as keyword"); -custom_keyword!(LinkedMapKeyword, "linked_map", "linked_map as keyword"); -custom_keyword!(DoubleMapKeyword, "double_map", "double_map as keyword"); -custom_keyword!(Blake2_256Keyword, "blake2_256", "Blake2_256 as keyword"); -custom_keyword!(Twox256Keyword, "twox_256", "Twox_256 as keyword"); -custom_keyword!(Twox128Keyword, "twox_128", "Twox_128 as keyword"); -custom_keyword_impl!(ExtraGenesisSkipPhantomDataField, "extra_genesis_skip_phantom_data_field", "extra_genesis_skip_phantom_data_field as keyword"); +#[derive(Parse, ToTokens, Debug)] +struct SetHasher { + pub hasher_keyword: keyword::hasher, + pub inner: ext::Parens, +} + +#[derive(Debug, Clone)] +enum HasherKind { + Blake2_256, + Blake2_128, + Twox256, + Twox128, + Twox64Concat, +} + +impl From<&SetHasher> for HasherKind { + fn from(set_hasher: &SetHasher) -> Self { + match set_hasher.inner.content { + Hasher::Blake2_256(_) => HasherKind::Blake2_256, + Hasher::Blake2_128(_) => HasherKind::Blake2_128, + Hasher::Twox256(_) => HasherKind::Twox256, + Hasher::Twox128(_) => HasherKind::Twox128, + Hasher::Twox64Concat(_) => HasherKind::Twox64Concat, + } + } +} +impl HasherKind { + fn into_storage_hasher_struct(&self) -> TokenStream2 { + match self { + HasherKind::Blake2_256 => quote!( Blake2_256 ), + HasherKind::Blake2_128 => quote!( Blake2_128 ), + HasherKind::Twox256 => quote!( Twox256 ), + HasherKind::Twox128 => quote!( Twox128 ), + HasherKind::Twox64Concat => quote!( Twox64Concat ), + } + } + + fn into_metadata(&self) -> TokenStream2 { + match self { + HasherKind::Blake2_256 => quote!( StorageHasher::Blake2_256 ), + HasherKind::Blake2_128 => quote!( StorageHasher::Blake2_128 ), + HasherKind::Twox256 => quote!( StorageHasher::Twox256 ), + HasherKind::Twox128 => quote!( StorageHasher::Twox128 ), + HasherKind::Twox64Concat => quote!( StorageHasher::Twox64Concat ), + } + } +} diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs index f00b5e8309bcc043b372296bc34e8d39b66e2ea7..933faa6ff9c939a53e1be29acc180266343760a7 100644 --- a/srml/support/procedural/src/storage/transformation.rs +++ b/srml/support/procedural/src/storage/transformation.rs @@ -74,7 +74,7 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { Err(err) => return err.to_compile_error().into(), }; - let hidden_crate_name = hidden_crate.map(|rc| rc.ident.content).map(|i| i.to_string()) + let hidden_crate_name = hidden_crate.inner.map(|rc| rc.ident.content).map(|i| i.to_string()) .unwrap_or_else(|| "decl_storage".to_string()); let scrate = generate_crate_access(&hidden_crate_name, "srml-support"); let scrate_decl = generate_hidden_includes( @@ -103,8 +103,8 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { &traittype, &instance_opts, &storage_lines, - &extra_genesis, - extra_genesis_skip_phantom_data_field.is_some(), + &extra_genesis.inner, + extra_genesis_skip_phantom_data_field.inner.is_some(), )); let decl_storage_items = decl_storage_items( &scrate, @@ -156,13 +156,13 @@ pub fn decl_storage_impl(input: TokenStream) -> TokenStream { impl<#traitinstance: 'static + #traittype, #instance #bound_instantiable> #module_ident<#traitinstance, #instance> { #impl_store_fns #[doc(hidden)] - pub fn store_metadata() -> #scrate::storage::generator::StorageMetadata { - #scrate::storage::generator::StorageMetadata { - functions: #scrate::storage::generator::DecodeDifferent::Encode(#store_functions_to_metadata) , + pub fn store_metadata() -> #scrate::metadata::StorageMetadata { + #scrate::metadata::StorageMetadata { + functions: #scrate::metadata::DecodeDifferent::Encode(#store_functions_to_metadata) , } } #[doc(hidden)] - pub fn store_metadata_functions() -> &'static [#scrate::storage::generator::StorageFunctionMetadata] { + pub fn store_metadata_functions() -> &'static [#scrate::metadata::StorageFunctionMetadata] { #store_functions_to_metadata } #[doc(hidden)] @@ -198,7 +198,7 @@ fn decl_store_extra_genesis( let mut is_trait_needed = false; let mut has_trait_field = false; - let mut serde_complete_bound = std::collections::HashSet::new(); + let mut serde_complete_bound = Vec::new(); let mut config_field = TokenStream2::new(); let mut config_field_default = TokenStream2::new(); let mut builders = TokenStream2::new(); @@ -219,10 +219,10 @@ fn decl_store_extra_genesis( let mut opt_build; // need build line - if let Some(ref config) = config { + if let Some(ref config) = config.inner { let ident = if let Some(ident) = config.expr.content.as_ref() { quote!( #ident ) - } else if let Some(ref getter) = getter { + } else if let Some(ref getter) = getter.inner { let ident = &getter.getfn.content; quote!( #ident ) } else { @@ -239,9 +239,20 @@ fn decl_store_extra_genesis( has_trait_field = true; } - serde_complete_bound.insert(type_infos.value_type); - if let DeclStorageTypeInfosKind::Map { key_type, .. } = type_infos.kind { - serde_complete_bound.insert(key_type); + let value_type = &type_infos.value_type; + serde_complete_bound.push(quote!( #value_type )); + match type_infos.kind { + DeclStorageTypeInfosKind::Map { key_type, .. } => + serde_complete_bound.push(quote!( #key_type )), + DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, .. } => { + serde_complete_bound.push(quote!( #key1_type )); + serde_complete_bound.push(quote!( #key2_type )); + }, + _ => {}, + } + + if type_infos.is_option { + serde_complete_bound.push(type_infos.typ.clone()); } // Propagate doc attributes. @@ -259,7 +270,7 @@ fn decl_store_extra_genesis( quote!( #( #[ #attrs ] )* pub #ident: Vec<(#key1_type, #key2_type, #storage_type)>, ) }, }); - opt_build = Some(build.as_ref().map(|b| &b.expr.content).map(|b|quote!( #b )) + opt_build = Some(build.inner.as_ref().map(|b| &b.expr.content).map(|b|quote!( #b )) .unwrap_or_else(|| quote!( (|config: &GenesisConfig<#traitinstance, #instance>| config.#ident.clone()) ))); let fielddefault = default_value.inner.as_ref().map(|d| &d.expr).map(|d| @@ -271,7 +282,7 @@ fn decl_store_extra_genesis( config_field_default.extend(quote!( #ident: #fielddefault, )); } else { - opt_build = build.as_ref().map(|b| &b.expr.content).map(|b| quote!( #b )); + opt_build = build.inner.as_ref().map(|b| &b.expr.content).map(|b| quote!( #b )); } let typ = type_infos.typ; @@ -284,7 +295,7 @@ fn decl_store_extra_genesis( use #scrate::codec::{Encode, Decode}; let v = (#builder)(&self); - <#name<#traitinstance, #instance> as #scrate::storage::generator::StorageValue<#typ>>::put(&v, &storage); + <#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageValue<#typ>>::put(&v, storage); }} }, DeclStorageTypeInfosKind::Map { key_type, .. } => { @@ -294,7 +305,7 @@ fn decl_store_extra_genesis( let data = (#builder)(&self); for (k, v) in data.into_iter() { - <#name<#traitinstance, #instance> as #scrate::storage::generator::StorageMap<#key_type, #typ>>::insert(&k, &v, &storage); + <#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageMap<#key_type, #typ>>::insert(&k, &v, storage); } }} }, @@ -305,7 +316,7 @@ fn decl_store_extra_genesis( let data = (#builder)(&self); for (k1, k2, v) in data.into_iter() { - <#name<#traitinstance, #instance> as #scrate::storage::unhashed::generator::StorageDoubleMap<#key1_type, #key2_type, #typ>>::insert(&k1, &k2, &v, &storage); + <#name<#traitinstance, #instance> as #scrate::storage::unhashed::generator::StorageDoubleMap<#key1_type, #key2_type, #typ>>::insert(&k1, &k2, &v, storage); } }} }, @@ -335,7 +346,7 @@ fn decl_store_extra_genesis( has_trait_field = true; } - serde_complete_bound.insert(extra_type); + serde_complete_bound.push(quote!( #extra_type )); let extrafield = &extra_field.content; genesis_extrafields.extend(quote!{ @@ -363,7 +374,7 @@ fn decl_store_extra_genesis( let serde_bug_bound = if !serde_complete_bound.is_empty() { let mut b_ser = String::new(); let mut b_dser = String::new(); - // panic!("{:#?}", serde_complete_bound); + serde_complete_bound.into_iter().for_each(|bound| { let stype = quote!(#bound); b_ser.push_str(&format!("{} : {}::serde::Serialize, ", stype, scrate)); @@ -402,7 +413,7 @@ fn decl_store_extra_genesis( quote!{ #[serde(skip)] - pub _genesis_phantom_data: #scrate::storage::generator::PhantomData<(#traitinstance #comma_instance)>, + pub _genesis_phantom_data: #scrate::rstd::marker::PhantomData<(#traitinstance #comma_instance)>, }, quote!{ _genesis_phantom_data: Default::default(), @@ -440,12 +451,11 @@ fn decl_store_extra_genesis( #[cfg(feature = "std")] impl#fparam_impl #scrate::runtime_primitives::BuildStorage for GenesisConfig#sparam { fn assimilate_storage(self, r: &mut #scrate::runtime_primitives::StorageOverlay, c: &mut #scrate::runtime_primitives::ChildrenStorageOverlay) -> ::std::result::Result<(), String> { - use #scrate::rstd::{cell::RefCell, marker::PhantomData}; - let storage = (RefCell::new(r), PhantomData::::default()); + let storage = r; #builders - let r = storage.0.into_inner(); + let r = storage; #scall(r, c, &self); @@ -515,7 +525,7 @@ fn decl_storage_items( impls.extend(quote! { /// Tag a type as an instance of a module. - /// + /// /// Defines storage prefixes, they must be unique. pub trait #instantiable: 'static { #const_impls @@ -589,14 +599,14 @@ fn decl_storage_items( DeclStorageTypeInfosKind::Simple => { i.simple_value() }, - DeclStorageTypeInfosKind::Map { key_type, is_linked: false } => { - i.map(key_type) + DeclStorageTypeInfosKind::Map { key_type, is_linked: false, hasher } => { + i.map(hasher.into_storage_hasher_struct(), key_type) }, - DeclStorageTypeInfosKind::Map { key_type, is_linked: true } => { - i.linked_map(key_type) + DeclStorageTypeInfosKind::Map { key_type, is_linked: true, hasher } => { + i.linked_map(hasher.into_storage_hasher_struct(), key_type) }, - DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher } => { - i.double_map(key1_type, key2_type, key2_hasher) + DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher, hasher } => { + i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher) }, }; impls.extend(implementation) @@ -647,7 +657,7 @@ fn impl_store_fns( .. } = sline; - if let Some(getter) = getter { + if let Some(getter) = getter.inner.as_ref() { let get_fn = &getter.getfn.content; let type_infos = get_type_infos(storage_type); @@ -662,15 +672,15 @@ fn impl_store_fns( quote!{ #( #[ #attrs ] )* pub fn #get_fn() -> #value_type { - <#name<#traitinstance, #instance> as #scrate::storage::generator::StorageValue<#typ>> :: get(&#scrate::storage::RuntimeStorage) + <#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageValue<#typ>> :: get(&#scrate::storage::RuntimeStorage) } } }, DeclStorageTypeInfosKind::Map { key_type, .. } => { quote!{ #( #[ #attrs ] )* - pub fn #get_fn>(key: K) -> #value_type { - <#name<#traitinstance, #instance> as #scrate::storage::generator::StorageMap<#key_type, #typ>> :: get(key.borrow(), &#scrate::storage::RuntimeStorage) + pub fn #get_fn>(key: K) -> #value_type { + <#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageMap<#key_type, #typ>> :: get(key.borrow(), &#scrate::storage::RuntimeStorage) } } } @@ -678,8 +688,8 @@ fn impl_store_fns( quote!{ pub fn #get_fn(k1: KArg1, k2: KArg2) -> #value_type where - KArg1: #scrate::storage::generator::Borrow<#key1_type>, - KArg2: #scrate::storage::generator::Borrow<#key2_type>, + KArg1: #scrate::rstd::borrow::Borrow<#key1_type>, + KArg2: #scrate::rstd::borrow::Borrow<#key2_type>, { <#name<#traitinstance> as #scrate::storage::unhashed::generator::StorageDoubleMap<#key1_type, #key2_type, #typ>> :: get(k1.borrow(), k2.borrow(), &#scrate::storage::RuntimeStorage) } @@ -727,42 +737,46 @@ fn store_functions_to_metadata ( let stype = match type_infos.kind { DeclStorageTypeInfosKind::Simple => { quote!{ - #scrate::storage::generator::StorageFunctionType::Plain( - #scrate::storage::generator::DecodeDifferent::Encode(#styp), + #scrate::metadata::StorageFunctionType::Plain( + #scrate::metadata::DecodeDifferent::Encode(#styp), ) } }, - DeclStorageTypeInfosKind::Map { key_type, is_linked } => { + DeclStorageTypeInfosKind::Map { key_type, is_linked, hasher } => { + let hasher = hasher.into_metadata(); let kty = clean_type_string("e!(#key_type).to_string()); quote!{ - #scrate::storage::generator::StorageFunctionType::Map { - key: #scrate::storage::generator::DecodeDifferent::Encode(#kty), - value: #scrate::storage::generator::DecodeDifferent::Encode(#styp), + #scrate::metadata::StorageFunctionType::Map { + hasher: #scrate::metadata::#hasher, + key: #scrate::metadata::DecodeDifferent::Encode(#kty), + value: #scrate::metadata::DecodeDifferent::Encode(#styp), is_linked: #is_linked, } } }, - DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher } => { + DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher, hasher } => { + let hasher = hasher.into_metadata(); let k1ty = clean_type_string("e!(#key1_type).to_string()); let k2ty = clean_type_string("e!(#key2_type).to_string()); let k2_hasher = clean_type_string(&key2_hasher.to_string()); quote!{ - #scrate::storage::generator::StorageFunctionType::DoubleMap { - key1: #scrate::storage::generator::DecodeDifferent::Encode(#k1ty), - key2: #scrate::storage::generator::DecodeDifferent::Encode(#k2ty), - value: #scrate::storage::generator::DecodeDifferent::Encode(#styp), - key2_hasher: #scrate::storage::generator::DecodeDifferent::Encode(#k2_hasher), + #scrate::metadata::StorageFunctionType::DoubleMap { + hasher: #scrate::metadata::#hasher, + key1: #scrate::metadata::DecodeDifferent::Encode(#k1ty), + key2: #scrate::metadata::DecodeDifferent::Encode(#k2ty), + value: #scrate::metadata::DecodeDifferent::Encode(#styp), + key2_hasher: #scrate::metadata::DecodeDifferent::Encode(#k2_hasher), } } }, }; let modifier = if type_infos.is_option { quote!{ - #scrate::storage::generator::StorageFunctionModifier::Optional + #scrate::metadata::StorageFunctionModifier::Optional } } else { quote!{ - #scrate::storage::generator::StorageFunctionModifier::Default + #scrate::metadata::StorageFunctionModifier::Default } }; let default = default_value.inner.as_ref().map(|d| &d.expr) @@ -786,16 +800,16 @@ fn store_functions_to_metadata ( let struct_name = proc_macro2::Ident::new(&("__GetByteStruct".to_string() + &str_name), name.span()); let cache_name = proc_macro2::Ident::new(&("__CACHE_GET_BYTE_STRUCT_".to_string() + &str_name), name.span()); let item = quote! { - #scrate::storage::generator::StorageFunctionMetadata { - name: #scrate::storage::generator::DecodeDifferent::Encode(#str_name), + #scrate::metadata::StorageFunctionMetadata { + name: #scrate::metadata::DecodeDifferent::Encode(#str_name), modifier: #modifier, ty: #stype, - default: #scrate::storage::generator::DecodeDifferent::Encode( - #scrate::storage::generator::DefaultByteGetter( + default: #scrate::metadata::DecodeDifferent::Encode( + #scrate::metadata::DefaultByteGetter( &#struct_name::<#traitinstance, #instance>(#scrate::rstd::marker::PhantomData) ) ), - documentation: #scrate::storage::generator::DecodeDifferent::Encode(&[ #docs ]), + documentation: #scrate::metadata::DecodeDifferent::Encode(&[ #docs ]), }, }; items.extend(item); @@ -806,7 +820,7 @@ fn store_functions_to_metadata ( #[allow(non_upper_case_globals)] static #cache_name: #scrate::once_cell::sync::OnceCell<#scrate::rstd::vec::Vec> = #scrate::once_cell::sync::OnceCell::INIT; #[cfg(feature = "std")] - impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::storage::generator::DefaultByte for #struct_name<#traitinstance, #instance> { + impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::metadata::DefaultByte for #struct_name<#traitinstance, #instance> { fn default_byte(&self) -> #scrate::rstd::vec::Vec { use #scrate::codec::Encode; #cache_name.get_or_init(|| { @@ -816,7 +830,7 @@ fn store_functions_to_metadata ( } } #[cfg(not(feature = "std"))] - impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::storage::generator::DefaultByte for #struct_name<#traitinstance, #instance> { + impl<#traitinstance: #traittype, #instance #bound_instantiable> #scrate::metadata::DefaultByte for #struct_name<#traitinstance, #instance> { fn default_byte(&self) -> #scrate::rstd::vec::Vec { use #scrate::codec::Encode; let def_val: #value_type = #default; @@ -848,10 +862,12 @@ pub(crate) struct DeclStorageTypeInfos<'a> { enum DeclStorageTypeInfosKind<'a> { Simple, Map { + hasher: HasherKind, key_type: &'a syn::Type, is_linked: bool, }, DoubleMap { + hasher: HasherKind, key1_type: &'a syn::Type, key2_type: &'a syn::Type, key2_hasher: TokenStream2, @@ -871,14 +887,17 @@ fn get_type_infos(storage_type: &DeclStorageType) -> DeclStorageTypeInfos { let (value_type, kind) = match storage_type { DeclStorageType::Simple(ref st) => (st, DeclStorageTypeInfosKind::Simple), DeclStorageType::Map(ref map) => (&map.value, DeclStorageTypeInfosKind::Map { + hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), key_type: &map.key, is_linked: false, }), DeclStorageType::LinkedMap(ref map) => (&map.value, DeclStorageTypeInfosKind::Map { + hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), key_type: &map.key, is_linked: true, }), DeclStorageType::DoubleMap(ref map) => (&map.value, DeclStorageTypeInfosKind::DoubleMap { + hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256), key1_type: &map.key1, key2_type: &map.key2.content, key2_hasher: { let h = &map.key2_hasher; quote! { #h } }, diff --git a/srml/support/procedural/tools/Cargo.toml b/srml/support/procedural/tools/Cargo.toml index fedff54c49a3bb152d93354fd32f412a64653210..bb6d24def2da8c933fc1881e3bf4c53f39063dd0 100644 --- a/srml/support/procedural/tools/Cargo.toml +++ b/srml/support/procedural/tools/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "srml-support-procedural-tools" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] srml-support-procedural-tools-derive = { path = "./derive" } -proc-macro2 = "0.4" -quote = { version = "0.6" } -syn = { version = "0.15", features = ["full"] } +proc-macro2 = "0.4.27" +quote = { version = "0.6.12" } +syn = { version = "0.15.30", features = ["full"] } proc-macro-crate = "0.1.3" diff --git a/srml/support/procedural/tools/derive/Cargo.toml b/srml/support/procedural/tools/derive/Cargo.toml index 20ced9962981590c4a411576ed7948da56c37a02..2f7f35ff4a70228423ec451aaf9c641c30e38699 100644 --- a/srml/support/procedural/tools/derive/Cargo.toml +++ b/srml/support/procedural/tools/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "srml-support-procedural-tools-derive" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -8,6 +8,6 @@ edition = "2018" proc-macro = true [dependencies] -proc-macro2 = "0.4.24" -quote = { version = "0.6.10", features = ["proc-macro"] } -syn = { version = "0.15.21", features = ["proc-macro" ,"full", "extra-traits", "parsing"] } +proc-macro2 = "0.4.27" +quote = { version = "0.6.12", features = ["proc-macro"] } +syn = { version = "0.15.30", features = ["proc-macro" ,"full", "extra-traits", "parsing"] } diff --git a/srml/support/procedural/tools/derive/src/lib.rs b/srml/support/procedural/tools/derive/src/lib.rs index 0e3fcb22475fc2e9babeeb3a3c7268c4a16ab018..4bf1a5f44c252cfe97c8ea85318e9aa93f030f8e 100644 --- a/srml/support/procedural/tools/derive/src/lib.rs +++ b/srml/support/procedural/tools/derive/src/lib.rs @@ -58,7 +58,7 @@ pub(crate) fn fields_access( /// For enums: /// variant are tested in order of definition. /// Empty variant is always true. -/// Please use carefully, this will fully parse successfull variant twice. +/// Please use carefully, this will fully parse successful variant twice. #[proc_macro_derive(Parse)] pub fn derive_parse(input: TokenStream) -> TokenStream { let item = parse_macro_input!(input as syn::Item); diff --git a/srml/support/procedural/tools/src/lib.rs b/srml/support/procedural/tools/src/lib.rs index 34b96df8104b50e33656a3636cb55530d9f84963..1b8a580773d0b6eee6a0f2e16a2d04cc9fb96490 100644 --- a/srml/support/procedural/tools/src/lib.rs +++ b/srml/support/procedural/tools/src/lib.rs @@ -27,30 +27,6 @@ use quote::quote; pub mod syn_ext; -#[macro_export] -macro_rules! custom_keyword_impl { - ($name:ident, $keyident:expr, $keydisp:expr) => { - - impl CustomKeyword for $name { - fn ident() -> &'static str { $keyident } - fn display() -> &'static str { $keydisp } - } - - } -} - -#[macro_export] -macro_rules! custom_keyword { - ($name:ident, $keyident:expr, $keydisp:expr) => { - - #[derive(Debug)] - struct $name; - - custom_keyword_impl!($name, $keyident, $keydisp); - - } -} - // FIXME #1569, remove the following functions, which are copied from sr-api-macros use proc_macro2::{TokenStream, Span}; use syn::Ident; @@ -95,8 +71,8 @@ pub fn generate_hidden_includes(unique_id: &str, def_crate: &str) -> TokenStream } } -// fn to remove white spaces arount string types -// (basically whitespaces arount tokens) +// fn to remove white spaces around string types +// (basically whitespaces around tokens) pub fn clean_type_string(input: &str) -> String { input .replace(" ::", "::") diff --git a/srml/support/procedural/tools/src/syn_ext.rs b/srml/support/procedural/tools/src/syn_ext.rs index c2136b2cd8f96599d09f8ce4ff34d5c6a2349142..01177b9b3ed77ad3e7ba7f06bc56f0122947e15f 100644 --- a/srml/support/procedural/tools/src/syn_ext.rs +++ b/srml/support/procedural/tools/src/syn_ext.rs @@ -23,7 +23,6 @@ use syn::parse::{ ParseStream, Result, }; -use syn::token::CustomKeyword; use proc_macro2::TokenStream as T2; use quote::{ToTokens, quote}; use std::iter::once; @@ -72,32 +71,6 @@ groups_impl!(Braces, Brace, Brace, parse_braces); groups_impl!(Brackets, Bracket, Bracket, parse_brackets); groups_impl!(Parens, Paren, Parenthesis, parse_parens); -#[derive(Debug)] -pub struct CustomToken(std::marker::PhantomData); - -impl Parse for CustomToken { - fn parse(input: ParseStream) -> Result { - let ident: syn::Ident = input.parse()?; - - if ident.to_string().as_str() != T::ident() { - return Err(syn::parse::Error::new_spanned(ident, "expected another custom token")) - } - Ok(CustomToken(std::marker::PhantomData)) - } -} - -impl ToTokens for CustomToken { - fn to_tokens(&self, tokens: &mut T2) { - use std::str::FromStr; - tokens.extend(T2::from_str(T::ident()).expect("custom keyword should parse to ident")); - } -} - -impl CustomKeyword for CustomToken { - fn ident() -> &'static str { ::ident() } - fn display() -> &'static str { ::display() } -} - #[derive(Debug)] pub struct PunctuatedInner { pub inner: syn::punctuated::Punctuated, diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index f249d3f2bce1c7e1293c3d3c19c826aac233c518..aa6282c773b27140077516d4ded6e1e3fb2d50ca 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -22,22 +22,19 @@ pub use crate::rstd::prelude::{Vec, Clone, Eq, PartialEq}; pub use std::fmt; pub use crate::rstd::result; pub use crate::codec::{Codec, Decode, Encode, Input, Output, HasCompact, EncodeAsRef}; -pub use srml_metadata::{ - FunctionMetadata, DecodeDifferent, DecodeDifferentArray, - FunctionArgumentMetadata, OuterDispatchMetadata, OuterDispatchCall -}; +pub use srml_metadata::{FunctionMetadata, DecodeDifferent, DecodeDifferentArray, FunctionArgumentMetadata}; -/// A type that can not be instantiated. +/// A type that cannot be instantiated. pub enum Never {} /// Result of a module function call; either nothing (functions are only called for "side effects") /// or an error message. pub type Result = result::Result<(), &'static str>; -/// A lazy call (module function and argument values) that can be executed via its dispatch() +/// A lazy call (module function and argument values) that can be executed via its `dispatch` /// method. pub trait Dispatchable { - /// Every function call to your runtime has an origin which specifies where the extrinsic was + /// Every function call from your runtime has an origin, which specifies where the extrinsic was /// generated from. In the case of a signed extrinsic (transaction), the origin contains an /// identifier for the caller. The origin can be empty in the case of an inherent extrinsic. type Origin; @@ -67,38 +64,140 @@ pub trait Parameter: Codec + Clone + Eq {} #[cfg(not(feature = "std"))] impl Parameter for T where T: Codec + Clone + Eq {} -/// Declare a module struct and implement the dispatch logic. +/// Declares a `Module` struct and a `Call` enum, which implements the dispatch logic. /// -/// Usually used as follows: +/// ## Declaration /// +/// ``` +/// # #[macro_use] +/// # extern crate srml_support; +/// # use srml_support::dispatch::Result; +/// # use srml_system::{self as system, Trait, ensure_signed}; /// decl_module! { -/// pub struct Module for enum Call where origin: T::Origin -///{} -/// } +/// pub struct Module for enum Call where origin: T::Origin { +/// +/// // Private functions are dispatchable, but not available to other +/// // SRML modules. +/// fn my_function(origin, var: u64) -> Result { +/// // Your implementation +/// Ok(()) +/// } +/// +/// // Public functions are both dispatchable and available to other +/// // SRML modules. +/// pub fn my_public_function(origin) -> Result { +/// // Your implementation +/// Ok(()) +/// } +/// } +/// } +/// # fn main() {} +/// ``` +/// +/// The declaration is set with the header where: +/// +/// * `Module`: The struct generated by the macro, with type `Trait`. +/// * `Call`: The enum generated for every module, which implements [`Callable`](./dispatch/trait.Callable.html). +/// * `origin`: Alias of `T::Origin`, declared by the [`impl_outer_origin!`](./macro.impl_outer_origin.html) macro. +/// * `Result`: The expected return type from module functions. /// -/// where "Trait" is a trait describing this module's requirements for the Runtime type. -/// T::Origin is declared using a impl_outer_origin! per-module macro (which is generated by the -/// construct_runtime! macro) and automatically includes all the modules that are used by the -/// runtime (alongside with a variant called "system"). +/// ### Shorthand Example /// -/// A runtime module is a collection of functions unified by a common problem domain and certain -/// shared types. The "functions" do not actually return values (see Dispatchable) and are only -/// used for side effects. +/// The macro automatically expands a shorthand function declaration to return the `Result` type. +/// These functions are the same: /// -/// For every module an associated enum (usually "Call") is generated with every variant -/// corresponding to a function of the module. This enum implements Callable and thus its values -/// can be used as an extrinsic's payload. +/// ``` +/// # #[macro_use] +/// # extern crate srml_support; +/// # use srml_support::dispatch::Result; +/// # use srml_system::{self as system, Trait, ensure_signed}; +/// decl_module! { +/// pub struct Module for enum Call where origin: T::Origin { +/// +/// fn my_long_function(origin) -> Result { +/// // Your implementation +/// Ok(()) +/// } +/// +/// fn my_short_function(origin) { +/// // Your implementation +/// } +/// } +/// } +/// # fn main() {} +/// ``` /// -/// The `on_initialize` and `on_finalize` functions are special, since it can either take no -/// parameters, or one parameter, which has the runtime's block number type. +/// ### Privileged Function Example /// -/// ### Module with instances +/// If the `origin` param is omitted, the macro adds it as the first parameter and adds `ensure_root(origin)` +/// as the first line of the function. These functions are the same: /// -/// decl_module! support modules with instances with the following syntax: (DefaultInstance type is -/// optionnal) -/// ```nocompile -/// pub struct Module, I: Instance = DefaultInstance> for enum Call where origin: T::Origin {} /// ``` +/// # #[macro_use] +/// # extern crate srml_support; +/// # use srml_support::dispatch::Result; +/// # use srml_system::{self as system, Trait, ensure_signed, ensure_root}; +/// decl_module! { +/// pub struct Module for enum Call where origin: T::Origin { +/// +/// fn my_privileged_function() -> Result { +/// // Your implementation +/// Ok(()) +/// } +/// +/// fn my_function(origin) -> Result { +/// ensure_root(origin); +/// // Your implementation +/// Ok(()) +/// } +/// } +/// } +/// # fn main() {} +/// ``` +/// +/// ## Multiple Module Instances Example +/// +/// A Substrate module can be built such that multiple instances of the same module can be used within a single +/// runtime. For example, the [Balances module](../srml_balances/index.html) can be added multiple times to your +/// runtime in order to support multiple, independent currencies for your blockchain. Here is an example of how +/// you would declare such a module using the `decl_module!` macro: +/// +/// ``` +/// # #[macro_use] +/// # extern crate srml_support; +/// # use srml_support::dispatch::Result; +/// # use srml_system::{self as system, ensure_signed}; +/// # pub struct DefaultInstance; +/// # pub trait Instance {} +/// # impl Instance for DefaultInstance {} +/// pub trait Trait: system::Trait {} +/// +/// decl_module! { +/// pub struct Module, I: Instance = DefaultInstance> for enum Call where origin: T::Origin { +/// // Your implementation +/// } +/// } +/// # fn main() {} +/// ``` +/// +/// ## Reserved Functions +/// +/// The following are reserved function signatures: +/// +/// * `deposit_event`: Helper function for depositing an [event](https://docs.substrate.dev/docs/event-enum). +/// The default behavior is to call `deposit_event` from the [System module](../srml_system/index.html). +/// However, you can write your own implementation for events in your runtime. To use the default behavior, +/// add `fn deposit_event() = default;` to your `Module`. +/// +/// The following reserved functions also take the block number (with type `T::BlockNumber`) as an optional input: +/// +/// * `on_initialize`: Executes at the beginning of a block. Using this function will +/// implement the [`OnInitialize`](../sr_primitives/traits/trait.OnInitialize.html) trait. +/// * `on_finalize`: Executes at the end of a block. Using this function will +/// implement the [`OnFinalize`](../sr_primitives/traits/trait.OnFinalize.html) trait. +/// * `offchain_worker`: Executes at the beginning of a block and produces extrinsics for a future block +/// upon completion. Using this function will implement the +/// [`OffchainWorker`](../sr_primitives/traits/trait.OffchainWorker.html) trait. #[macro_export] macro_rules! decl_module { // Macro transformations (to convert invocations with incomplete parameters to the canonical @@ -775,6 +874,10 @@ macro_rules! decl_module { { $( $on_finalize:tt )* } { $( $offchain:tt )* } ) => { + $crate::__check_reserved_fn_name! { + $($fn_name)* + } + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] @@ -1102,6 +1205,38 @@ macro_rules! __function_to_metadata { } } +#[macro_export] +#[doc(hidden)] +macro_rules! __check_reserved_fn_name { + (deposit_event $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error deposit_event); + }; + (on_initialize $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_initialize); + }; + (on_initialise $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_initialise); + }; + (on_finalize $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_finalize); + }; + (on_finalise $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error on_finalise); + }; + (offchain_worker $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!(@compile_error offchain_worker); + }; + ($t:ident $( $rest:ident )*) => { + $crate::__check_reserved_fn_name!($( $rest )*); + }; + () => {}; + (@compile_error $ident:ident) => { + compile_error!(concat!("Invalid call fn name: `", stringify!($ident), + "`, name is reserved and doesn't match expected signature, please refer to `decl_module!`", + " documentation to see the appropriate usage, or rename it to an unreserved keyword.")); + }; +} + #[cfg(test)] // Do not complain about unused `dispatch` and `dispatch_aux`. #[allow(dead_code)] diff --git a/srml/support/src/event.rs b/srml/support/src/event.rs index c03482f225b6b9e0f1e0bd47026be8d5006b611e..052e52d4f56463675dd5cc235da255bb7978aefc 100644 --- a/srml/support/src/event.rs +++ b/srml/support/src/event.rs @@ -24,33 +24,19 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn /// # Simple Event Example: /// /// ```rust -/// #[macro_use] -/// extern crate srml_support; -/// #[macro_use] -/// extern crate parity_codec as codec; -/// #[macro_use] -/// extern crate serde_derive; -/// -/// decl_event!( -/// pub enum Event { +/// srml_support::decl_event!( +/// pub enum Event { /// Success, /// Failure(String), /// } /// ); +/// ///# fn main() {} /// ``` /// /// # Generic Event Example: /// /// ```rust -/// #[macro_use] -/// extern crate srml_support; -/// extern crate parity_codec as codec; -/// #[macro_use] -/// extern crate parity_codec; -/// #[macro_use] -/// extern crate serde_derive; -/// /// trait Trait { /// type Balance; /// type Token; @@ -58,8 +44,8 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn /// /// mod event1 { /// // Event that specifies the generic parameter explicitly (`Balance`). -/// decl_event!( -/// pub enum Event where Balance = ::Balance { +/// srml_support::decl_event!( +/// pub enum Event where Balance = ::Balance { /// Message(Balance), /// } /// ); @@ -69,8 +55,8 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn /// // Event that uses the generic parameter `Balance`. /// // If no name for the generic parameter is specified explicitly, /// // the name will be taken from the type name of the trait. -/// decl_event!( -/// pub enum Event where ::Balance { +/// srml_support::decl_event!( +/// pub enum Event where ::Balance { /// Message(Balance), /// } /// ); @@ -78,12 +64,13 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn /// /// mod event3 { /// // And we even support declaring multiple generic parameters! -/// decl_event!( -/// pub enum Event where ::Balance, ::Token { +/// srml_support::decl_event!( +/// pub enum Event where ::Balance, ::Token { /// Message(Balance, Token), /// } /// ); /// } +/// ///# fn main() {} /// ``` /// @@ -92,14 +79,6 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn /// # Generic Event with Instance Example: /// /// ```rust -/// #[macro_use] -/// extern crate srml_support; -/// extern crate parity_codec as codec; -/// #[macro_use] -/// extern crate parity_codec; -/// #[macro_use] -/// extern crate serde_derive; -/// ///# struct DefaultInstance; ///# trait Instance {} ///# impl Instance for DefaultInstance {} @@ -108,8 +87,8 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn /// type Token; /// } /// -/// // For module with instances, DefaultInstance is optionnal -/// decl_event!( +/// // For module with instances, DefaultInstance is optional +/// srml_support::decl_event!( /// pub enum Event where /// ::Balance, /// ::Token @@ -509,8 +488,8 @@ macro_rules! __impl_outer_event_json_metadata { #[allow(dead_code)] mod tests { use super::*; - use serde_derive::Serialize; - use parity_codec::{Encode, Decode}; + use serde::Serialize; + use codec::{Encode, Decode}; mod system { pub trait Trait { @@ -634,7 +613,7 @@ mod tests { } decl_event!( - /// Event finish formatting on an named one with trailling comma + /// Event finish formatting on an named one with trailing comma pub enum Event where BalanceRenamed = ::Balance, OriginRenamed = ::Origin, diff --git a/srml/support/src/hashable.rs b/srml/support/src/hashable.rs index 886c88b23a3e83a360b6f344d03ef1abb8a9590d..b3ee2b3612c1efda2615a9f21d4e26b64325e528 100644 --- a/srml/support/src/hashable.rs +++ b/srml/support/src/hashable.rs @@ -17,15 +17,24 @@ //! Hashable trait. use crate::codec::Codec; -use runtime_io::{blake2_256, twox_128, twox_256}; +use runtime_io::{blake2_128, blake2_256, twox_128, twox_256}; +use crate::storage::hashed::generator::StorageHasher; +use crate::Twox64Concat; +use crate::rstd::prelude::Vec; +// This trait must be kept coherent with srml-support-procedural HasherKind usage pub trait Hashable: Sized { + fn blake2_128(&self) -> [u8; 16]; fn blake2_256(&self) -> [u8; 32]; fn twox_128(&self) -> [u8; 16]; fn twox_256(&self) -> [u8; 32]; + fn twox_64_concat(&self) -> Vec; } impl Hashable for T { + fn blake2_128(&self) -> [u8; 16] { + self.using_encoded(blake2_128) + } fn blake2_256(&self) -> [u8; 32] { self.using_encoded(blake2_256) } @@ -35,4 +44,7 @@ impl Hashable for T { fn twox_256(&self) -> [u8; 32] { self.using_encoded(twox_256) } + fn twox_64_concat(&self) -> Vec { + self.using_encoded(Twox64Concat::hash) + } } diff --git a/srml/support/src/inherent.rs b/srml/support/src/inherent.rs index 8a4fb669d15daafacb4cfaf6643374c70d2206cb..d886abbca7e373ece226eed2fdd0a4c7c011f51c 100644 --- a/srml/support/src/inherent.rs +++ b/srml/support/src/inherent.rs @@ -29,7 +29,7 @@ pub use inherents::{InherentData, ProvideInherent, CheckInherentsResult, IsFatal /// /// ```nocompile /// impl_outer_inherent! { -/// pub struct InherentData where Block = Block, UncheckedExtrinsic = UncheckedExtrinsic { +/// impl Inherents where Block = Block, UncheckedExtrinsic = UncheckedExtrinsic { /// timestamp: Timestamp, /// consensus: Consensus, /// /// Aura module using the `Timestamp` call. diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs index d99db6ddb828799039c10ce743c52d9c51ca4d5f..4f749d4c890049a28ad25fba31e3b4ba08c87791 100644 --- a/srml/support/src/lib.rs +++ b/srml/support/src/lib.rs @@ -17,7 +17,6 @@ //! Support code for the runtime. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] #[macro_use] extern crate bitmask; @@ -27,7 +26,7 @@ pub use serde; #[doc(hidden)] pub use sr_std as rstd; #[doc(hidden)] -pub use parity_codec as codec; +pub use codec; #[cfg(feature = "std")] #[doc(hidden)] pub use once_cell; @@ -35,8 +34,8 @@ pub use once_cell; pub use paste; pub use sr_primitives as runtime_primitives; -pub use self::storage::generator::Storage as GenericStorage; -pub use self::storage::unhashed::generator::UnhashedStorage as GenericUnhashedStorage; +pub use self::storage::hashed::generator::{HashedStorage, Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat}; +pub use self::storage::unhashed::generator::UnhashedStorage; #[macro_use] pub mod dispatch; @@ -53,18 +52,23 @@ pub mod metadata; mod runtime; #[macro_use] pub mod inherent; +#[macro_use] +pub mod unsigned; mod double_map; pub mod traits; -pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap}; +pub use self::storage::{StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap}; pub use self::hashable::Hashable; pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; pub use self::double_map::StorageDoubleMapWithHasher; -pub use runtime_io::print; +pub use runtime_io::{print, storage_root}; #[doc(inline)] pub use srml_support_procedural::decl_storage; +/// Return Err of the expression: `return Err($expression);`. +/// +/// Used as `fail!(expression)`. #[macro_export] macro_rules! fail { ( $y:expr ) => {{ @@ -72,6 +76,9 @@ macro_rules! fail { }} } +/// Evaluate `$x:expr` and if not true return `Err($y:expr)`. +/// +/// Used as `ensure!(expression_to_ensure, expression_to_return_on_false)`. #[macro_export] macro_rules! ensure { ( $x:expr, $y:expr ) => {{ @@ -81,16 +88,27 @@ macro_rules! ensure { }} } +/// Evaluate an expression, assert it returns an expected `Err` value and that +/// runtime storage has not been mutated (i.e. expression is a no-operation). +/// +/// Used as `assert_noop(expression_to_assert, expected_error_expression)`. #[macro_export] #[cfg(feature = "std")] macro_rules! assert_noop { ( $x:expr , $y:expr ) => { - let h = runtime_io::storage_root(); + let h = $crate::storage_root(); $crate::assert_err!($x, $y); - assert_eq!(h, runtime_io::storage_root()); + assert_eq!(h, $crate::storage_root()); } } +/// Panic if an expression doesn't evaluate to an `Err`. +/// +/// Used as `assert_err!(expression_to_assert, expected_err_expression)`. + +/// Assert an expression returns an error specified. +/// +/// Used as `assert_err!(expression_to_assert, expected_error_expression)` #[macro_export] #[cfg(feature = "std")] macro_rules! assert_err { @@ -99,6 +117,10 @@ macro_rules! assert_err { } } +/// Panic if an expression doesn't evaluate to `Ok`. +/// +/// Used as `assert_ok!(expression_to_assert, expected_ok_expression)`, +/// or `assert_ok!(expression_to_assert)` which would assert against `Ok(())`. #[macro_export] #[cfg(feature = "std")] macro_rules! assert_ok { @@ -159,7 +181,7 @@ pub enum Void {} #[cfg(feature = "std")] #[doc(hidden)] -pub use serde_derive::*; +pub use serde::{Serialize, Deserialize}; /// Programatically create derivations for tuples of up to 19 elements. You provide a second macro /// which is called once per tuple size, along with a number of identifiers, one for each element @@ -179,13 +201,13 @@ macro_rules! for_each_tuple { #[cfg(test)] mod tests { use super::*; - use parity_codec::Codec; + use codec::Codec; use runtime_io::{with_externalities, Blake2Hasher}; use runtime_primitives::BuildStorage; pub use srml_metadata::{ DecodeDifferent, StorageMetadata, StorageFunctionMetadata, StorageFunctionType, StorageFunctionModifier, - DefaultByte, DefaultByteGetter, + DefaultByte, DefaultByteGetter, StorageHasher }; pub use rstd::marker::PhantomData; @@ -209,13 +231,14 @@ mod tests { decl_storage! { trait Store for Module as Example { - pub Data get(data) build(|_| vec![(15u32, 42u64)]): linked_map u32 => u64; - pub GenericData get(generic_data): linked_map T::BlockNumber => T::BlockNumber; + pub Data get(data) build(|_| vec![(15u32, 42u64)]): linked_map hasher(twox_64_concat) u32 => u64; + pub GenericData get(generic_data): linked_map hasher(twox_128) T::BlockNumber => T::BlockNumber; pub GenericData2 get(generic_data2): linked_map T::BlockNumber => Option; - pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]): double_map u32, blake2_256(u32) => u64; + pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]): double_map hasher(twox_64_concat) u32, blake2_256(u32) => u64; pub GenericDataDM: double_map T::BlockNumber, twox_128(T::BlockNumber) => T::BlockNumber; pub GenericData2DM: double_map T::BlockNumber, twox_256(T::BlockNumber) => Option; + pub AppendableDM: double_map u32, blake2_256(T::BlockNumber) => Vec; } } @@ -345,6 +368,21 @@ mod tests { assert_eq!(DoubleMap::get(key1, key2+1), 0u64); assert_eq!(DoubleMap::get(key1+1, key2), 4u64); assert_eq!(DoubleMap::get(key1+1, key2+1), 4u64); + + }); + } + + #[test] + fn double_map_append_should_work() { + with_externalities(&mut new_test_ext(), || { + type DoubleMap = AppendableDM; + + let key1 = 17u32; + let key2 = 18u32; + + DoubleMap::insert(key1, key2, vec![1]); + DoubleMap::append(key1, key2, &[2, 3]).unwrap(); + assert_eq!(DoubleMap::get(key1, key2), vec![1, 2, 3]); }); } @@ -354,6 +392,7 @@ mod tests { name: DecodeDifferent::Encode("Data"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map{ + hasher: StorageHasher::Twox64Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), is_linked: true }, default: DecodeDifferent::Encode( @@ -365,6 +404,7 @@ mod tests { name: DecodeDifferent::Encode("GenericData"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map{ + hasher: StorageHasher::Twox128, key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), is_linked: true }, default: DecodeDifferent::Encode( @@ -376,6 +416,7 @@ mod tests { name: DecodeDifferent::Encode("GenericData2"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::Map{ + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), is_linked: true }, default: DecodeDifferent::Encode( @@ -387,6 +428,7 @@ mod tests { name: DecodeDifferent::Encode("DataDM"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::DoubleMap{ + hasher: StorageHasher::Twox64Concat, key1: DecodeDifferent::Encode("u32"), key2: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), @@ -401,6 +443,7 @@ mod tests { name: DecodeDifferent::Encode("GenericDataDM"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::DoubleMap{ + hasher: StorageHasher::Blake2_256, key1: DecodeDifferent::Encode("T::BlockNumber"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), @@ -415,6 +458,7 @@ mod tests { name: DecodeDifferent::Encode("GenericData2DM"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::DoubleMap{ + hasher: StorageHasher::Blake2_256, key1: DecodeDifferent::Encode("T::BlockNumber"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), @@ -425,6 +469,21 @@ mod tests { ), documentation: DecodeDifferent::Encode(&[]), }, + StorageFunctionMetadata { + name: DecodeDifferent::Encode("AppendableDM"), + modifier: StorageFunctionModifier::Default, + ty: StorageFunctionType::DoubleMap{ + hasher: StorageHasher::Blake2_256, + key1: DecodeDifferent::Encode("u32"), + key2: DecodeDifferent::Encode("T::BlockNumber"), + value: DecodeDifferent::Encode("Vec"), + key2_hasher: DecodeDifferent::Encode("blake2_256"), + }, + default: DecodeDifferent::Encode( + DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) + ), + documentation: DecodeDifferent::Encode(&[]), + }, ]) }; diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs index f7594d27b7c2b79a1cca6ea2bfb5e8135e5a3b9b..b1da7587be390d18789d0eb1a853a450d5e20790 100644 --- a/srml/support/src/metadata.rs +++ b/srml/support/src/metadata.rs @@ -16,10 +16,14 @@ pub use srml_metadata::{ DecodeDifferent, FnEncode, RuntimeMetadata, - ModuleMetadata, RuntimeMetadataV3, + ModuleMetadata, RuntimeMetadataV4, DefaultByteGetter, RuntimeMetadataPrefixed, + StorageMetadata, StorageFunctionMetadata, + StorageFunctionType, StorageFunctionModifier, + DefaultByte, StorageHasher }; + /// Implements the metadata support for the given runtime and all its modules. /// /// Example: @@ -36,8 +40,8 @@ macro_rules! impl_runtime_metadata { ) => { impl $runtime { pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed { - $crate::metadata::RuntimeMetadata::V3 ( - $crate::metadata::RuntimeMetadataV3 { + $crate::metadata::RuntimeMetadata::V4 ( + $crate::metadata::RuntimeMetadataV4 { modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*), } ).into() @@ -261,14 +265,14 @@ mod tests { pub enum RawOrigin { Root, Signed(AccountId), - Inherent, + None, } impl From> for RawOrigin { fn from(s: Option) -> RawOrigin { match s { Some(who) => RawOrigin::Signed(who), - None => RawOrigin::Inherent, + None => RawOrigin::None, } } } @@ -377,8 +381,8 @@ mod tests { event_module2::Module with Event Storage Call, ); - const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V3( - RuntimeMetadataV3 { + const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V4( + RuntimeMetadataV4 { modules: DecodeDifferent::Encode(&[ ModuleMetadata { name: DecodeDifferent::Encode("system"), diff --git a/srml/support/src/origin.rs b/srml/support/src/origin.rs index 2d97f218e095819fb41f8868a7b17929d7a4bcd2..48d4be80c6f984b068c0e882bb6ace3b1be27397 100644 --- a/srml/support/src/origin.rs +++ b/srml/support/src/origin.rs @@ -101,7 +101,7 @@ macro_rules! impl_outer_origin { } #[allow(dead_code)] impl $name { - pub const INHERENT: Self = $name::system($system::RawOrigin::Inherent); + pub const NONE: Self = $name::system($system::RawOrigin::None); pub const ROOT: Self = $name::system($system::RawOrigin::Root); pub fn signed(by: <$runtime as $system::Trait>::AccountId) -> Self { $name::system($system::RawOrigin::Signed(by)) @@ -156,14 +156,14 @@ mod tests { pub enum RawOrigin { Root, Signed(AccountId), - Inherent, + None, } impl From> for RawOrigin { fn from(s: Option) -> RawOrigin { match s { Some(who) => RawOrigin::Signed(who), - None => RawOrigin::Inherent, + None => RawOrigin::None, } } } diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs index 4f402da8d5b545c099a9db7307f0467dc34d6323..4bf574bae58d1803f8cd9f4f4d56f7b10e919f95 100644 --- a/srml/support/src/runtime.rs +++ b/srml/support/src/runtime.rs @@ -17,13 +17,14 @@ //! Macros to define a runtime. A runtime is basically all your logic running in Substrate, //! consisting of selected SRML modules and maybe some of your own modules. //! A lot of supporting logic is automatically generated for a runtime, -//! mostly for to combine data types and metadata of the included modules. +//! mostly to combine data types and metadata of the included modules. /// Construct a runtime, with the given name and the given modules. /// -/// The parameters here are specific types for Block, NodeBlock and InherentData -/// (TODO: describe the difference between Block and NodeBlock) -/// and the modules that are used by the runtime. +/// The parameters here are specific types for `Block`, `NodeBlock`, and `InherentData` +/// and the modules that are used by the runtime. +/// `Block` is the block type that is used in the runtime and `NodeBlock` is the block type +/// that is used in the node. For instance they can differ in the extrinsics type. /// /// # Example: /// @@ -56,6 +57,7 @@ /// `Test2: test_with_long_module::{Module}`. /// /// We provide support for the following types in a module: +/// /// - `Module` /// - `Call` /// - `Storage` @@ -66,11 +68,13 @@ /// - `Inherent $( (CALL) )*` - If the module provides/can check inherents. The optional parameter /// is for modules that use a `Call` from a different module as /// inherent. +/// - `ValidateUnsigned` - If the module validates unsigned extrinsics. /// /// # Note /// /// The population of the genesis storage depends on the order of modules. So, if one of your -/// modules depends on another module. The dependent module need to come before the module depending on it. +/// modules depends on another module, the module that is depended upon needs to come before +/// the module depending on it. #[macro_export] macro_rules! construct_runtime { @@ -286,6 +290,13 @@ macro_rules! construct_runtime { $name: $module::{ $( $modules $( ( $( $modules_args ),* ) )* ),* } ),*; ); + $crate::__impl_outer_validate_unsigned!( + $runtime; + {}; + $( + $name: $module::{ $( $modules $( ( $( $modules_args )* ) )* )* } + )* + ); } } @@ -343,7 +354,7 @@ macro_rules! __create_decl_macro { $d( $system:ident )?; { $d( $parsed:tt )* }; $name:ident : $module:ident:: < $module_instance:ident >:: { - $macro_enum_name <$event_generic:ident, $event_instance:path> $d(, $ingore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* )* + $macro_enum_name <$event_generic:ident, $event_instance:path> $d(, $ignore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* )* }, $d( $rest:tt )* ) => { @@ -362,7 +373,7 @@ macro_rules! __create_decl_macro { $d( $system:ident )?; { $d( $parsed:tt )* }; $name:ident : $module:ident:: < $module_instance:ident >:: { - $macro_enum_name $d( <$event_generic:ident> )* $d(, $ingore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* )* + $macro_enum_name $d( <$event_generic:ident> )* $d(, $ignore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* )* }, $d( $rest:tt )* ) => { @@ -378,7 +389,7 @@ macro_rules! __create_decl_macro { $d( $system:ident )?; { $d( $parsed:tt )* }; $name:ident : $module:ident:: { - $macro_enum_name $d( <$event_generic:ident $d(, $event_instance:path)?> )* $d(, $ingore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* )* + $macro_enum_name $d( <$event_generic:ident $d(, $event_instance:path)?> )* $d(, $ignore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* )* }, $d( $rest:tt )* ) => { @@ -397,7 +408,7 @@ macro_rules! __create_decl_macro { $d( $system:ident )?; { $d( $parsed:tt )* }; $name:ident : $module:ident:: $d( < $module_instance:ident >:: )? { - $ingore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* $d(, $modules:ident $d( <$modules_generic:ident $d(, $modules_instance:path)?> )* )* + $ignore:ident $d( <$ignor:ident $d(, $ignore_instance:path)?> )* $d(, $modules:ident $d( <$modules_generic:ident $d(, $modules_instance:path)?> )* )* }, $d( $rest:tt )* ) => { @@ -485,7 +496,7 @@ macro_rules! __decl_all_modules { $runtime:ident; $( $system:ident )?; { $( $parsed:tt )* }; - $name:ident: $module:ident:: $( < $module_instance:ident >:: )? { $ingore:ident $(, $modules:ident )* }, + $name:ident: $module:ident:: $( < $module_instance:ident >:: )? { $ignore:ident $(, $modules:ident )* }, $( $rest:tt )* ) => { $crate::__decl_all_modules!( @@ -532,7 +543,7 @@ macro_rules! __decl_outer_dispatch { $runtime:ident; $( $parsed_modules:ident :: $parsed_name:ident ),*; System: $module:ident::{ - $ingore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* + $ignore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* } $(, $rest_name:ident : $rest_module:ident::{ $( $rest_modules:ident $( <$rest_modules_generic:ident> )* ),* @@ -572,7 +583,7 @@ macro_rules! __decl_outer_dispatch { $runtime:ident; $( $parsed_modules:ident :: $parsed_name:ident ),*; $name:ident: $module:ident::{ - $ingore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* + $ignore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )* } $(, $rest_name:ident : $rest_module:ident::{ $( $rest_modules:ident $( <$rest_modules_generic:ident> )* ),* @@ -783,7 +794,7 @@ macro_rules! __decl_outer_config { $runtime:ident; { $( $parsed:tt )* }; $name:ident: $module:ident:: $( < $module_instance:ident >:: )? { - $ingore:ident $( <$ignor:ident $(, $ignore_instance:path)?> )* $(, $modules:ident $( <$modules_generic:ident $(, $modules_instance:path)?> )* )* + $ignore:ident $( <$ignor:ident $(, $ignore_instance:path)?> )* $(, $modules:ident $( <$modules_generic:ident $(, $modules_instance:path)?> )* )* }, $( $rest:tt )* ) => { @@ -880,7 +891,7 @@ macro_rules! __decl_outer_inherent { $uncheckedextrinsic:ident; $( $parsed_name:ident :: $parsed_call:ident ),*; $name:ident: $module:ident::{ - $ingore:ident $( ( $( $ignor:ident )* ) )* + $ignore:ident $( ( $( $ignor:ident )* ) )* $(, $modules:ident $( ( $( $modules_call:ident )* ) )* )* } $(, $rest_name:ident : $rest_module:ident::{ @@ -947,3 +958,65 @@ macro_rules! __decl_instance_import { } }; } + +/// A private macro that calls impl_outer_validate_unsigned for Call. +#[macro_export] +#[doc(hidden)] +macro_rules! __impl_outer_validate_unsigned { + ( + $runtime:ident; + { $( $parsed:tt )* }; + $name:ident: $module:ident:: $(<$module_instance:ident>::)? { + ValidateUnsigned $( $modules:ident $( ( $( $modules_args:ident )* ) )* )* + } + $( $rest:tt )* + ) => { + $crate::__impl_outer_validate_unsigned!( + $runtime; + { $( $parsed )* $name }; + $( $rest )* + ); + }; + ( + $runtime:ident; + { $( $parsed:tt )* }; + $name:ident: $module:ident:: $(<$module_instance:ident>::)? { + $ignore:ident $( ( $( $args_ignore:ident )* ) )* + $( $modules:ident $( ( $( $modules_args:ident )* ) )* )* + } + $( $rest:tt )* + ) => { + $crate::__impl_outer_validate_unsigned!( + $runtime; + { $( $parsed )* }; + $name: $module:: $(<$module_instance>::)? { + $( $modules $( ( $( $modules_args )* ) )* )* + } + $( $rest )* + ); + }; + ( + $runtime:ident; + { $( $parsed:tt )* }; + $name:ident: $module:ident:: $(<$module_instance:ident>::)? {} + $( $rest:tt )* + ) => { + $crate::__impl_outer_validate_unsigned!( + $runtime; + { $( $parsed )* }; + $( $rest )* + ); + }; + ( + $runtime:ident; + { $( + $parsed_modules:ident + )* }; + ) => { + $crate::impl_outer_validate_unsigned!( + impl ValidateUnsigned for $runtime { + $( $parsed_modules )* + } + ); + }; +} diff --git a/srml/support/src/storage/child.rs b/srml/support/src/storage/child.rs new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs new file mode 100644 index 0000000000000000000000000000000000000000..fb876a2adb5b489a5874913c944ba383c75060a0 --- /dev/null +++ b/srml/support/src/storage/hashed/generator.rs @@ -0,0 +1,285 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Abstract storage to use on HashedStorage trait + +use crate::codec; +use crate::rstd::prelude::{Vec, Box}; +#[cfg(feature = "std")] +use crate::storage::unhashed::generator::UnhashedStorage; +use runtime_io::{twox_64, twox_128, blake2_128, twox_256, blake2_256}; + +pub trait StorageHasher: 'static { + type Output: AsRef<[u8]>; + fn hash(x: &[u8]) -> Self::Output; +} + +/// Hash storage keys with `concat(twox128(key), key)` +pub struct Twox64Concat; +impl StorageHasher for Twox64Concat { + type Output = Vec; + fn hash(x: &[u8]) -> Vec { + twox_64(x) + .into_iter() + .chain(x.into_iter()) + .cloned() + .collect::>() + } +} + +#[test] +fn test_twox_64_concat() { + let r = Twox64Concat::hash(b"foo"); + assert_eq!(r.split_at(8), (&twox_128(b"foo")[..8], &b"foo"[..])) +} + +/// Hash storage keys with blake2 128 +pub struct Blake2_128; +impl StorageHasher for Blake2_128 { + type Output = [u8; 16]; + fn hash(x: &[u8]) -> [u8; 16] { + blake2_128(x) + } +} + +/// Hash storage keys with blake2 256 +pub struct Blake2_256; +impl StorageHasher for Blake2_256 { + type Output = [u8; 32]; + fn hash(x: &[u8]) -> [u8; 32] { + blake2_256(x) + } +} + +/// Hash storage keys with twox 128 +pub struct Twox128; +impl StorageHasher for Twox128 { + type Output = [u8; 16]; + fn hash(x: &[u8]) -> [u8; 16] { + twox_128(x) + } +} + +/// Hash storage keys with twox 256 +pub struct Twox256; +impl StorageHasher for Twox256 { + type Output = [u8; 32]; + fn hash(x: &[u8]) -> [u8; 32] { + twox_256(x) + } +} + +/// Abstraction around storage. +pub trait HashedStorage { + /// true if the key exists in storage. + fn exists(&self, key: &[u8]) -> bool; + + /// Load the bytes of a key from storage. Can panic if the type is incorrect. + fn get(&self, key: &[u8]) -> Option; + + /// Load the bytes of a key from storage. Can panic if the type is incorrect. Will panic if + /// it's not there. + fn require(&self, key: &[u8]) -> T { + self.get(key).expect("Required values must be in storage") + } + + /// Load the bytes of a key from storage. Can panic if the type is incorrect. The type's + /// default is returned if it's not there. + fn get_or_default(&self, key: &[u8]) -> T { + self.get(key).unwrap_or_default() + } + + /// Put a value in under a key. + fn put(&mut self, key: &[u8], val: &T); + + /// Remove the bytes of a key from storage. + fn kill(&mut self, key: &[u8]); + + /// Take a value from storage, deleting it after reading. + fn take(&mut self, key: &[u8]) -> Option { + let value = self.get(key); + self.kill(key); + value + } + + /// Take a value from storage, deleting it after reading. + fn take_or_panic(&mut self, key: &[u8]) -> T { + self.take(key).expect("Required values must be in storage") + } + + /// Take a value from storage, deleting it after reading. + fn take_or_default(&mut self, key: &[u8]) -> T { + self.take(key).unwrap_or_default() + } + + /// Get a Vec of bytes from storage. + fn get_raw(&self, key: &[u8]) -> Option>; + + /// Put a raw byte slice into storage. + fn put_raw(&mut self, key: &[u8], value: &[u8]); +} + +// We use a construct like this during when genesis storage is being built. +#[cfg(feature = "std")] +impl HashedStorage for sr_primitives::StorageOverlay { + fn exists(&self, key: &[u8]) -> bool { + UnhashedStorage::exists(self, &H::hash(key).as_ref()) + } + + fn get(&self, key: &[u8]) -> Option { + UnhashedStorage::get(self, &H::hash(key).as_ref()) + } + + fn put(&mut self, key: &[u8], val: &T) { + UnhashedStorage::put(self, &H::hash(key).as_ref(), val) + } + + fn kill(&mut self, key: &[u8]) { + UnhashedStorage::kill(self, &H::hash(key).as_ref()) + } + + fn get_raw(&self, key: &[u8]) -> Option> { + UnhashedStorage::get_raw(self, &H::hash(key).as_ref()) + } + + fn put_raw(&mut self, key: &[u8], value: &[u8]) { + UnhashedStorage::put_raw(self, &H::hash(key).as_ref(), value) + } +} + +/// A strongly-typed value kept in storage. +pub trait StorageValue { + /// The type that get/take returns. + type Query; + + /// Get the storage key. + fn key() -> &'static [u8]; + + /// true if the value is defined in storage. + fn exists>(storage: &S) -> bool { + storage.exists(Self::key()) + } + + /// Load the value from the provided storage instance. + fn get>(storage: &S) -> Self::Query; + + /// Take a value from storage, removing it afterwards. + fn take>(storage: &mut S) -> Self::Query; + + /// Store a value under this key into the provided storage instance. + fn put>(val: &T, storage: &mut S) { + storage.put(Self::key(), val) + } + + /// Mutate this value + fn mutate R, S: HashedStorage>(f: F, storage: &mut S) -> R; + + /// Clear the storage value. + fn kill>(storage: &mut S) { + storage.kill(Self::key()) + } + + /// Append the given items to the value in the storage. + /// + /// `T` is required to implement `codec::EncodeAppend`. + fn append, I: codec::Encode>( + items: &[I], storage: &mut S + ) -> Result<(), &'static str> where T: codec::EncodeAppend { + let new_val = ::append( + storage.get_raw(Self::key()).unwrap_or_default(), + items, + ).ok_or_else(|| "Could not append given item")?; + storage.put_raw(Self::key(), &new_val); + Ok(()) + } +} + +/// A strongly-typed list in storage. +pub trait StorageList { + /// Get the prefix key in storage. + fn prefix() -> &'static [u8]; + + /// Get the key used to put the length field. + fn len_key() -> Vec; + + /// Get the storage key used to fetch a value at a given index. + fn key_for(index: u32) -> Vec; + + /// Read out all the items. + fn items>(storage: &S) -> Vec; + + /// Set the current set of items. + fn set_items>(items: &[T], storage: &mut S); + + /// Set the item at the given index. + fn set_item>(index: u32, item: &T, storage: &mut S); + + /// Load the value at given index. Returns `None` if the index is out-of-bounds. + fn get>(index: u32, storage: &S) -> Option; + + /// Load the length of the list + fn len>(storage: &S) -> u32; + + /// Clear the list. + fn clear>(storage: &mut S); +} + +/// A strongly-typed map in storage. +pub trait StorageMap { + /// The type that get/take returns. + type Query; + + type Hasher: StorageHasher; + + /// Get the prefix key in storage. + fn prefix() -> &'static [u8]; + + /// Get the storage key used to fetch a value corresponding to a specific key. + fn key_for(x: &K) -> Vec; + + /// true if the value is defined in storage. + fn exists>(key: &K, storage: &S) -> bool { + storage.exists(&Self::key_for(key)[..]) + } + + /// Load the value associated with the given key from the map. + fn get>(key: &K, storage: &S) -> Self::Query; + + /// Take the value under a key. + fn take>(key: &K, storage: &mut S) -> Self::Query; + + /// Store a value to be associated with the given key from the map. + fn insert>(key: &K, val: &V, storage: &mut S) { + storage.put(&Self::key_for(key)[..], val); + } + + /// Remove the value under a key. + fn remove>(key: &K, storage: &mut S) { + storage.kill(&Self::key_for(key)[..]); + } + + /// Mutate the value under a key. + fn mutate R, S: HashedStorage>(key: &K, f: F, storage: &mut S) -> R; +} + +/// A `StorageMap` with enumerable entries. +pub trait EnumerableStorageMap: StorageMap { + /// Return current head element. + fn head>(storage: &S) -> Option; + + /// Enumerate all elements in the map. + fn enumerate<'a, S: HashedStorage>(storage: &'a S) -> Box + 'a> where K: 'a, V: 'a; +} diff --git a/srml/support/src/storage/hashed/mod.rs b/srml/support/src/storage/hashed/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..5c65cf0513b26e8cbfc3a8ea1d4bce110d444c2c --- /dev/null +++ b/srml/support/src/storage/hashed/mod.rs @@ -0,0 +1,223 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Operation on runtime storage using hashed keys. + +pub mod generator; +use super::unhashed; +use crate::rstd::prelude::*; +use crate::rstd::borrow::Borrow; +use runtime_io::{self, twox_128}; +use crate::codec::{Codec, Encode, Decode, KeyedVec}; + +/// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. +pub fn get R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> Option { + unhashed::get(&hash(key).as_ref()) +} + +/// Return the value of the item in storage under `key`, or the type's default if there is no +/// explicit entry. +pub fn get_or_default R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> T { + unhashed::get_or_default(&hash(key).as_ref()) +} + +/// Return the value of the item in storage under `key`, or `default_value` if there is no +/// explicit entry. +pub fn get_or R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: T) -> T { + unhashed::get_or(&hash(key).as_ref(), default_value) +} + +/// Return the value of the item in storage under `key`, or `default_value()` if there is no +/// explicit entry. +pub fn get_or_else T, HashFn: Fn(&[u8]) -> R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: F) -> T { + unhashed::get_or_else(&hash(key).as_ref(), default_value) +} + +/// Put `value` in storage under `key`. +pub fn put R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], value: &T) { + unhashed::put(&hash(key).as_ref(), value) +} + +/// Remove `key` from storage, returning its value if it had an explicit entry or `None` otherwise. +pub fn take R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> Option { + unhashed::take(&hash(key).as_ref()) +} + +/// Remove `key` from storage, returning its value, or, if there was no explicit entry in storage, +/// the default for its type. +pub fn take_or_default R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> T { + unhashed::take_or_default(&hash(key).as_ref()) +} + +/// Return the value of the item in storage under `key`, or `default_value` if there is no +/// explicit entry. Ensure there is no explicit entry on return. +pub fn take_or R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: T) -> T { + unhashed::take_or(&hash(key).as_ref(), default_value) +} + +/// Return the value of the item in storage under `key`, or `default_value()` if there is no +/// explicit entry. Ensure there is no explicit entry on return. +pub fn take_or_else T, HashFn: Fn(&[u8]) -> R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: F) -> T { + unhashed::take_or_else(&hash(key).as_ref(), default_value) +} + +/// Check to see if `key` has an explicit entry in storage. +pub fn exists R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> bool { + unhashed::exists(&hash(key).as_ref()) +} + +/// Ensure `key` has no explicit entry in storage. +pub fn kill R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) { + unhashed::kill(&hash(key).as_ref()) +} + +/// Get a Vec of bytes from storage. +pub fn get_raw R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> Option> { + unhashed::get_raw(&hash(key).as_ref()) +} + +/// Put a raw byte slice into storage. +pub fn put_raw R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], value: &[u8]) { + unhashed::put_raw(&hash(key).as_ref(), value) +} + +/// A trait to conveniently store a vector of storable data. +/// +/// It uses twox_128 hasher. Final keys in trie are `twox_128(concatenation(PREFIX,count))` +pub trait StorageVec { + type Item: Default + Sized + Codec; + const PREFIX: &'static [u8]; + + /// Get the current set of items. + fn items() -> Vec { + (0..Self::count()).into_iter().map(Self::item).collect() + } + + /// Set the current set of items. + fn set_items(items: I) + where + I: IntoIterator, + T: Borrow, + { + let mut count: u32 = 0; + + for i in items.into_iter() { + put(&twox_128, &count.to_keyed_vec(Self::PREFIX), i.borrow()); + count = count.checked_add(1).expect("exceeded runtime storage capacity"); + } + + Self::set_count(count); + } + + /// Push an item. + fn push(item: &Self::Item) { + let len = Self::count(); + put(&twox_128, &len.to_keyed_vec(Self::PREFIX), item); + Self::set_count(len + 1); + } + + fn set_item(index: u32, item: &Self::Item) { + if index < Self::count() { + put(&twox_128, &index.to_keyed_vec(Self::PREFIX), item); + } + } + + fn clear_item(index: u32) { + if index < Self::count() { + kill(&twox_128, &index.to_keyed_vec(Self::PREFIX)); + } + } + + fn item(index: u32) -> Self::Item { + get_or_default(&twox_128, &index.to_keyed_vec(Self::PREFIX)) + } + + fn set_count(count: u32) { + (count..Self::count()).for_each(Self::clear_item); + put(&twox_128, &b"len".to_keyed_vec(Self::PREFIX), &count); + } + + fn count() -> u32 { + get_or_default(&twox_128, &b"len".to_keyed_vec(Self::PREFIX)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use runtime_io::{twox_128, TestExternalities, with_externalities}; + + #[test] + fn integers_can_be_stored() { + let mut t = TestExternalities::default(); + with_externalities(&mut t, || { + let x = 69u32; + put(&twox_128, b":test", &x); + let y: u32 = get(&twox_128, b":test").unwrap(); + assert_eq!(x, y); + }); + with_externalities(&mut t, || { + let x = 69426942i64; + put(&twox_128, b":test", &x); + let y: i64 = get(&twox_128, b":test").unwrap(); + assert_eq!(x, y); + }); + } + + #[test] + fn bools_can_be_stored() { + let mut t = TestExternalities::default(); + with_externalities(&mut t, || { + let x = true; + put(&twox_128, b":test", &x); + let y: bool = get(&twox_128, b":test").unwrap(); + assert_eq!(x, y); + }); + + with_externalities(&mut t, || { + let x = false; + put(&twox_128, b":test", &x); + let y: bool = get(&twox_128, b":test").unwrap(); + assert_eq!(x, y); + }); + } + + #[test] + fn vecs_can_be_retrieved() { + let mut t = TestExternalities::default(); + with_externalities(&mut t, || { + runtime_io::set_storage(&twox_128(b":test"), b"\x2cHello world"); + let x = b"Hello world".to_vec(); + let y = get::, _, _>(&twox_128, b":test").unwrap(); + assert_eq!(x, y); + }); + } + + #[test] + fn vecs_can_be_stored() { + let mut t = TestExternalities::default(); + let x = b"Hello world".to_vec(); + + with_externalities(&mut t, || { + put(&twox_128, b":test", &x); + }); + + with_externalities(&mut t, || { + let y: Vec = get(&twox_128, b":test").unwrap(); + assert_eq!(x, y); + }); + } +} diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs index b1b8766b9028a466f30d6b7440be20b01a3b84af..635572c991914131aed79279e8bf2cdea8dedf80 100644 --- a/srml/support/src/storage/mod.rs +++ b/srml/support/src/storage/mod.rs @@ -18,12 +18,14 @@ use crate::rstd::prelude::*; use crate::rstd::borrow::Borrow; -use runtime_io::{self, twox_128}; -use crate::codec::{Codec, Encode, Decode, KeyedVec, Input}; +use codec::{Codec, Encode, Decode, KeyedVec, Input, EncodeAppend}; +use hashed::generator::{HashedStorage, StorageHasher}; +use unhashed::generator::UnhashedStorage; #[macro_use] -pub mod generator; +pub mod storage_items; pub mod unhashed; +pub mod hashed; struct IncrementalInput<'a> { key: &'a [u8], @@ -54,108 +56,44 @@ impl<'a> Input for IncrementalChildInput<'a> { } } - -/// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. -pub fn get(key: &[u8]) -> Option { - unhashed::get(&twox_128(key)) -} - -/// Return the value of the item in storage under `key`, or the type's default if there is no -/// explicit entry. -pub fn get_or_default(key: &[u8]) -> T { - unhashed::get_or_default(&twox_128(key)) -} - -/// Return the value of the item in storage under `key`, or `default_value` if there is no -/// explicit entry. -pub fn get_or(key: &[u8], default_value: T) -> T { - unhashed::get_or(&twox_128(key), default_value) -} - -/// Return the value of the item in storage under `key`, or `default_value()` if there is no -/// explicit entry. -pub fn get_or_else T>(key: &[u8], default_value: F) -> T { - unhashed::get_or_else(&twox_128(key), default_value) -} - -/// Put `value` in storage under `key`. -pub fn put(key: &[u8], value: &T) { - unhashed::put(&twox_128(key), value) -} - -/// Remove `key` from storage, returning its value if it had an explicit entry or `None` otherwise. -pub fn take(key: &[u8]) -> Option { - unhashed::take(&twox_128(key)) -} - -/// Remove `key` from storage, returning its value, or, if there was no explicit entry in storage, -/// the default for its type. -pub fn take_or_default(key: &[u8]) -> T { - unhashed::take_or_default(&twox_128(key)) -} - -/// Return the value of the item in storage under `key`, or `default_value` if there is no -/// explicit entry. Ensure there is no explicit entry on return. -pub fn take_or(key: &[u8], default_value: T) -> T { - unhashed::take_or(&twox_128(key), default_value) -} - -/// Return the value of the item in storage under `key`, or `default_value()` if there is no -/// explicit entry. Ensure there is no explicit entry on return. -pub fn take_or_else T>(key: &[u8], default_value: F) -> T { - unhashed::take_or_else(&twox_128(key), default_value) -} - -/// Check to see if `key` has an explicit entry in storage. -pub fn exists(key: &[u8]) -> bool { - unhashed::exists(&twox_128(key)) -} - -/// Ensure `key` has no explicit entry in storage. -pub fn kill(key: &[u8]) { - unhashed::kill(&twox_128(key)) -} - -/// Get a Vec of bytes from storage. -pub fn get_raw(key: &[u8]) -> Option> { - unhashed::get_raw(&twox_128(key)) -} - -/// Put a raw byte slice into storage. -pub fn put_raw(key: &[u8], value: &[u8]) { - unhashed::put_raw(&twox_128(key), value) -} - /// The underlying runtime storage. pub struct RuntimeStorage; -impl crate::GenericStorage for RuntimeStorage { +impl HashedStorage for RuntimeStorage { fn exists(&self, key: &[u8]) -> bool { - exists(key) + hashed::exists(&H::hash, key) } /// Load the bytes of a key from storage. Can panic if the type is incorrect. fn get(&self, key: &[u8]) -> Option { - get(key) + hashed::get(&H::hash, key) } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T) { - put(key, val) + fn put(&mut self, key: &[u8], val: &T) { + hashed::put(&H::hash, key, val) } /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]) { - kill(key) + fn kill(&mut self, key: &[u8]) { + hashed::kill(&H::hash, key) } /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { - take(key) + fn take(&mut self, key: &[u8]) -> Option { + hashed::take(&H::hash, key) + } + + fn get_raw(&self, key: &[u8]) -> Option> { + hashed::get_raw(&H::hash, key) + } + + fn put_raw(&mut self, key: &[u8], value: &[u8]) { + hashed::put_raw(&H::hash, key, value) } } -impl crate::GenericUnhashedStorage for RuntimeStorage { +impl UnhashedStorage for RuntimeStorage { fn exists(&self, key: &[u8]) -> bool { unhashed::exists(key) } @@ -166,24 +104,32 @@ impl crate::GenericUnhashedStorage for RuntimeStorage { } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T) { + fn put(&mut self, key: &[u8], val: &T) { unhashed::put(key, val) } /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]) { + fn kill(&mut self, key: &[u8]) { unhashed::kill(key) } /// Remove the bytes of a key from storage. - fn kill_prefix(&self, prefix: &[u8]) { + fn kill_prefix(&mut self, prefix: &[u8]) { unhashed::kill_prefix(prefix) } /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { + fn take(&mut self, key: &[u8]) -> Option { unhashed::take(key) } + + fn get_raw(&self, key: &[u8]) -> Option> { + unhashed::get_raw(key) + } + + fn put_raw(&mut self, key: &[u8], value: &[u8]) { + unhashed::put_raw(key, value) + } } /// A trait for working with macro-generated storage values under the substrate storage API. @@ -211,13 +157,19 @@ pub trait StorageValue { /// Take a value from storage, removing it afterwards. fn take() -> Self::Query; + + /// Append the given item to the value in the storage. + /// + /// `T` is required to implement `codec::EncodeAppend`. + fn append(items: &[I]) -> Result<(), &'static str> + where T: EncodeAppend; } -impl StorageValue for U where U: generator::StorageValue { +impl StorageValue for U where U: hashed::generator::StorageValue { type Query = U::Query; fn key() -> &'static [u8] { - >::key() + >::key() } fn exists() -> bool { U::exists(&RuntimeStorage) @@ -226,16 +178,21 @@ impl StorageValue for U where U: generator::StorageValue { U::get(&RuntimeStorage) } fn put>(val: Arg) { - U::put(val.borrow(), &RuntimeStorage) + U::put(val.borrow(), &mut RuntimeStorage) } fn mutate R>(f: F) -> R { - U::mutate(f, &RuntimeStorage) + U::mutate(f, &mut RuntimeStorage) } fn kill() { - U::kill(&RuntimeStorage) + U::kill(&mut RuntimeStorage) } fn take() -> Self::Query { - U::take(&RuntimeStorage) + U::take(&mut RuntimeStorage) + } + fn append(items: &[I]) -> Result<(), &'static str> + where T: EncodeAppend + { + U::append(items, &mut RuntimeStorage) } } @@ -269,17 +226,17 @@ pub trait StorageList { fn clear(); } -impl StorageList for U where U: generator::StorageList { +impl StorageList for U where U: hashed::generator::StorageList { fn prefix() -> &'static [u8] { - >::prefix() + >::prefix() } fn len_key() -> Vec { - >::len_key() + >::len_key() } fn key_for(index: u32) -> Vec { - >::key_for(index) + >::key_for(index) } fn items() -> Vec { @@ -287,11 +244,11 @@ impl StorageList for U where U: generator::StorageList { } fn set_items(items: &[T]) { - U::set_items(items, &RuntimeStorage) + U::set_items(items, &mut RuntimeStorage) } fn set_item>(index: u32, val: Arg) { - U::set_item(index, val.borrow(), &RuntimeStorage) + U::set_item(index, val.borrow(), &mut RuntimeStorage) } fn get(index: u32) -> Option { @@ -303,7 +260,7 @@ impl StorageList for U where U: generator::StorageList { } fn clear() { - U::clear(&RuntimeStorage) + U::clear(&mut RuntimeStorage) } } @@ -337,15 +294,15 @@ pub trait StorageMap { fn take>(key: KeyArg) -> Self::Query; } -impl StorageMap for U where U: generator::StorageMap { +impl StorageMap for U where U: hashed::generator::StorageMap { type Query = U::Query; fn prefix() -> &'static [u8] { - >::prefix() + >::prefix() } fn key_for>(key: KeyArg) -> Vec { - >::key_for(key.borrow()) + >::key_for(key.borrow()) } fn exists>(key: KeyArg) -> bool { @@ -357,26 +314,26 @@ impl StorageMap for U where U: generator::StorageMa } fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg) { - U::insert(key.borrow(), val.borrow(), &RuntimeStorage) + U::insert(key.borrow(), val.borrow(), &mut RuntimeStorage) } fn remove>(key: KeyArg) { - U::remove(key.borrow(), &RuntimeStorage) + U::remove(key.borrow(), &mut RuntimeStorage) } fn mutate, R, F: FnOnce(&mut Self::Query) -> R>(key: KeyArg, f: F) -> R { - U::mutate(key.borrow(), f, &RuntimeStorage) + U::mutate(key.borrow(), f, &mut RuntimeStorage) } fn take>(key: KeyArg) -> Self::Query { - U::take(key.borrow(), &RuntimeStorage) + U::take(key.borrow(), &mut RuntimeStorage) } } /// A storage map that can be enumerated. /// -/// Note that type is primarily useful for off-chain computations. -/// Runtime implementors should avoid enumerating storage entries. +/// Primarily useful for off-chain computations. +/// Runtime implementors should avoid enumerating storage entries on-chain. pub trait EnumerableStorageMap: StorageMap { /// Return current head element. fn head() -> Option; @@ -385,13 +342,13 @@ pub trait EnumerableStorageMap: StorageMap { fn enumerate() -> Box> where K: 'static, V: 'static; } -impl EnumerableStorageMap for U where U: generator::EnumerableStorageMap { +impl EnumerableStorageMap for U where U: hashed::generator::EnumerableStorageMap { fn head() -> Option { - >::head(&RuntimeStorage) + >::head(&RuntimeStorage) } fn enumerate() -> Box> where K: 'static, V: 'static { - >::enumerate(&RuntimeStorage) + >::enumerate(&RuntimeStorage) } } @@ -444,6 +401,20 @@ pub trait StorageDoubleMap { KArg1: Borrow, KArg2: Borrow, F: FnOnce(&mut Self::Query) -> R; + + /// Append the given items to the value under the key specified. + /// + /// `V` is required to implement `codec::EncodeAppend`. + fn append( + k1: KArg1, + k2: KArg2, + items: &[I], + ) -> Result<(), &'static str> + where + KArg1: Borrow, + KArg2: Borrow, + I: codec::Encode, + V: EncodeAppend; } impl StorageDoubleMap for U @@ -473,19 +444,19 @@ where } fn take, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query { - U::take(k1.borrow(), k2.borrow(), &RuntimeStorage) + U::take(k1.borrow(), k2.borrow(), &mut RuntimeStorage) } fn insert, KArg2: Borrow, VArg: Borrow>(k1: KArg1, k2: KArg2, val: VArg) { - U::insert(k1.borrow(), k2.borrow(), val.borrow(), &RuntimeStorage) + U::insert(k1.borrow(), k2.borrow(), val.borrow(), &mut RuntimeStorage) } fn remove, KArg2: Borrow>(k1: KArg1, k2: KArg2) { - U::remove(k1.borrow(), k2.borrow(), &RuntimeStorage) + U::remove(k1.borrow(), k2.borrow(), &mut RuntimeStorage) } fn remove_prefix>(k1: KArg1) { - U::remove_prefix(k1.borrow(), &RuntimeStorage) + U::remove_prefix(k1.borrow(), &mut RuntimeStorage) } fn mutate(k1: KArg1, k2: KArg2, f: F) -> R @@ -494,76 +465,31 @@ where KArg2: Borrow, F: FnOnce(&mut Self::Query) -> R { - U::mutate(k1.borrow(), k2.borrow(), f, &RuntimeStorage) - } -} - -/// A trait to conveniently store a vector of storable data. -pub trait StorageVec { - type Item: Default + Sized + Codec; - const PREFIX: &'static [u8]; - - /// Get the current set of items. - fn items() -> Vec { - (0..Self::count()).into_iter().map(Self::item).collect() + U::mutate(k1.borrow(), k2.borrow(), f, &mut RuntimeStorage) } - /// Set the current set of items. - fn set_items(items: I) - where - I: IntoIterator, - T: Borrow, + fn append( + k1: KArg1, + k2: KArg2, + items: &[I], + ) -> Result<(), &'static str> + where + KArg1: Borrow, + KArg2: Borrow, + I: codec::Encode, + V: EncodeAppend, { - let mut count: u32 = 0; - - for i in items.into_iter() { - put(&count.to_keyed_vec(Self::PREFIX), i.borrow()); - count = count.checked_add(1).expect("exceeded runtime storage capacity"); - } - - Self::set_count(count); - } - - /// Push an item. - fn push(item: &Self::Item) { - let len = Self::count(); - put(&len.to_keyed_vec(Self::PREFIX), item); - Self::set_count(len + 1); - } - - fn set_item(index: u32, item: &Self::Item) { - if index < Self::count() { - put(&index.to_keyed_vec(Self::PREFIX), item); - } - } - - fn clear_item(index: u32) { - if index < Self::count() { - kill(&index.to_keyed_vec(Self::PREFIX)); - } - } - - fn item(index: u32) -> Self::Item { - get_or_default(&index.to_keyed_vec(Self::PREFIX)) - } - - fn set_count(count: u32) { - (count..Self::count()).for_each(Self::clear_item); - put(&b"len".to_keyed_vec(Self::PREFIX), &count); - } - - fn count() -> u32 { - get_or_default(&b"len".to_keyed_vec(Self::PREFIX)) + U::append(k1.borrow(), k2.borrow(), items, &mut RuntimeStorage) } } /// child storage NOTE could replace unhashed by having only one kind of storage (root being null storage /// key (storage_key can become Option<&[u8]>). /// This module is a currently only a variant of unhashed with additional `storage_key`. -/// Note that `storage_key` must be unique and strong (strong in the sense of being long enough to +/// Note that `storage_key` must be unique and strong (strong in the sense of being long enough to /// avoid collision from a resistant hash function (which unique implies)). pub mod child { - use super::{runtime_io, Codec, Decode, Vec, IncrementalChildInput}; + use super::{Codec, Decode, Vec, IncrementalChildInput}; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(storage_key: &[u8], key: &[u8]) -> Option { @@ -632,7 +558,7 @@ pub mod child { runtime_io::read_child_storage(storage_key, key, &mut [0;0][..], 0).is_some() } - /// Remove all `storage_key` key/values + /// Remove all `storage_key` key/values pub fn kill_storage(storage_key: &[u8]) { runtime_io::kill_child_storage(storage_key) } @@ -654,71 +580,3 @@ pub mod child { pub use super::unhashed::StorageVec; } - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::{twox_128, TestExternalities, with_externalities}; - - #[test] - fn integers_can_be_stored() { - let mut t = TestExternalities::default(); - with_externalities(&mut t, || { - let x = 69u32; - put(b":test", &x); - let y: u32 = get(b":test").unwrap(); - assert_eq!(x, y); - }); - with_externalities(&mut t, || { - let x = 69426942i64; - put(b":test", &x); - let y: i64 = get(b":test").unwrap(); - assert_eq!(x, y); - }); - } - - #[test] - fn bools_can_be_stored() { - let mut t = TestExternalities::default(); - with_externalities(&mut t, || { - let x = true; - put(b":test", &x); - let y: bool = get(b":test").unwrap(); - assert_eq!(x, y); - }); - - with_externalities(&mut t, || { - let x = false; - put(b":test", &x); - let y: bool = get(b":test").unwrap(); - assert_eq!(x, y); - }); - } - - #[test] - fn vecs_can_be_retrieved() { - let mut t = TestExternalities::default(); - with_externalities(&mut t, || { - runtime_io::set_storage(&twox_128(b":test"), b"\x2cHello world"); - let x = b"Hello world".to_vec(); - let y = get::>(b":test").unwrap(); - assert_eq!(x, y); - - }); - } - - #[test] - fn vecs_can_be_stored() { - let mut t = TestExternalities::default(); - let x = b"Hello world".to_vec(); - - with_externalities(&mut t, || { - put(b":test", &x); - }); - - with_externalities(&mut t, || { - let y: Vec = get(b":test").unwrap(); - assert_eq!(x, y); - }); - } -} diff --git a/srml/support/src/storage/generator.rs b/srml/support/src/storage/storage_items.rs similarity index 73% rename from srml/support/src/storage/generator.rs rename to srml/support/src/storage/storage_items.rs index 97bfc6dc200ec2d1b1d1cdb1ca26d30873a34cb5..802965fc2702c2166ec6f313704cbaee89e064a2 100644 --- a/srml/support/src/storage/generator.rs +++ b/srml/support/src/storage/storage_items.rs @@ -46,10 +46,6 @@ //!# fn main() { } //! ``` -use crate::codec; -use crate::rstd::vec::Vec; -#[cfg(feature = "std")] -use crate::storage::unhashed::generator::UnhashedStorage; #[doc(hidden)] pub use crate::rstd::borrow::Borrow; #[doc(hidden)] @@ -57,176 +53,6 @@ pub use crate::rstd::marker::PhantomData; #[doc(hidden)] pub use crate::rstd::boxed::Box; -pub use srml_metadata::{ - DecodeDifferent, StorageMetadata, StorageFunctionMetadata, - StorageFunctionType, StorageFunctionModifier, - DefaultByte, DefaultByteGetter, -}; - -/// Abstraction around storage. -pub trait Storage { - /// true if the key exists in storage. - fn exists(&self, key: &[u8]) -> bool; - - /// Load the bytes of a key from storage. Can panic if the type is incorrect. - fn get(&self, key: &[u8]) -> Option; - - /// Load the bytes of a key from storage. Can panic if the type is incorrect. Will panic if - /// it's not there. - fn require(&self, key: &[u8]) -> T { self.get(key).expect("Required values must be in storage") } - - /// Load the bytes of a key from storage. Can panic if the type is incorrect. The type's - /// default is returned if it's not there. - fn get_or_default(&self, key: &[u8]) -> T { self.get(key).unwrap_or_default() } - - /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T); - - /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]); - - /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { - let value = self.get(key); - self.kill(key); - value - } - - /// Take a value from storage, deleting it after reading. - fn take_or_panic(&self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") } - - /// Take a value from storage, deleting it after reading. - fn take_or_default(&self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } -} - -// We use a construct like this during when genesis storage is being built. -#[cfg(feature = "std")] -impl Storage for (crate::rstd::cell::RefCell<&mut sr_primitives::StorageOverlay>, PhantomData) { - fn exists(&self, key: &[u8]) -> bool { - UnhashedStorage::exists(self, &S::hash(key)) - } - - fn get(&self, key: &[u8]) -> Option { - UnhashedStorage::get(self, &S::hash(key)) - } - - fn put(&self, key: &[u8], val: &T) { - UnhashedStorage::put(self, &S::hash(key), val) - } - - fn kill(&self, key: &[u8]) { - UnhashedStorage::kill(self, &S::hash(key)) - } -} - -/// A strongly-typed value kept in storage. -pub trait StorageValue { - /// The type that get/take returns. - type Query; - - /// Get the storage key. - fn key() -> &'static [u8]; - - /// true if the value is defined in storage. - fn exists(storage: &S) -> bool { - storage.exists(Self::key()) - } - - /// Load the value from the provided storage instance. - fn get(storage: &S) -> Self::Query; - - /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Self::Query; - - /// Store a value under this key into the provided storage instance. - fn put(val: &T, storage: &S) { - storage.put(Self::key(), val) - } - - /// Mutate this value - fn mutate R, S: Storage>(f: F, storage: &S) -> R; - - /// Clear the storage value. - fn kill(storage: &S) { - storage.kill(Self::key()) - } -} - -/// A strongly-typed list in storage. -pub trait StorageList { - /// Get the prefix key in storage. - fn prefix() -> &'static [u8]; - - /// Get the key used to put the length field. - fn len_key() -> Vec; - - /// Get the storage key used to fetch a value at a given index. - fn key_for(index: u32) -> Vec; - - /// Read out all the items. - fn items(storage: &S) -> Vec; - - /// Set the current set of items. - fn set_items(items: &[T], storage: &S); - - /// Set the item at the given index. - fn set_item(index: u32, item: &T, storage: &S); - - /// Load the value at given index. Returns `None` if the index is out-of-bounds. - fn get(index: u32, storage: &S) -> Option; - - /// Load the length of the list - fn len(storage: &S) -> u32; - - /// Clear the list. - fn clear(storage: &S); -} - -/// A strongly-typed map in storage. -pub trait StorageMap { - /// The type that get/take returns. - type Query; - - /// Get the prefix key in storage. - fn prefix() -> &'static [u8]; - - /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for(x: &K) -> Vec; - - /// true if the value is defined in storage. - fn exists(key: &K, storage: &S) -> bool { - storage.exists(&Self::key_for(key)[..]) - } - - /// Load the value associated with the given key from the map. - fn get(key: &K, storage: &S) -> Self::Query; - - /// Take the value under a key. - fn take(key: &K, storage: &S) -> Self::Query; - - /// Store a value to be associated with the given key from the map. - fn insert(key: &K, val: &V, storage: &S) { - storage.put(&Self::key_for(key)[..], val); - } - - /// Remove the value under a key. - fn remove(key: &K, storage: &S) { - storage.kill(&Self::key_for(key)[..]); - } - - /// Mutate the value under a key. - fn mutate R, S: Storage>(key: &K, f: F, storage: &S) -> R; -} - -/// A `StorageMap` with enumerable entries. -pub trait EnumerableStorageMap: StorageMap { - /// Return current head element. - fn head(storage: &S) -> Option; - - /// Enumerate all elements in the map. - fn enumerate<'a, S: Storage>(storage: &'a S) -> Box + 'a> where K: 'a, V: 'a; -} - // FIXME #1466 Remove this in favor of `decl_storage` macro. /// Declares strongly-typed wrappers around codec-compatible types in storage. #[macro_export] @@ -352,12 +178,12 @@ macro_rules! __storage_items_internal { // generator for values. (($($vis:tt)*) ($get_fn:ident) ($wraptype:ident $gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { $crate::__storage_items_internal!{ ($($vis)*) () ($wraptype $gettype) ($getter) ($taker) $name : $key => $ty } - pub fn $get_fn() -> $gettype { <$name as $crate::storage::generator::StorageValue<$ty>> :: get(&$crate::storage::RuntimeStorage) } + pub fn $get_fn() -> $gettype { <$name as $crate::storage::hashed::generator::StorageValue<$ty>> :: get(&$crate::storage::RuntimeStorage) } }; (($($vis:tt)*) () ($wraptype:ident $gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { $($vis)* struct $name; - impl $crate::storage::generator::StorageValue<$ty> for $name { + impl $crate::storage::hashed::generator::StorageValue<$ty> for $name { type Query = $gettype; /// Get the storage key. @@ -366,29 +192,29 @@ macro_rules! __storage_items_internal { } /// Load the value from the provided storage instance. - fn get(storage: &S) -> Self::Query { + fn get>(storage: &S) -> Self::Query { storage.$getter($key) } /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Self::Query { + fn take>(storage: &mut S) -> Self::Query { storage.$taker($key) } /// Mutate this value. - fn mutate R, S: $crate::GenericStorage>(f: F, storage: &S) -> R { - let mut val = >::get(storage); + fn mutate R, S: $crate::HashedStorage<$crate::Twox128>>(f: F, storage: &mut S) -> R { + let mut val = >::get(storage); let ret = f(&mut val); $crate::__handle_wrap_internal!($wraptype { // raw type case - >::put(&val, storage) + >::put(&val, storage) } { // Option<> type case match val { - Some(ref val) => >::put(&val, storage), - None => >::kill(storage), + Some(ref val) => >::put(&val, storage), + None => >::kill(storage), } }); @@ -400,15 +226,17 @@ macro_rules! __storage_items_internal { (($($vis:tt)*) ($get_fn:ident) ($wraptype:ident $gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { $crate::__storage_items_internal!{ ($($vis)*) () ($wraptype $gettype) ($getter) ($taker) $name : $prefix => map [$kty => $ty] } pub fn $get_fn>(key: K) -> $gettype { - <$name as $crate::storage::generator::StorageMap<$kty, $ty>> :: get(key.borrow(), &$crate::storage::RuntimeStorage) + <$name as $crate::storage::hashed::generator::StorageMap<$kty, $ty>> :: get(key.borrow(), &$crate::storage::RuntimeStorage) } }; (($($vis:tt)*) () ($wraptype:ident $gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { $($vis)* struct $name; - impl $crate::storage::generator::StorageMap<$kty, $ty> for $name { + impl $crate::storage::hashed::generator::StorageMap<$kty, $ty> for $name { type Query = $gettype; + type Hasher = $crate::Blake2_256; + /// Get the prefix key in storage. fn prefix() -> &'static [u8] { $prefix @@ -422,31 +250,31 @@ macro_rules! __storage_items_internal { } /// Load the value associated with the given key from the map. - fn get(key: &$kty, storage: &S) -> Self::Query { - let key = <$name as $crate::storage::generator::StorageMap<$kty, $ty>>::key_for(key); + fn get>(key: &$kty, storage: &S) -> Self::Query { + let key = <$name as $crate::storage::hashed::generator::StorageMap<$kty, $ty>>::key_for(key); storage.$getter(&key[..]) } /// Take the value, reading and removing it. - fn take(key: &$kty, storage: &S) -> Self::Query { - let key = <$name as $crate::storage::generator::StorageMap<$kty, $ty>>::key_for(key); + fn take>(key: &$kty, storage: &mut S) -> Self::Query { + let key = <$name as $crate::storage::hashed::generator::StorageMap<$kty, $ty>>::key_for(key); storage.$taker(&key[..]) } /// Mutate the value under a key. - fn mutate R, S: $crate::GenericStorage>(key: &$kty, f: F, storage: &S) -> R { - let mut val = >::take(key, storage); + fn mutate R, S: $crate::HashedStorage>(key: &$kty, f: F, storage: &mut S) -> R { + let mut val = >::take(key, storage); let ret = f(&mut val); $crate::__handle_wrap_internal!($wraptype { // raw type case - >::insert(key, &val, storage) + >::insert(key, &val, storage) } { // Option<> type case match val { - Some(ref val) => >::insert(key, &val, storage), - None => >::remove(key, storage), + Some(ref val) => >::insert(key, &val, storage), + None => >::remove(key, storage), } }); @@ -459,19 +287,19 @@ macro_rules! __storage_items_internal { $($vis)* struct $name; impl $name { - fn clear_item(index: u32, storage: &S) { - if index < <$name as $crate::storage::generator::StorageList<$ty>>::len(storage) { - storage.kill(&<$name as $crate::storage::generator::StorageList<$ty>>::key_for(index)); + fn clear_item>(index: u32, storage: &mut S) { + if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) { + storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)); } } - fn set_len(count: u32, storage: &S) { - (count..<$name as $crate::storage::generator::StorageList<$ty>>::len(storage)).for_each(|i| $name::clear_item(i, storage)); - storage.put(&<$name as $crate::storage::generator::StorageList<$ty>>::len_key(), &count); + fn set_len>(count: u32, storage: &mut S) { + (count..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage)).for_each(|i| $name::clear_item(i, storage)); + storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key(), &count); } } - impl $crate::storage::generator::StorageList<$ty> for $name { + impl $crate::storage::hashed::generator::StorageList<$ty> for $name { /// Get the prefix key in storage. fn prefix() -> &'static [u8] { $prefix @@ -492,43 +320,43 @@ macro_rules! __storage_items_internal { } /// Read out all the items. - fn items(storage: &S) -> $crate::rstd::vec::Vec<$ty> { - (0..<$name as $crate::storage::generator::StorageList<$ty>>::len(storage)) - .map(|i| <$name as $crate::storage::generator::StorageList<$ty>>::get(i, storage).expect("all items within length are set; qed")) + fn items>(storage: &S) -> $crate::rstd::vec::Vec<$ty> { + (0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage)) + .map(|i| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::get(i, storage).expect("all items within length are set; qed")) .collect() } /// Set the current set of items. - fn set_items(items: &[$ty], storage: &S) { + fn set_items>(items: &[$ty], storage: &mut S) { $name::set_len(items.len() as u32, storage); items.iter() .enumerate() - .for_each(|(i, item)| <$name as $crate::storage::generator::StorageList<$ty>>::set_item(i as u32, item, storage)); + .for_each(|(i, item)| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::set_item(i as u32, item, storage)); } - fn set_item(index: u32, item: &$ty, storage: &S) { - if index < <$name as $crate::storage::generator::StorageList<$ty>>::len(storage) { - storage.put(&<$name as $crate::storage::generator::StorageList<$ty>>::key_for(index)[..], item); + fn set_item>(index: u32, item: &$ty, storage: &mut S) { + if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) { + storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..], item); } } /// Load the value at given index. Returns `None` if the index is out-of-bounds. - fn get(index: u32, storage: &S) -> Option<$ty> { - storage.get(&<$name as $crate::storage::generator::StorageList<$ty>>::key_for(index)[..]) + fn get>(index: u32, storage: &S) -> Option<$ty> { + storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..]) } /// Load the length of the list. - fn len(storage: &S) -> u32 { - storage.get(&<$name as $crate::storage::generator::StorageList<$ty>>::len_key()).unwrap_or_default() + fn len>(storage: &S) -> u32 { + storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()).unwrap_or_default() } /// Clear the list. - fn clear(storage: &S) { - for i in 0..<$name as $crate::storage::generator::StorageList<$ty>>::len(storage) { + fn clear>(storage: &mut S) { + for i in 0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) { $name::clear_item(i, storage); } - storage.kill(&<$name as $crate::storage::generator::StorageList<$ty>>::len_key()[..]) + storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()[..]) } } }; @@ -555,28 +383,11 @@ macro_rules! __handle_wrap_internal { #[allow(dead_code)] mod tests { use std::collections::HashMap; - use std::cell::RefCell; - use codec::{Decode, Encode}; use super::*; + use crate::metadata::*; + use crate::metadata::StorageHasher; use crate::rstd::marker::PhantomData; - - impl Storage for RefCell, Vec>> { - fn exists(&self, key: &[u8]) -> bool { - self.borrow_mut().get(key).is_some() - } - - fn get(&self, key: &[u8]) -> Option { - self.borrow_mut().get(key).map(|v| T::decode(&mut &v[..]).unwrap()) - } - - fn put(&self, key: &[u8], val: &T) { - self.borrow_mut().insert(key.to_owned(), val.encode()); - } - - fn kill(&self, key: &[u8]) { - self.borrow_mut().remove(key); - } - } + use crate::storage::hashed::generator::*; storage_items! { Value: b"a" => u32; @@ -586,46 +397,46 @@ mod tests { #[test] fn value() { - let storage = RefCell::new(HashMap::new()); + let mut storage = HashMap::new(); assert!(Value::get(&storage).is_none()); - Value::put(&100_000, &storage); + Value::put(&100_000, &mut storage); assert_eq!(Value::get(&storage), Some(100_000)); - Value::kill(&storage); + Value::kill(&mut storage); assert!(Value::get(&storage).is_none()); } #[test] fn list() { - let storage = RefCell::new(HashMap::new()); + let mut storage = HashMap::new(); assert_eq!(List::len(&storage), 0); assert!(List::items(&storage).is_empty()); - List::set_items(&[0, 2, 4, 6, 8], &storage); + List::set_items(&[0, 2, 4, 6, 8], &mut storage); assert_eq!(List::items(&storage), &[0, 2, 4, 6, 8]); assert_eq!(List::len(&storage), 5); - List::set_item(2, &10, &storage); + List::set_item(2, &10, &mut storage); assert_eq!(List::items(&storage), &[0, 2, 10, 6, 8]); assert_eq!(List::len(&storage), 5); - List::clear(&storage); + List::clear(&mut storage); assert_eq!(List::len(&storage), 0); assert!(List::items(&storage).is_empty()); } #[test] fn map() { - let storage = RefCell::new(HashMap::new()); + let mut storage = HashMap::new(); assert!(Map::get(&5, &storage).is_none()); - Map::insert(&5, &[1; 32], &storage); + Map::insert(&5, &[1; 32], &mut storage); assert_eq!(Map::get(&5, &storage), Some([1; 32])); - assert_eq!(Map::take(&5, &storage), Some([1; 32])); + assert_eq!(Map::take(&5, &mut storage), Some([1; 32])); assert!(Map::get(&5, &storage).is_none()); assert!(Map::get(&999, &storage).is_none()); } pub trait Trait { - type Origin: codec::Encode + codec::Decode + ::std::default::Default; + type Origin: crate::codec::Encode + crate::codec::Decode + ::std::default::Default; type BlockNumber; } @@ -814,6 +625,7 @@ mod tests { name: DecodeDifferent::Encode("MAPU32"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -827,6 +639,7 @@ mod tests { name: DecodeDifferent::Encode("PUBMAPU32"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -840,6 +653,7 @@ mod tests { name: DecodeDifferent::Encode("MAPU32MYDEF"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -853,6 +667,7 @@ mod tests { name: DecodeDifferent::Encode("PUBMAPU32MYDEF"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -866,6 +681,7 @@ mod tests { name: DecodeDifferent::Encode("GETMAPU32"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -879,6 +695,7 @@ mod tests { name: DecodeDifferent::Encode("PUBGETMAPU32"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -892,6 +709,7 @@ mod tests { name: DecodeDifferent::Encode("GETMAPU32MYDEF"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -905,6 +723,7 @@ mod tests { name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: false, @@ -918,6 +737,7 @@ mod tests { name: DecodeDifferent::Encode("LINKEDMAPU32"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: true, @@ -931,6 +751,7 @@ mod tests { name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"), modifier: StorageFunctionModifier::Optional, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: true, @@ -944,6 +765,7 @@ mod tests { name: DecodeDifferent::Encode("GETLINKEDMAPU32"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: true, @@ -957,6 +779,7 @@ mod tests { name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"), modifier: StorageFunctionModifier::Default, ty: StorageFunctionType::Map { + hasher: StorageHasher::Blake2_256, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), is_linked: true, diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs index 2b046013bb9445da68348ca10cd0de2cdfe6419c..e6bbb5905f13120097434b19f90394179a8f051e 100644 --- a/srml/support/src/storage/unhashed/generator.rs +++ b/srml/support/src/storage/unhashed/generator.rs @@ -15,7 +15,6 @@ // along with Substrate. If not, see . use crate::codec; -use runtime_io::twox_128; use crate::rstd::vec::Vec; /// Abstraction around storage with unhashed access. @@ -35,53 +34,67 @@ pub trait UnhashedStorage { fn get_or_default(&self, key: &[u8]) -> T { self.get(key).unwrap_or_default() } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T); + fn put(&mut self, key: &[u8], val: &T); /// Remove the bytes of a key from storage. - fn kill(&self, key: &[u8]); + fn kill(&mut self, key: &[u8]); /// Remove the bytes of a key from storage. - fn kill_prefix(&self, prefix: &[u8]); + fn kill_prefix(&mut self, prefix: &[u8]); /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { + fn take(&mut self, key: &[u8]) -> Option { let value = self.get(key); self.kill(key); value } /// Take a value from storage, deleting it after reading. - fn take_or_panic(&self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") } + fn take_or_panic(&mut self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") } /// Take a value from storage, deleting it after reading. - fn take_or_default(&self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } + fn take_or_default(&mut self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } + + /// Get a Vec of bytes from storage. + fn get_raw(&self, key: &[u8]) -> Option>; + + /// Put a raw byte slice into storage. + fn put_raw(&mut self, key: &[u8], value: &[u8]); } // We use a construct like this during when genesis storage is being built. #[cfg(feature = "std")] -impl UnhashedStorage for (crate::rstd::cell::RefCell<&mut sr_primitives::StorageOverlay>, H) { +impl UnhashedStorage for sr_primitives::StorageOverlay { fn exists(&self, key: &[u8]) -> bool { - self.0.borrow().contains_key(key) + self.contains_key(key) } fn get(&self, key: &[u8]) -> Option { - self.0.borrow().get(key) + self.get(key) .map(|x| codec::Decode::decode(&mut x.as_slice()).expect("Unable to decode expected type.")) } - fn put(&self, key: &[u8], val: &T) { - self.0.borrow_mut().insert(key.to_vec(), codec::Encode::encode(val)); + fn put(&mut self, key: &[u8], val: &T) { + self.insert(key.to_vec(), codec::Encode::encode(val)); } - fn kill(&self, key: &[u8]) { - self.0.borrow_mut().remove(key); + fn kill(&mut self, key: &[u8]) { + self.remove(key); } - fn kill_prefix(&self, prefix: &[u8]) { - self.0.borrow_mut().retain(|key, _| { + fn kill_prefix(&mut self, prefix: &[u8]) { + self.retain(|key, _| { !key.starts_with(prefix) }) } + + fn get_raw(&self, key: &[u8]) -> Option> { + self.get(key).cloned() + } + + fn put_raw(&mut self, key: &[u8], value: &[u8]) { + self.insert(key.to_vec(), value.to_vec()); + } } /// An implementation of a map with a two keys. @@ -107,11 +120,7 @@ pub trait StorageDoubleMap fn key_for(k1: &K1, k2: &K2) -> Vec; /// Get the storage prefix used to fetch keys corresponding to a specific key1. - fn prefix_for(k1: &K1) -> Vec { - let mut key = Self::prefix().to_vec(); - codec::Encode::encode_to(k1, &mut key); - twox_128(&key).to_vec() - } + fn prefix_for(k1: &K1) -> Vec; /// true if the value is defined in storage. fn exists(k1: &K1, k2: &K2, storage: &S) -> bool { @@ -122,23 +131,43 @@ pub trait StorageDoubleMap fn get(k1: &K1, k2: &K2, storage: &S) -> Self::Query; /// Take the value under a key. - fn take(k1: &K1, k2: &K2, storage: &S) -> Self::Query; + fn take(k1: &K1, k2: &K2, storage: &mut S) -> Self::Query; /// Store a value to be associated with the given key from the map. - fn insert(k1: &K1, k2: &K2, val: &V, storage: &S) { + fn insert(k1: &K1, k2: &K2, val: &V, storage: &mut S) { storage.put(&Self::key_for(k1, k2), val); } /// Remove the value under a key. - fn remove(k1: &K1, k2: &K2, storage: &S) { + fn remove(k1: &K1, k2: &K2, storage: &mut S) { storage.kill(&Self::key_for(k1, k2)); } /// Removes all entries that shares the `k1` as the first key. - fn remove_prefix(k1: &K1, storage: &S) { + fn remove_prefix(k1: &K1, storage: &mut S) { storage.kill_prefix(&Self::prefix_for(k1)); } /// Mutate the value under a key. - fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &S) -> R; + fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &mut S) -> R; + + /// Append the given items to the value under the key specified. + fn append( + k1: &K1, + k2: &K2, + items: &[I], + storage: &mut S, + ) -> Result<(), &'static str> + where + I: codec::Encode, + V: codec::EncodeAppend, + { + let key = Self::key_for(k1, k2); + let new_val = ::append( + storage.get_raw(&key).unwrap_or_default(), + items, + ).ok_or_else(|| "Could not append given item")?; + storage.put_raw(&key, &new_val); + Ok(()) + } } diff --git a/srml/support/src/storage/unhashed/mod.rs b/srml/support/src/storage/unhashed/mod.rs index 225c6756b80de3788fa7faeda73533a78899e41b..40e18d0cd212a3bd198745cab7af999175f92b9a 100644 --- a/srml/support/src/storage/unhashed/mod.rs +++ b/srml/support/src/storage/unhashed/mod.rs @@ -17,7 +17,7 @@ //! Operation on unhashed runtime storage use crate::rstd::borrow::Borrow; -use super::{runtime_io, Codec, Encode, Decode, KeyedVec, Vec, IncrementalInput}; +use super::{Codec, Encode, Decode, KeyedVec, Vec, IncrementalInput}; pub mod generator; diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 6f0435a77a01d36160fa9ace1e4156bb8765e373..a8db5a946e7b23a83d048b86ec6e930704edb0f0 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -19,9 +19,48 @@ use crate::rstd::result; use crate::codec::{Codec, Encode, Decode}; use crate::runtime_primitives::traits::{ - MaybeSerializeDebug, SimpleArithmetic, As + MaybeSerializeDebug, SimpleArithmetic }; +/// New trait for querying a single fixed value from a type. +pub trait Get { + /// Return a constant value. + fn get() -> T; +} + +/// Macro for easily creating a new implementation of the `Get` trait. Use similarly to +/// how you would declare a `const`: +/// +/// ```no_compile +/// parameter_types! { +/// pub const Argument: u64 = 42; +/// } +/// trait Config { +/// type Parameter: Get; +/// } +/// struct Runtime; +/// impl Config for Runtime { +/// type Parameter = Argument; +/// } +/// ``` +#[macro_export] +macro_rules! parameter_types { + (pub const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => ( + pub struct $name; + parameter_types!{IMPL $name , $type , $value} + parameter_types!{ $( $rest )* } + ); + (const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => ( + struct $name; + parameter_types!{IMPL $name , $type , $value} + parameter_types!{ $( $rest )* } + ); + () => (); + (IMPL $name:ident , $type:ty , $value:expr) => { + impl $crate::traits::Get<$type> for $name { fn get() -> $type { $value } } + } +} + /// The account with the given id was killed. pub trait OnFreeBalanceZero { /// The account was the given id was killed. @@ -195,7 +234,7 @@ pub enum SignedImbalance>{ impl< P: Imbalance, N: Imbalance, - B: SimpleArithmetic + As + As + Codec + Copy + MaybeSerializeDebug + Default, + B: SimpleArithmetic + Codec + Copy + MaybeSerializeDebug + Default, > SignedImbalance { pub fn zero() -> Self { SignedImbalance::Positive(P::zero()) @@ -230,7 +269,7 @@ impl< /// Abstraction over a fungible assets system. pub trait Currency { /// The balance of an account. - type Balance: SimpleArithmetic + As + As + Codec + Copy + MaybeSerializeDebug + Default; + type Balance: SimpleArithmetic + Codec + Copy + MaybeSerializeDebug + Default; /// The opaque token type for an imbalance. This is returned by unbalanced operations /// and must be dealt with. It may be dropped but cannot be cloned. diff --git a/srml/support/src/unsigned.rs b/srml/support/src/unsigned.rs new file mode 100644 index 0000000000000000000000000000000000000000..8ea613461a1a83ddd25c421f03c276b7fe52da51 --- /dev/null +++ b/srml/support/src/unsigned.rs @@ -0,0 +1,154 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +#[doc(hidden)] +pub use crate::runtime_primitives::traits::ValidateUnsigned; +#[doc(hidden)] +pub use crate::runtime_primitives::transaction_validity::TransactionValidity; +#[doc(hidden)] +pub use crate::runtime_primitives::ApplyError; + + +/// Implement `ValidateUnsigned` for `Runtime`. +/// All given modules need to implement `ValidateUnsigned`. +/// +/// # Example +/// +/// ``` +/// # mod timestamp { +/// # pub struct Module; +/// # +/// # impl srml_support::unsigned::ValidateUnsigned for Module { +/// # type Call = Call; +/// # +/// # fn validate_unsigned(call: &Self::Call) -> srml_support::unsigned::TransactionValidity { +/// # unimplemented!(); +/// # } +/// # } +/// # +/// # pub enum Call { +/// # } +/// # } +/// # +/// # pub type Timestamp = timestamp::Module; +/// # +/// # +/// # pub enum Call { +/// # Timestamp(timestamp::Call), +/// # } +/// # #[allow(unused)] +/// pub struct Runtime; +/// +/// srml_support::impl_outer_validate_unsigned! { +/// impl ValidateUnsigned for Runtime { +/// Timestamp +/// } +/// } +/// ``` +#[macro_export] +macro_rules! impl_outer_validate_unsigned { + ( + impl ValidateUnsigned for $runtime:ident { + $( $module:ident )* + } + ) => { + impl $crate::unsigned::ValidateUnsigned for $runtime { + type Call = Call; + + fn validate_unsigned(call: &Self::Call) -> $crate::unsigned::TransactionValidity { + #[allow(unreachable_patterns)] + match call { + $( Call::$module(inner_call) => $module::validate_unsigned(inner_call), )* + _ => $crate::unsigned::TransactionValidity::Invalid($crate::unsigned::ApplyError::BadSignature as i8), + } + } + } + }; +} + +#[cfg(test)] +mod test_empty_call { + pub enum Call { + } + + #[allow(unused)] + pub struct Runtime; + + impl_outer_validate_unsigned! { + impl ValidateUnsigned for Runtime { + } + } +} + +#[cfg(test)] +mod test_partial_and_full_call { + pub mod timestamp { + pub struct Module; + + impl super::super::ValidateUnsigned for Module { + type Call = Call; + + fn validate_unsigned(_call: &Self::Call) -> super::super::TransactionValidity { + unimplemented!(); + } + } + + pub enum Call { + Foo, + } + } + + mod test_full_unsigned { + pub type Timestamp = super::timestamp::Module; + + pub enum Call { + Timestamp(super::timestamp::Call), + } + + pub struct Runtime; + + impl_outer_validate_unsigned! { + impl ValidateUnsigned for Runtime { + Timestamp + } + } + + #[test] + fn used() { + let _ = Call::Timestamp(super::timestamp::Call::Foo); + let _ = Runtime; + } + } + + mod test_not_full_unsigned { + pub enum Call { + Timestamp(super::timestamp::Call), + } + + pub struct Runtime; + + impl_outer_validate_unsigned! { + impl ValidateUnsigned for Runtime { + } + } + + #[test] + fn used() { + let _ = Call::Timestamp(super::timestamp::Call::Foo); + let _ = Runtime; + } + } +} diff --git a/srml/support/test/Cargo.toml b/srml/support/test/Cargo.toml index 46a6d320681d4411a7155dc7915c477c3b453c72..44a3b8d8841a20cdffbf6e7f62eef052574f2a47 100644 --- a/srml/support/test/Cargo.toml +++ b/srml/support/test/Cargo.toml @@ -1,17 +1,17 @@ [package] name = "srml-support-test" -version = "0.1.0" -authors = ["thiolliere "] +version = "2.0.0" +authors = ["Parity Technologies "] edition = "2018" -[dev-dependencies] -serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0" } +[dependencies] +serde = { version = "1.0", default-features = false, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } runtime_io = { package = "sr-io", path = "../../../core/sr-io", default-features = false } -srml-support = { path = "../", default-features = false } +srml-support = { version = "2", path = "../", default-features = false } inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false } primitives = { package = "substrate-primitives", path = "../../../core/primitives", default-features = false } +trybuild = "1" [features] default = ["std"] diff --git a/srml/support/test/src/lib.rs b/srml/support/test/src/lib.rs index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a7a869cf8794d7855697b6c7d3066c21b32533bb 100644 --- a/srml/support/test/src/lib.rs +++ b/srml/support/test/src/lib.rs @@ -0,0 +1,24 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +//! Test crate for srml_support. Allow to make use of `srml_support::decl_storage`. +//! See tests directory. + +#[test] +fn reserved_keyword() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/reserved_keyword/*.rs"); +} diff --git a/srml/support/test/tests/final_keys.rs b/srml/support/test/tests/final_keys.rs new file mode 100644 index 0000000000000000000000000000000000000000..549506df496c9505719ad0e07ff5a0c7fe84c480 --- /dev/null +++ b/srml/support/test/tests/final_keys.rs @@ -0,0 +1,100 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use runtime_io::{with_externalities, Blake2Hasher}; +use srml_support::{StorageValue, StorageMap, StorageDoubleMap}; +use srml_support::storage::unhashed; +use srml_support::runtime_primitives::BuildStorage; +use parity_codec::{Encode, Decode}; + +pub trait Trait { + type Origin; + type BlockNumber: Encode + Decode + Default + Clone; +} + +srml_support::decl_module! { + pub struct Module for enum Call where origin: T::Origin {} +} + +srml_support::decl_storage!{ + trait Store for Module as Module { + pub Value config(value): u32; + + pub Map: map u32 => u32; + pub Map2: map hasher(twox_128) u32 => u32; + + pub LinkedMap: linked_map u32 => u32; + pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; + + pub DoubleMap: double_map u32, blake2_256(u32) => u32; + pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32; + + pub Foo get(foo) config(): Option; + pub Foo2 get(foo2) config(): double_map u32, blake2_256(T::BlockNumber) => Option; + } +} + +struct Test; +impl Trait for Test { + type BlockNumber = u32; + type Origin = u32; +} + +fn new_test_ext() -> runtime_io::TestExternalities { + GenesisConfig::::default().build_storage().unwrap().0.into() +} + +#[test] +fn final_keys() { + with_externalities(&mut new_test_ext(), || { + >::put(1); + assert_eq!(unhashed::get::(&runtime_io::twox_128(b"Module Value")), Some(1u32)); + + >::insert(1, 2); + let mut k = b"Module Map".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"Module Map2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"Module LinkedMap".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"Module LinkedMap2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + >::insert(1, 2, 3); + let mut k = b"Module DoubleMap".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::blake2_256(&k).to_vec(); + k.extend(&runtime_io::blake2_256(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + + >::insert(1, 2, 3); + let mut k = b"Module DoubleMap2".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::twox_128(&k).to_vec(); + k.extend(&runtime_io::blake2_128(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + }); +} diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs index d5171f6ac7922995d36bcae390288d0eb27f254e..641ad9f4b56f475b922f13706c28f1910887dcb4 100644 --- a/srml/support/test/tests/instance.rs +++ b/srml/support/test/tests/instance.rs @@ -17,7 +17,7 @@ #![recursion_limit="128"] #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; use runtime_io::{with_externalities, Blake2Hasher}; use srml_support::rstd::prelude::*; use srml_support::rstd as rstd; @@ -75,14 +75,14 @@ mod system { pub enum RawOrigin { Root, Signed(AccountId), - Inherent, + None, } impl From> for RawOrigin { fn from(s: Option) -> RawOrigin { match s { Some(who) => RawOrigin::Signed(who), - None => RawOrigin::Inherent, + None => RawOrigin::None, } } } @@ -168,7 +168,7 @@ mod module1 { >; /// A logs in this module. - #[cfg_attr(feature = "std", derive(serde_derive::Serialize, Debug))] + #[cfg_attr(feature = "std", derive(serde::Serialize, Debug))] #[derive(parity_codec::Encode, parity_codec::Decode, PartialEq, Eq, Clone)] pub enum RawLog { _Phantom(rstd::marker::PhantomData<(T, I)>), @@ -242,7 +242,7 @@ mod module2 { >; /// A logs in this module. - #[cfg_attr(feature = "std", derive(serde_derive::Serialize, Debug))] + #[cfg_attr(feature = "std", derive(serde::Serialize, Debug))] #[derive(parity_codec::Encode, parity_codec::Decode, PartialEq, Eq, Clone)] pub enum RawLog { _Phantom(rstd::marker::PhantomData<(T, I)>), diff --git a/srml/support/test/tests/reserved_keyword/on_initialize.rs b/srml/support/test/tests/reserved_keyword/on_initialize.rs new file mode 100644 index 0000000000000000000000000000000000000000..c63153241ce8f3ce052d9e355e36aa3d5f860818 --- /dev/null +++ b/srml/support/test/tests/reserved_keyword/on_initialize.rs @@ -0,0 +1,33 @@ +macro_rules! reserved { + ($($reserved:ident)*) => { + $( + mod $reserved { + pub use srml_support::dispatch::Result; + + pub trait Trait { + type Origin; + type BlockNumber: Into; + } + + pub mod system { + use srml_support::dispatch::Result; + + pub fn ensure_root(_: R) -> Result { + Ok(()) + } + } + + srml_support::decl_module! { + pub struct Module for enum Call where origin: T::Origin { + fn $reserved() -> Result { unreachable!() } + } + } + } + )* + } +} + +reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + +fn main() { +} diff --git a/srml/support/test/tests/reserved_keyword/on_initialize.stderr b/srml/support/test/tests/reserved_keyword/on_initialize.stderr new file mode 100644 index 0000000000000000000000000000000000000000..7a37eb66c32acd89f96ef45fa3a88dd9724030c1 --- /dev/null +++ b/srml/support/test/tests/reserved_keyword/on_initialize.stderr @@ -0,0 +1,47 @@ +error: Invalid call fn name: `on_finalize`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `on_initialize`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `on_finalise`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `on_initialise`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `offchain_worker`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + +error: Invalid call fn name: `deposit_event`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. + --> $DIR/on_initialize.rs:30:1 + | +30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) diff --git a/srml/system/Cargo.toml b/srml/system/Cargo.toml index a39904fd5bbcbf7ea5ad95e4f5bae3466c077e42..5295d0708c429423ae926d370d210613a182c630 100644 --- a/srml/system/Cargo.toml +++ b/srml/system/Cargo.toml @@ -1,26 +1,26 @@ [package] name = "srml-system" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } safe-mix = { version = "1.0", default-features = false} -parity-codec = { version = "3.3", default-features = false, features = ["derive"] } +parity-codec = { version = "3.5", default-features = false, features = ["derive"] } substrate-primitives = { path = "../../core/primitives", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false } primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } srml-support = { path = "../support", default-features = false } +[dev-dependencies] +criterion = "0.2" + [features] default = ["std"] std = [ "serde", - "serde_derive", "safe-mix/std", "parity-codec/std", "substrate-primitives/std", @@ -29,3 +29,7 @@ std = [ "srml-support/std", "primitives/std", ] + +[[bench]] +name = "bench" +harness = false diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs new file mode 100644 index 0000000000000000000000000000000000000000..a5a87ff2e5e69f5f4193c064d1c18cb32b3996d6 --- /dev/null +++ b/srml/system/benches/bench.rs @@ -0,0 +1,99 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// 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 Substrate. If not, see . + +use criterion::{Criterion, criterion_group, criterion_main, black_box}; +use srml_system as system; +use srml_support::{decl_module, decl_event, impl_outer_origin, impl_outer_event}; +use runtime_io::{with_externalities, Blake2Hasher}; +use substrate_primitives::H256; +use primitives::{ + BuildStorage, traits::{BlakeTwo256, IdentityLookup}, + testing::{Digest, DigestItem, Header}, +}; + +mod module { + use super::*; + + pub trait Trait: system::Trait { + type Event: From + Into<::Event>; + } + + decl_module! { + pub struct Module for enum Call where origin: T::Origin { + pub fn deposit_event() = default; + } + } + + decl_event!( + pub enum Event { + Complex(Vec, u32, u16, u128), + } + ); +} + +impl_outer_origin!{ + pub enum Origin for Runtime {} +} + +impl_outer_event! { + pub enum Event for Runtime { + module, + } +} + +#[derive(Clone, Eq, PartialEq)] +pub struct Runtime; +impl system::Trait for Runtime { + type Origin = Origin; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type Digest = Digest; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = Event; + type Log = DigestItem; +} + +impl module::Trait for Runtime { + type Event = Event; +} + +fn new_test_ext() -> runtime_io::TestExternalities { + system::GenesisConfig::::default().build_storage().unwrap().0.into() +} + +fn deposit_events(n: usize) { + let mut t = new_test_ext(); + with_externalities(&mut t, || { + for _ in 0..n { + module::Module::::deposit_event( + module::Event::Complex(vec![1, 2, 3], 2, 3, 899) + ); + } + }); +} + +fn sr_system_benchmark(c: &mut Criterion) { + c.bench_function("deposit 100 events", |b| { + b.iter(|| deposit_events(black_box(100))) + }); +} + +criterion_group!(benches, sr_system_benchmark); +criterion_main!(benches); diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index f226fcb7d18552da3de82ea70ba80c31f659f1c6..9018b109e8f561387f83bc86b9b1e98801a8ac02 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -14,47 +14,48 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! # System module -//! -//! The system module provides low-level access to core types and cross-cutting utilities. +//! # System Module +//! +//! The System module provides low-level access to core types and cross-cutting utilities. //! It acts as the base layer for other SRML modules to interact with the Substrate framework components. -//! To use it in your module, you should ensure your module's trait implies the system [`Trait`]. -//! +//! +//! - [`system::Trait`](./trait.Trait.html) +//! //! ## Overview -//! -//! The system module defines the core data types used in a Substrate runtime. -//! It also provides several utility functions (see [`Module`]) for other runtime modules. -//! -//! In addition, it manages the storage items for extrinsics data, indexes, event record and digest items, +//! +//! The System module defines the core data types used in a Substrate runtime. +//! It also provides several utility functions (see [`Module`](./struct.Module.html)) for other runtime modules. +//! +//! In addition, it manages the storage items for extrinsics data, indexes, event records, and digest items, //! among other things that support the execution of the current block. -//! -//! It also handles low level tasks like depositing logs, basic set up and take down of -//! temporary storage entries and access to previous block hashes. -//! +//! +//! It also handles low-level tasks like depositing logs, basic set up and take down of +//! temporary storage entries, and access to previous block hashes. +//! //! ## Interface -//! -//! ### Dispatchable functions -//! -//! The system module does not implement any dispatchable functions. -//! -//! ### Public functions -//! -//! All public functions are available as part of the [`Module`] type. -//! +//! +//! ### Dispatchable Functions +//! +//! The System module does not implement any dispatchable functions. +//! +//! ### Public Functions +//! +//! See the [`Module`](./struct.Module.html) struct for details of publicly available functions. +//! //! ## Usage -//! +//! //! ### Prerequisites -//! -//! Import the system module and derive your module's configuration trait from the system trait. -//! +//! +//! Import the System module and derive your module's configuration trait from the system trait. +//! //! ### Example - Get random seed and extrinsic count for the current block -//! +//! //! ``` //! use srml_support::{decl_module, dispatch::Result}; //! use srml_system::{self as system, ensure_signed}; -//! +//! //! pub trait Trait: system::Trait {} -//! +//! //! decl_module! { //! pub struct Module for enum Call where origin: T::Origin { //! pub fn system_module_example(origin) -> Result { @@ -71,15 +72,21 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] -use serde_derive::Serialize; +use serde::Serialize; use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::map; -use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Lookup, - Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, As, CurrentHeight, BlockNumberToHash, - MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup}; +use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, One, Bounded, Lookup, + Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, CurrentHeight, BlockNumberToHash, + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, SaturatedConversion +}; +#[cfg(any(feature = "std", test))] +use primitives::traits::Zero; use substrate_primitives::storage::well_known_keys; -use srml_support::{storage, StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage}; +use srml_support::{ + storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue, + StorageMap, Parameter, +}; use safe_mix::TripletMix; use parity_codec::{Encode, Decode}; @@ -99,7 +106,7 @@ impl OnNewAccount for () { fn on_new_account(_who: &AccountId) {} } -/// Determinator to say whether a given account is unused. +/// Determiner to say whether a given account is unused. pub trait IsDeadAccount { /// Is the given account dead? fn is_dead_account(who: &AccountId) -> bool; @@ -135,12 +142,12 @@ pub trait Trait: 'static + Eq + Clone { type BlockNumber: Parameter + Member + MaybeSerializeDebug + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; - + /// The output of the `Hashing` function. type Hash: Parameter + Member + MaybeSerializeDebug + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]>; - + /// The hashing system (algorithm) being used in the runtime (e.g. Blake2). type Hashing: Hash; @@ -168,7 +175,7 @@ pub trait Trait: 'static + Eq + Clone { /// The aggregated event type of the runtime. type Event: Parameter + Member + From; - /// A piece of information which can be part of the digest (as a digest item). + /// A piece of information that can be part of the digest (as a digest item). type Log: From> + Into>; } @@ -176,13 +183,9 @@ pub type DigestItemOf = <::Digest as traits::Digest>::Item; decl_module! { pub struct Module for enum Call where origin: T::Origin { - /// Deposits an event onto this block's event record. + /// Deposits an event into this block's event record. pub fn deposit_event(event: T::Event) { - let extrinsic_index = Self::extrinsic_index(); - let phase = extrinsic_index.map_or(Phase::Finalization, |c| Phase::ApplyExtrinsic(c)); - let mut events = Self::events(); - events.push(EventRecord { phase, event }); - >::put(events); + Self::deposit_event_indexed(&[], event); } } } @@ -200,15 +203,17 @@ pub enum Phase { /// Record of an event happening. #[derive(Encode, Decode)] #[cfg_attr(feature = "std", derive(Serialize, PartialEq, Eq, Clone, Debug))] -pub struct EventRecord { +pub struct EventRecord { /// The phase of the block it happened in. pub phase: Phase, /// The event itself. pub event: E, + /// The list of the topics this event has. + pub topics: Vec, } decl_event!( - /// Event for the system module. + /// Event for the System module. pub enum Event { /// An extrinsic completed successfully. ExtrinsicSuccess, @@ -217,23 +222,25 @@ decl_event!( } ); -/// Origin for the system module. +/// Origin for the System module. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] pub enum RawOrigin { /// The system itself ordained this dispatch to happen: this is the highest privilege level. Root, - /// It is signed by some public key and we provide the AccountId. + /// It is signed by some public key and we provide the `AccountId`. Signed(AccountId), - /// It is signed by nobody but included and agreed upon by the validators anyway: it's "inherently" true. - Inherent, + /// It is signed by nobody, can be either: + /// * included and agreed upon by the validators anyway, + /// * or unsigned transaction validated by a module. + None, } impl From> for RawOrigin { fn from(s: Option) -> RawOrigin { match s { Some(who) => RawOrigin::Signed(who), - None => RawOrigin::Inherent, + None => RawOrigin::None, } } } @@ -245,7 +252,7 @@ pub type Log = RawLog< ::Hash, >; -/// A logs in this module. +/// A log in this module. #[cfg_attr(feature = "std", derive(Serialize, Debug))] #[derive(Encode, Decode, PartialEq, Eq, Clone)] pub enum RawLog { @@ -282,6 +289,12 @@ fn hash69 + Default>() -> T { h } +/// This type alias represents an index of an event. +/// +/// We use `u32` here because this index is used as index for `Events` +/// which can't contain more than `u32::max_value()` items. +type EventIndex = u32; + decl_storage! { trait Store for Module as System { /// Extrinsics nonce for accounts. @@ -292,12 +305,13 @@ decl_storage! { AllExtrinsicsLen: Option; /// Map of block numbers to block hashes. pub BlockHash get(block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): map T::BlockNumber => T::Hash; - /// Extrinsics data for the current block (maps extrinsic's index to its data). + /// Extrinsics data for the current block (maps an extrinsic's index to its data). ExtrinsicData get(extrinsic_data): map u32 => Vec; - /// Random seed of the current block. - RandomSeed get(random_seed) build(|_| T::Hash::default()): T::Hash; + /// Series of block headers from the last 81 blocks that acts as random seed material. This is arranged as a + /// ring buffer with the `i8` prefix being the index into the `Vec` of the oldest hash. + RandomMaterial get(random_material): (i8, Vec); /// The current block number being processed. Set by `execute_block`. - Number get(block_number) build(|_| T::BlockNumber::sa(1u64)): T::BlockNumber; + Number get(block_number) build(|_| 1.into()): T::BlockNumber; /// Hash of the previous block. ParentHash get(parent_hash) build(|_| hash69()): T::Hash; /// Extrinsics root of the current block, also part of the block header. @@ -305,7 +319,30 @@ decl_storage! { /// Digest of the current block, also part of the block header. Digest get(digest): T::Digest; /// Events deposited for the current block. - Events get(events): Vec>; + Events get(events): Vec>; + /// The number of events in the `Events` list. + EventCount get(event_count): EventIndex; + + // TODO: https://github.com/paritytech/substrate/issues/2553 + // Possibly, we can improve it by using something like: + // `Option<(BlockNumber, Vec)>`, however in this case we won't be able to use + // `EventTopics::append`. + + /// Mapping between a topic (represented by T::Hash) and a vector of indexes + /// of events in the `>` list. + /// + /// The first key serves no purpose. This field is declared as double_map just + /// for convenience of using `remove_prefix`. + /// + /// All topic vectors have deterministic storage locations depending on the topic. This + /// allows light-clients to leverage the changes trie storage tracking mechanism and + /// in case of changes fetch the list of events of interest. + /// + /// The value has the type `(T::BlockNumber, EventIndex)` because if we used only just + /// the `EventIndex` then in case if the topic has the same contents on the next block + /// no notification will be triggered thus the event might be lost. + EventTopics get(event_topics): double_map hasher(blake2_256) (), blake2_256(T::Hash) + => Vec<(T::BlockNumber, EventIndex)>; } add_extra_genesis { config(changes_trie_config): Option; @@ -354,17 +391,65 @@ pub fn ensure_root(o: OuterOrigin) -> Result<(), &'stati } /// Ensure that the origin `o` represents an unsigned extrinsic. Returns `Ok` or an `Err` otherwise. -pub fn ensure_inherent(o: OuterOrigin) -> Result<(), &'static str> +pub fn ensure_none(o: OuterOrigin) -> Result<(), &'static str> where OuterOrigin: Into>> { match o.into() { - Some(RawOrigin::Inherent) => Ok(()), - _ => Err("bad origin: expected to be an inherent origin"), + Some(RawOrigin::None) => Ok(()), + _ => Err("bad origin: expected to be no origin"), } } impl Module { - /// Gets the index of extrinsic that is currenty executing. + /// Deposits an event into this block's event record adding this event + /// to the corresponding topic indexes. + /// + /// This will update storage entries that correpond to the specified topics. + /// It is expected that light-clients could subscribe to this topics. + pub fn deposit_event_indexed(topics: &[T::Hash], event: T::Event) { + let extrinsic_index = Self::extrinsic_index(); + let phase = extrinsic_index.map_or(Phase::Finalization, |c| Phase::ApplyExtrinsic(c)); + let event = EventRecord { + phase, + event, + topics: topics.iter().cloned().collect::>(), + }; + + // Index of the to be added event. + let event_idx = { + let old_event_count = >::get(); + let new_event_count = match old_event_count.checked_add(1) { + // We've reached the maximum number of events at this block, just + // don't do anything and leave the event_count unaltered. + None => return, + Some(nc) => nc, + }; + >::put(new_event_count); + old_event_count + }; + + // Appending can only fail if `Events` can not be decoded or + // when we try to insert more than `u32::max_value()` events. + // + // We perform early return if we've reached the maximum capacity of the event list, + // so `Events` seems to be corrupted. Also, this has happened after the start of execution + // (since the event list is cleared at the block initialization). + if >::append(&[event]).is_err() { + // The most sensible thing to do here is to just ignore this event and wait until the + // new block. + return; + } + + let block_no = Self::block_number(); + for topic in topics { + // The same applies here. + if >::append(&(), topic, &[(block_no, event_idx)]).is_err() { + return; + } + } + } + + /// Gets the index of extrinsic that is currently executing. pub fn extrinsic_index() -> Option { storage::unhashed::get(well_known_keys::EXTRINSIC_INDEX) } @@ -381,19 +466,25 @@ impl Module { /// Start the execution of a particular block. pub fn initialize(number: &T::BlockNumber, parent_hash: &T::Hash, txs_root: &T::Hash) { - // populate environment. + // populate environment storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); >::put(number); >::put(parent_hash); >::insert(*number - One::one(), parent_hash); >::put(txs_root); - >::put(Self::calculate_random()); + >::mutate(|&mut(ref mut index, ref mut values)| if values.len() < 81 { + values.push(parent_hash.clone()) + } else { + values[*index as usize] = parent_hash.clone(); + *index = (*index + 1) % 81; + }); >::kill(); + >::kill(); + >::remove_prefix(&()); } /// Remove temporary "environment" entries in storage. pub fn finalize() -> T::Header { - >::kill(); >::kill(); >::kill(); @@ -402,48 +493,42 @@ impl Module { let mut digest = >::take(); let extrinsics_root = >::take(); let storage_root = T::Hashing::storage_root(); - let storage_changes_root = T::Hashing::storage_changes_root(parent_hash, number.as_() - 1); + let number_u64 = number.saturated_into::(); + let storage_changes_root = T::Hashing::storage_changes_root(parent_hash, number_u64 - 1); // we can't compute changes trie root earlier && put it to the Digest - // because it will include all currently existing temporaries + // because it will include all currently existing temporaries. if let Some(storage_changes_root) = storage_changes_root { let item = RawLog::ChangesTrieRoot(storage_changes_root); let item = ::Log::from(item).into(); digest.push(item); } - // > stays to be inspected by the client. + // The following fields + // + // - > + // - > + // - > + // + // stay to be inspected by the client and will be cleared by `Self::initialize`. ::new(number, extrinsics_root, storage_root, parent_hash, digest) } - /// Deposits a log and ensures it matches the blocks log data. + /// Deposits a log and ensures it matches the block's log data. pub fn deposit_log(item: ::Item) { let mut l = >::get(); traits::Digest::push(&mut l, item); >::put(l); } - /// Calculate the current block's random seed. - fn calculate_random() -> T::Hash { - assert!(Self::block_number() > Zero::zero(), "Block number may never be zero"); - (0..81) - .scan( - Self::block_number() - One::one(), - |c, _| { if *c > Zero::zero() { *c -= One::one() }; Some(*c) - }) - .map(Self::block_hash) - .triplet_mix() - } - /// Get the basic externalities for this module, useful for tests. #[cfg(any(feature = "std", test))] pub fn externalities() -> TestExternalities { TestExternalities::new(map![ twox_128(&>::key_for(T::BlockNumber::zero())).to_vec() => [69u8; 32].encode(), twox_128(>::key()).to_vec() => T::BlockNumber::one().encode(), - twox_128(>::key()).to_vec() => [69u8; 32].encode(), - twox_128(>::key()).to_vec() => T::Hash::default().encode() + twox_128(>::key()).to_vec() => [69u8; 32].encode() ]) } @@ -454,7 +539,7 @@ impl Module { >::put(n); } - /// Sets the index of extrinsic that is currenty executing. + /// Sets the index of extrinsic that is currently executing. #[cfg(any(feature = "std", test))] pub fn set_extrinsic_index(extrinsic_index: u32) { storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &extrinsic_index) @@ -467,11 +552,54 @@ impl Module { >::put(n); } - /// Set the random seed to something in particular. Can be used as an alternative to - /// `initialize` for tests that don't need to bother with the other environment entries. - #[cfg(any(feature = "std", test))] - pub fn set_random_seed(seed: T::Hash) { - >::put(seed); + /// Get the basic random seed. + /// + /// In general you won't want to use this, but rather `Self::random` which allows you to give a subject for the + /// random result and whose value will be independently low-influence random from any other such seeds. + pub fn random_seed() -> T::Hash { + Self::random(&[][..]) + } + + /// Get a low-influence "random" value. + /// + /// Being a deterministic block chain, real randomness is difficult to come by. This gives you something that + /// approximates it. `subject` is a context identifier and allows you to get a different result to other callers + /// of this function; use it like `random(&b"my context"[..])`. + /// + /// This is initially implemented through a low-influence "triplet mix" convolution of previous block hash values. + /// In the future it will be generated from a secure "VRF". + /// + /// ### Security Notes + /// This randomness uses a low-influence function, drawing upon the block hashes from the previous 81 blocks. Its + /// result for any given subject will be known in advance by the block producer of this block (and, indeed, anyone + /// who knows the block's `parent_hash`). However, it is mostly impossible for the producer of this block *alone* + /// to influence the value of this hash. A sizable minority of dishonest and coordinating block producers would be + /// required in order to affect this value. If that is an insufficient security guarantee then two things can be + /// used to improve this randomness: + /// - Name, in advance, the block number whose random value will be used; ensure your module retains a buffer of + /// previous random values for its subject and then index into these in order to obviate the ability of your user + /// to look up the parent hash and choose when to transact based upon it. + /// - Require your user to first commit to an additional value by first posting its hash. Require them to reveal + /// the value to determine the final result, hashing it with the output of this random function. This reduces the + /// ability of a cabal of block producers from conspiring against individuals. + /// + /// WARNING: Hashing the result of this function will remove any low-infleunce properties it has and mean that + /// all bits of the resulting value are entirely manipulatable by the author of the parent block, who can determine + /// the value of `parent_hash`. + pub fn random(subject: &[u8]) -> T::Hash { + let (index, hash_series) = >::get(); + if hash_series.len() > 0 { + // Always the case after block 1 is initialised. + hash_series.iter() + .cycle() + .skip(index as usize) + .take(81) + .enumerate() + .map(|(i, h)| (i as i8, subject, h).using_encoded(T::Hashing::hash)) + .triplet_mix() + } else { + T::Hash::default() + } } /// Increment a particular account's nonce by 1. @@ -482,7 +610,7 @@ impl Module { /// Note what the extrinsic data of the current extrinsic index is. If this is called, then /// ensure `derive_extrinsics` is also called before block-building is completed. /// - /// NOTE this function is called only when the block is being constructed locally. + /// NOTE: This function is called only when the block is being constructed locally. /// `execute_block` doesn't note any extrinsics. pub fn note_extrinsic(encoded_xt: Vec) { >::insert(Self::extrinsic_index().unwrap_or_default(), encoded_xt); @@ -509,7 +637,7 @@ impl Module { >::put(extrinsic_index); } - /// Remove all extrinsics data and save the extrinsics trie root. + /// Remove all extrinsic data and save the extrinsics trie root. pub fn derive_extrinsics() { let extrinsics = (0..>::get().unwrap_or_default()).map(>::take).collect(); let xts_root = extrinsics_data_root::(extrinsics); @@ -599,7 +727,16 @@ mod tests { System::note_finished_extrinsics(); System::deposit_event(1u16); System::finalize(); - assert_eq!(System::events(), vec![EventRecord { phase: Phase::Finalization, event: 1u16 }]); + assert_eq!( + System::events(), + vec![ + EventRecord { + phase: Phase::Finalization, + event: 1u16, + topics: vec![], + } + ] + ); System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into()); System::deposit_event(42u16); @@ -609,11 +746,71 @@ mod tests { System::deposit_event(3u16); System::finalize(); assert_eq!(System::events(), vec![ - EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16 }, - EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16 }, - EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16 }, - EventRecord { phase: Phase::Finalization, event: 3u16 } + EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16, topics: vec![] }, + EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16, topics: vec![] }, + EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16, topics: vec![] }, + EventRecord { phase: Phase::Finalization, event: 3u16, topics: vec![] } ]); }); } + + #[test] + fn deposit_event_topics() { + with_externalities(&mut new_test_ext(), || { + const BLOCK_NUMBER: u64 = 1; + + System::initialize(&BLOCK_NUMBER, &[0u8; 32].into(), &[0u8; 32].into()); + System::note_finished_extrinsics(); + + let topics = vec![ + H256::repeat_byte(1), + H256::repeat_byte(2), + H256::repeat_byte(3), + ]; + + // We deposit a few events with different sets of topics. + System::deposit_event_indexed(&topics[0..3], 1u16); + System::deposit_event_indexed(&topics[0..1], 2u16); + System::deposit_event_indexed(&topics[1..2], 3u16); + + System::finalize(); + + // Check that topics are reflected in the event record. + assert_eq!( + System::events(), + vec![ + EventRecord { + phase: Phase::Finalization, + event: 1u16, + topics: topics[0..3].to_vec(), + }, + EventRecord { + phase: Phase::Finalization, + event: 2u16, + topics: topics[0..1].to_vec(), + }, + EventRecord { + phase: Phase::Finalization, + event: 3u16, + topics: topics[1..2].to_vec(), + } + ] + ); + + // Check that the topic-events mapping reflects the deposited topics. + // Note that these are indexes of the events. + assert_eq!( + System::event_topics(&(), &topics[0]), + vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 1)], + ); + assert_eq!( + System::event_topics(&(), &topics[1]), + vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 2)], + ); + assert_eq!( + System::event_topics(&(), &topics[2]), + vec![(BLOCK_NUMBER, 0)], + ); + }); + } } diff --git a/srml/timestamp/Cargo.toml b/srml/timestamp/Cargo.toml index c86493890aaea9d6d2d53bdab905eec2b8d72c32..607a6d60d2860d70927394427bad523965dd144f 100644 --- a/srml/timestamp/Cargo.toml +++ b/srml/timestamp/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "srml-timestamp" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" serde = { version = "1.0", optional = true } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs index 6c7492c1dcf779ff96efaa3ea264a217e35173ff..24750215d1c04ebbb858ddd926bf38247ab81857 100644 --- a/srml/timestamp/src/lib.rs +++ b/srml/timestamp/src/lib.rs @@ -16,44 +16,50 @@ //! # Timestamp Module //! -//! The timestamp module provides functionality to get and set the on-chain time. -//! To use it in your module, you need to implement the timestamp [`Trait`]. -//! The supported dispatchable functions are documented as part of the [`Call`] enum. +//! The Timestamp module provides functionality to get and set the on-chain time. +//! +//! - [`timestamp::Trait`](./trait.Trait.html) +//! - [`Call`](./enum.Call.html) +//! - [`Module`](./struct.Module.html) //! //! ## Overview //! -//! The timestamp module allows the validators to set and validate a timestamp with each block. +//! The Timestamp module allows the validators to set and validate a timestamp with each block. //! -//! It uses inherents for timestamp data, which is provided by the block author and validated/verified by other validators. -//! The timestamp can be set only once per block and must be set each block. There could be a constraint on how much time must pass before setting the new timestamp. +//! It uses inherents for timestamp data, which is provided by the block author and validated/verified +//! by other validators. The timestamp can be set only once per block and must be set each block. +//! There could be a constraint on how much time must pass before setting the new timestamp. //! -//! **NOTE:** The timestamp module is the recommended way to query the on-chain time instead of using an approach based on block numbers. -//! The block numbers based time measurement can cause issues because of cummulative calculation errors and hence it should be avoided. +//! **NOTE:** The Timestamp module is the recommended way to query the on-chain time instead of using +//! an approach based on block numbers. The block number based time measurement can cause issues +//! because of cumulative calculation errors and hence should be avoided. //! //! ## Interface //! -//! ### Dispatchable functions ([`Call`]) +//! ### Dispatchable Functions //! //! * `set` - Sets the current time. //! -//! ### Public functions ([`Module`]) -//! -//! * `get` - Gets the current time for the current block. If this function is called prior the setting to timestamp, it will return the timestamp of the previous block. +//! ### Public functions //! +//! * `get` - Gets the current time for the current block. If this function is called prior to +//! setting the timestamp, it will return the timestamp of the previous block. //! * `minimum_period` - Gets the minimum (and advised) period between blocks for the chain. //! //! ## Usage //! -//! The following example shows how to use the timestamp module in your custom module to query the current timestamp. +//! The following example shows how to use the Timestamp module in your custom module to query the current timestamp. //! //! ### Prerequisites //! -//! Import the `timestamp` module in your custom module and derive the module configuration trait from the `timestamp` trait. +//! Import the Timestamp module into your custom module and derive the module configuration +//! trait from the timestamp trait. //! //! ### Get current timestamp //! -//! ```ignore -//! use support::{decl_module, dispatch::Result}; +//! ``` +//! use srml_support::{decl_module, dispatch::Result}; +//! # use srml_timestamp as timestamp; //! use system::ensure_signed; //! //! pub trait Trait: timestamp::Trait {} @@ -67,20 +73,21 @@ //! } //! } //! } +//! # fn main() {} //! ``` //! -//! ### Example from SRML +//! ### Example from the SRML //! -//! The [`Session` module](https://github.com/paritytech/substrate/blob/master/srml/session/src/lib.rs) uses the `timestamp` module for session management. +//! The [Session module](https://github.com/paritytech/substrate/blob/master/srml/session/src/lib.rs) uses +//! the Timestamp module for session management. //! //! ## Related Modules //! -//! * [`System`](https://crates.parity.io/srml_system/index.html) -//! * [`Session`](https://crates.parity.io/srml_session/index.html) -//! +//! * [Session](../srml_session/index.html) #![cfg_attr(not(feature = "std"), no_std)] +use rstd::{result, ops::{Mul, Div}, cmp}; use parity_codec::Encode; #[cfg(feature = "std")] use parity_codec::Decode; @@ -88,9 +95,8 @@ use parity_codec::Decode; use inherents::ProvideInherentData; use srml_support::{StorageValue, Parameter, decl_storage, decl_module}; use srml_support::for_each_tuple; -use runtime_primitives::traits::{As, SimpleArithmetic, Zero}; -use system::ensure_inherent; -use rstd::{result, ops::{Mul, Div}, cmp}; +use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; +use system::ensure_none; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; /// The identifier for the `timestamp` inherent. @@ -215,7 +221,7 @@ decl_module! { /// /// The dispatch origin for this call must be `Inherent`. fn set(origin, #[compact] now: T::Moment) { - ensure_inherent(origin)?; + ensure_none(origin)?; assert!(!::DidUpdate::exists(), "Timestamp must be updated only once in the block"); assert!( Self::now().is_zero() || now >= Self::now() + >::get(), @@ -246,7 +252,7 @@ decl_module! { decl_storage! { trait Store for Module as Timestamp { /// Current time for the current block. - pub Now get(now) build(|_| T::Moment::sa(0)): T::Moment; + pub Now get(now) build(|_| 0.into()): T::Moment; /// Old storage item provided for compatibility. Remove after all networks upgraded. // TODO: #2133 @@ -256,7 +262,7 @@ decl_storage! { /// that the block production apparatus provides. Your chosen consensus system will generally /// work with this to determine a sensible block time. e.g. For Aura, it will be double this /// period on default settings. - pub MinimumPeriod get(minimum_period) config(): T::Moment = T::Moment::sa(3); + pub MinimumPeriod get(minimum_period) config(): T::Moment = 3.into(); /// Did the timestamp get updated in this block? DidUpdate: bool; @@ -291,23 +297,25 @@ impl ProvideInherent for Module { const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; fn create_inherent(data: &InherentData) -> Option { - let data = extract_inherent_data(data).expect("Gets and decodes timestamp inherent data"); + let data: T::Moment = extract_inherent_data(data) + .expect("Gets and decodes timestamp inherent data") + .saturated_into(); - let next_time = cmp::max(As::sa(data), Self::now() + >::get()); + let next_time = cmp::max(data, Self::now() + >::get()); Some(Call::set(next_time.into())) } fn check_inherent(call: &Self::Call, data: &InherentData) -> result::Result<(), Self::Error> { const MAX_TIMESTAMP_DRIFT: u64 = 60; - let t = match call { - Call::set(ref t) => t.clone(), + let t: u64 = match call { + Call::set(ref t) => t.clone().saturated_into::(), _ => return Ok(()), - }.as_(); + }; let data = extract_inherent_data(data).map_err(|e| InherentError::Other(e))?; - let minimum = (Self::now() + >::get()).as_(); + let minimum = (Self::now() + >::get()).saturated_into::(); if t > data + MAX_TIMESTAMP_DRIFT { Err(InherentError::Other("Timestamp too far in future to accept".into())) } else if t < minimum { @@ -363,7 +371,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); assert_eq!(Timestamp::now(), 69); }); } @@ -378,8 +386,8 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - assert_ok!(Timestamp::dispatch(Call::set(69), Origin::INHERENT)); - let _ = Timestamp::dispatch(Call::set(70), Origin::INHERENT); + assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); + let _ = Timestamp::dispatch(Call::set(70), Origin::NONE); }); } @@ -393,7 +401,7 @@ mod tests { with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); - let _ = Timestamp::dispatch(Call::set(46), Origin::INHERENT); + let _ = Timestamp::dispatch(Call::set(46), Origin::NONE); }); } } diff --git a/srml/treasury/Cargo.toml b/srml/treasury/Cargo.toml index d4bbcf4f4f6124692ec3998fb338af59357d1a9f..68b0451caf857e04105936d34264582d2bdcf226 100644 --- a/srml/treasury/Cargo.toml +++ b/srml/treasury/Cargo.toml @@ -1,13 +1,11 @@ [package] name = "srml-treasury" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] -hex-literal = "0.1.0" -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true, features = ["derive"] } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } @@ -23,7 +21,6 @@ substrate-primitives = { path = "../../core/primitives" } default = ["std"] std = [ "serde", - "serde_derive", "parity-codec/std", "rstd/std", "runtime_primitives/std", diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs index b96928d7f8a85c38429d95ac00d4d5778008ab04..39253ac4d9b6e4dca30e1edc0ef52901f5d4f73b 100644 --- a/srml/treasury/src/lib.rs +++ b/srml/treasury/src/lib.rs @@ -14,16 +14,59 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! The Treasury: Keeps account of the taxed cash and handles its deployment. +//! # Treasury Module +//! +//! The `treasury` module keeps account of currency in a `pot` and manages the subsequent +//! deployment of these funds. +//! +//! ## Overview +//! +//! Funds for treasury are raised in two ways: +//! 1. By minting new tokens, leading to inflation, and +//! 2. By channeling tokens from transaction fees and slashing. +//! +//! Treasury funds can be used to pay for developers who provide software updates, +//! any changes decided by referenda, and to generally keep the system running smoothly. +//! +//! Treasury can be used with other modules, such as to tax validator rewards in the `staking` module. +//! +//! ### Implementations +//! +//! The treasury module provides an implementation for the following trait: +//! - `OnDilution` - Mint extra funds upon dilution; maintain the ratio of `portion` diluted to `total_issuance`. +//! +//! ## Interface +//! +//! ### Dispatchable Functions +//! +//! - `propose_spend` - Propose a spending proposal and stake a proposal deposit. +//! - `set_pot` - Set the spendable balance of funds. +//! - `configure` - Configure the module's proposal requirements. +//! - `reject_proposal` - Reject a proposal and slash the deposit. +//! - `approve_proposal` - Accept the proposal and return the deposit. +//! +//! Please refer to the [`Call`](./enum.Call.html) enum and its associated variants for documentation on each function. +//! +//! ### Public Functions +//! +//! See the [module](./struct.Module.html) for details on publicly available functions. +//! +//! ## Related Modules +//! +//! The treasury module depends on the `system` and `srml_support` modules as well as +//! Substrate Core libraries and the Rust standard library. +//! #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] -use serde_derive::{Serialize, Deserialize}; +use serde::{Serialize, Deserialize}; use rstd::prelude::*; use srml_support::{StorageValue, StorageMap, decl_module, decl_storage, decl_event, ensure}; use srml_support::traits::{Currency, ReservableCurrency, OnDilution, OnUnbalanced, Imbalance}; -use runtime_primitives::{Permill, traits::{Zero, EnsureOrigin, StaticLookup}}; +use runtime_primitives::{Permill, + traits::{Zero, EnsureOrigin, StaticLookup, Saturating, CheckedSub, CheckedMul} +}; use parity_codec::{Encode, Decode}; use system::ensure_signed; @@ -250,8 +293,12 @@ impl OnDilution> for Module { // pre dilution and post-dilution. if !minted.is_zero() && !portion.is_zero() { let total_issuance = T::Currency::total_issuance(); - let funding = (total_issuance - portion) / portion * minted; - >::mutate(|x| *x += funding); + if let Some(funding) = total_issuance.checked_sub(&portion) { + let funding = funding / portion; + if let Some(funding) = funding.checked_mul(&minted) { + >::mutate(|x| *x = x.saturating_add(funding)); + } + } } } } @@ -460,6 +507,35 @@ mod tests { }); } + #[test] + // Note: This test demonstrates that `on_dilution` does not increase the pot with good resolution + // with large amounts of the network staked. https://github.com/paritytech/substrate/issues/2579 + // A fix to 2579 should include a change of this test. + fn on_dilution_quantization_effects() { + with_externalities(&mut new_test_ext(), || { + // minted = 1% of total issuance for all cases + let _ = Treasury::set_pot(0); + assert_eq!(Balances::total_issuance(), 200); + + Treasury::on_dilution(2, 66); // portion = 33% of total issuance + assert_eq!(Treasury::pot(), 4); // should increase by 4 (200 - 66) / 66 * 2 + + Treasury::on_dilution(2, 67); // portion = 33+eps% of total issuance + assert_eq!(Treasury::pot(), 6); // should increase by 2 (200 - 67) / 67 * 2 + + Treasury::on_dilution(2, 100); // portion = 50% of total issuance + assert_eq!(Treasury::pot(), 8); // should increase by 2 (200 - 100) / 100 * 2 + + // If any more than 50% of the network is staked (i.e. (2 * portion) > total_issuance) + // then the pot will not increase. + Treasury::on_dilution(2, 101); // portion = 50+eps% of total issuance + assert_eq!(Treasury::pot(), 8); // should increase by 0 (200 - 101) / 101 * 2 + + Treasury::on_dilution(2, 134); // portion = 67% of total issuance + assert_eq!(Treasury::pot(), 8); // should increase by 0 (200 - 134) / 134 * 2 + }); + } + #[test] fn pot_underflow_should_not_diminish() { with_externalities(&mut new_test_ext(), || { diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index 12ae7bdbbe0e23ae58cc5493dc2feb5c88da4893..5f043e9486c5bc5d6231fca57808eb5dbfebb4e1 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -1,11 +1,14 @@ [package] name = "subkey" -version = "1.0.0" +version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" [dependencies] substrate-primitives = { version = "*", path = "../core/primitives" } +node-runtime = { version = "*", path = "../node/runtime" } +node-primitives = { version = "*", path = "../node/primitives" } +sr-primitives = { version = "*", path = "../core/sr-primitives" } rand = "0.6" clap = { version = "~2.32", features = ["yaml"] } tiny-bip39 = "0.6.0" @@ -13,6 +16,8 @@ rustc-hex = "2.0" substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39" } schnorrkel = "0.1" hex = "0.3" +hex-literal = "0.2" +parity-codec = "3.2" [features] bench = [] diff --git a/subkey/README.adoc b/subkey/README.adoc index 7fe194eb82b701e0821391eacb465f89454f8add..52770e78ec4432778a5683bd140e25005b877a96 100644 --- a/subkey/README.adoc +++ b/subkey/README.adoc @@ -53,3 +53,18 @@ You can use the included vanity generator to find a seed that provides an addres ```bash subkey vanity 1337 ``` + +=== Signing a transaction + +Sign a transaction from an encoded `Call`. + +```bash +subkey sign-transaction \ + --call \ + --nonce 0 \ + --suri \ + --password \ + --prior-block-hash +``` + +Will output a signed and encoded `UncheckedMortalCompactExtrinsic` as hex. diff --git a/subkey/src/cli.yml b/subkey/src/cli.yml index cc131703eb8df23b4d7599b258c5f0971cb71f7a..eedd4757375f406a95c617c08c7d5ba92f121670 100644 --- a/subkey/src/cli.yml +++ b/subkey/src/cli.yml @@ -40,6 +40,30 @@ subcommands: long: hex help: The message on STDIN is hex-encoded data takes_value: false + - transfer: + about: Author and sign a Node balances::Transfer transaction with a given (secret) key + args: + - from: + index: 1 + required: true + help: The signing secret key URI. + - to: + index: 2 + required: true + help: The destination account public key URI. + - amount: + index: 3 + required: true + help: The number of units to transfer. + - index: + index: 4 + required: true + help: The signing account's transaction index. + - genesis: + short: g + long: genesis + help: The genesis hash or a recognised chain identifier (dev, elm, alex). + takes_value: true - verify: about: Verify a signature for a message, provided on STDIN, with a given (public or secret) key args: @@ -68,3 +92,36 @@ subcommands: help: Number of keys to generate takes_value: true default_value: "1" + - sign-transaction: + about: Sign transaction from encoded Call. Returns a signed and encoded UncheckedMortalCompactExtrinsic as hex. + args: + - call: + short: c + long: call + help: The call, hex-encoded. + takes_value: true + required: true + - nonce: + short: n + long: nonce + help: The nonce. + takes_value: true + required: true + - suri: + long: suri + short: s + help: The secret key URI. + takes_value: true + required: true + - password: + short: p + long: password + takes_value: true + help: The password for the key. + required: true + - prior-block-hash: + short: h + long: prior-block-hash + help: The prior block hash, hex-encoded. + takes_value: true + required: true diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 5caf58d45ba14cda8e06f133ce4bd3744e46755c..1b9afb8cd7d83e0de992750759bd38c9deda7a97 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -18,16 +18,18 @@ #[cfg(feature = "bench")] extern crate test; -extern crate substrate_bip39; -extern crate rustc_hex; - use std::io::{stdin, Read}; +use hex_literal::hex; use clap::load_yaml; use rand::{RngCore, rngs::OsRng}; use substrate_bip39::mini_secret_from_entropy; use bip39::{Mnemonic, Language, MnemonicType}; -use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, crypto::Ss58Codec}; +use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, crypto::Ss58Codec, blake2_256}; +use parity_codec::{Encode, Decode, Compact}; +use sr_primitives::generic::Era; use schnorrkel::keys::MiniSecretKey; +use node_primitives::{Balance, Index, Hash}; +use node_runtime::{Call, UncheckedExtrinsic, BalancesCall}; mod vanity; @@ -173,6 +175,96 @@ fn execute>(matches: clap::ArgMatches) where let sig = pair.sign(&message); println!("{}", hex::encode(&sig)); } + ("transfer", Some(matches)) => { + let signer = matches.value_of("from") + .expect("parameter is required; thus it can't be None; qed"); + let signer = Sr25519::pair_from_suri(signer, password); + + let to = matches.value_of("to") + .expect("parameter is required; thus it can't be None; qed"); + let to = sr25519::Public::from_string(to).ok().or_else(|| + sr25519::Pair::from_string(to, password).ok().map(|p| p.public()) + ).expect("Invalid 'to' URI; expecting either a secret URI or a public URI."); + + let amount = matches.value_of("amount") + .expect("parameter is required; thus it can't be None; qed"); + let amount = str::parse::(amount) + .expect("Invalid 'amount' parameter; expecting an integer."); + + let index = matches.value_of("index") + .expect("parameter is required; thus it can't be None; qed"); + let index = str::parse::(index) + .expect("Invalid 'amount' parameter; expecting an integer."); + + let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); + + let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") { + "elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(), + "alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(), + h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])).expect("Invalid genesis hash or unrecognised chain identifier"), + }; + + println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref())); + + let era = Era::immortal(); + let raw_payload = (Compact(index), function, era, genesis_hash); + let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { + signer.sign(&blake2_256(payload)[..]) + } else { + println!("Signing {}", HexDisplay::from(&payload)); + signer.sign(payload) + }); + let extrinsic = UncheckedExtrinsic::new_signed( + index, + raw_payload.1, + signer.public().into(), + signature.into(), + era, + ); + println!("0x{}", hex::encode(&extrinsic.encode())); + } + ("sign-transaction", Some(matches)) => { + let s = matches.value_of("suri") + .expect("secret URI parameter is required; thus it can't be None; qed"); + let signer = Sr25519::pair_from_suri(s, password); + + let index = matches.value_of("nonce") + .expect("nonce is required; thus it can't be None; qed"); + let index = str::parse::(index) + .expect("Invalid 'index' parameter; expecting an integer."); + + let call = matches.value_of("call") + .expect("call is required; thus it can't be None; qed"); + let function: Call = hex::decode(&call).ok() + .and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + + let h = matches.value_of("prior-block-hash") + .expect("prior-block-hash is required; thus it can't be None; qed"); + let prior_block_hash: Hash = hex::decode(h).ok() + .and_then(|x| Decode::decode(&mut &x[..])) + .expect("Invalid prior block hash"); + + let era = Era::immortal(); + + let raw_payload = (Compact(index), function, era, prior_block_hash); + let signature = raw_payload.using_encoded(|payload| + if payload.len() > 256 { + signer.sign(&blake2_256(payload)[..]) + } else { + signer.sign(payload) + } + ); + + let extrinsic = UncheckedExtrinsic::new_signed( + index, + raw_payload.1, + signer.public().into(), + signature.into(), + era, + ); + + println!("0x{}", hex::encode(&extrinsic.encode())); + } ("verify", Some(matches)) => { let sig_data = matches.value_of("sig") .expect("signature parameter is required; thus it can't be None; qed"); @@ -218,3 +310,22 @@ fn main() { fn print_usage(matches: &clap::ArgMatches) { println!("{}", matches.usage()); } + +#[cfg(test)] +mod tests { + use super::{Hash, Decode}; + #[test] + fn should_work() { + let s = "0123456789012345678901234567890123456789012345678901234567890123"; + + let d1: Hash = hex::decode(s).ok().and_then(|x| Decode::decode(&mut &x[..])).unwrap(); + + let d2: Hash = { + let mut gh: [u8; 32] = Default::default(); + gh.copy_from_slice(hex::decode(s).unwrap().as_ref()); + Hash::from(gh) + }; + + assert_eq!(d1, d2); + } +} diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs index 785eb95aa5b203ac5c53e62abea30b6c090259ae..400b3bae82a385d25400eb5f98e5b2c5e138c2b3 100644 --- a/subkey/src/vanity.rs +++ b/subkey/src/vanity.rs @@ -105,7 +105,7 @@ pub(super) fn generate_key>(desired: &str) -> Result" "checksum kvdb-rocksdb 0.1.4 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" -"checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" -"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" +"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" +"checksum libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)" = "c6785aa7dd976f5fbf3b71cfd9cd49d7f783c1ff565a858d71031c6c313aa5c6" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" -"checksum libp2p 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ef2cce57e82d0decdf5464e4e179a319ee14c218c330bb017f62453f4ab74842" -"checksum libp2p-core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "26977e332e88c070353864d5ed72b6e1175fc1c63af5709b5174877836a229b6" -"checksum libp2p-core-derive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a88f076f3f60f3f407ce4fc0f620e3592125461bec5aa4895316e1f0414b3ea" -"checksum libp2p-dns 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f7ad92f9711efece48bb7ce30e3f1e662cd3524dc5d9f96b8f68b6e4e7cde96" -"checksum libp2p-floodsub 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4feda0ff3afcf84dfee9ea088835293829d199a34491d7f0990a4ccfd627816c" -"checksum libp2p-identify 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "548f9180101bd5846f4f60e060a00032ba3671a77fc735c48a85b7d1016d28ef" -"checksum libp2p-kad 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "91c28bf179a22fd1bfa3bad28ed86b8657ed2d193b76caa6f632ea83356d3a40" -"checksum libp2p-mdns 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1bbcb82063545605abf697967d919d418b1725f7d3688973fa26c98f81e8cda8" -"checksum libp2p-mplex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9406ea58ce4fef47820f7d2d6aa62b7e42b4972c30cc87de577d4da40852d4b1" -"checksum libp2p-ping 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c1ca7b60c2edb0cae7f9db56fbe6c21ca6960e96ec92cd1ed265ac06db24a1fe" -"checksum libp2p-plaintext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84bdbdd4700d5edea10214e4733ab5ac5be87862bac8a9b259c987bc9c15004" -"checksum libp2p-ratelimit 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d3001ea6afed5ccd1e5934715aa388b60b23e7587117db36b89d697e8ea43ff3" -"checksum libp2p-secio 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc2bee2dce0d0d054d81447b06f7e923f1a98e6b240e42674e0fdf2e4a4924f" -"checksum libp2p-tcp 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fcb2bcb9402f5fe42441dd4558306ff83a28624f67c6066bdbaa98928c180e3" -"checksum libp2p-uds 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3e88ac8f419f8d9487aaee9ef8785f592b37d78067c6764fe0adc1874a72c6c" -"checksum libp2p-websocket 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b60b65b8d7053220a0c78a09eda0a162db410067639d2b24432a9f1dc06230" -"checksum libp2p-yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71b4fd69a1c038152d017366d759177e2580fb4fbb56ce65429a642e011a07b1" -"checksum librocksdb-sys 5.14.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b9024327233e7fac7982440f73301c00046d438c5b1011e8f4e394226ce19007" +"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" +"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" +"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" +"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" +"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" +"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" +"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" +"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" +"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" +"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" +"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" +"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" +"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" +"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" +"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" +"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" +"checksum libp2p-websocket 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81692c3141a9aefd84f4faffdc93985af3858ef82ed7fe8185e6b27437b36183" +"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19778314deaa7048f2ea7d07b8aa12e1c227acebe975a37eeab6d2f8c74e41b" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" -"checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" -"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" -"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" +"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" +"checksum linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" +"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" -"checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" -"checksum make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8ca8afbe8af1785e09636acb5a41e08a765f5f0340568716c18a8700ba3c0d3" -"checksum mashup 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f2d82b34c7fb11bb41719465c060589e291d505ca4735ea30016a91f6fc79c3b" -"checksum mashup-impl 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "aa607bfb674b4efb310512527d64266b065de3f894fc52f84efcbf7eaa5965fb" +"checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16" +"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" +"checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum multistream-select 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "886fe7ba983a194afdd9074323171c8e313b2c145561da69464d5443f1a3d121" +"checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" -"checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" +"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" -"checksum nohash-hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "27593c72432b8cec9ae79e92792a73c38341064d525b6b612a9fccf8b7d17407" -"checksum nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b30adc557058ce00c9d0d7cb3c6e0b5bc6f36e2e2eabe74b0ba726d194abd588" +"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" +"checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" -"checksum once_cell 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "53075ac5dbd2798cfbcf9f710f2737de031d8076c192d8fe66fb23f639ccbdf4" -"checksum opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d620c9c26834b34f039489ac0dfdb12c7ac15ccaf818350a64c9b5334a452ad7" +"checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "5e1309181cdcbdb51bc3b6bedb33dfac2a83b3d585033d3f6d9e22e8c1928613" +"checksum openssl 0.10.22 (registry+https://github.com/rust-lang/crates.io-index)" = "a51f452b82d622fc8dd973d7266e9055ac64af25b957d9ced3989142dc61cb6b" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" +"checksum openssl-sys 0.9.46 (registry+https://github.com/rust-lang/crates.io-index)" = "05636e06b4f8762d4b81d24a351f3966f38bd25ccbcfd235606c91fdb82cc60f" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" +"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" -"checksum parity-codec 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88f69984317b736dceac3baa86600fc089856f69b44b07231f39b5648b02bcd4" -"checksum parity-codec-derive 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a58ba33211595f92cc2163ac583961d3dc767e656934146636b05256cc9acd7f" -"checksum parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8adf489acb31f1922db0ce43803b6f48a425241a8473611be3cc625a8e4a4c47" -"checksum parity-multiaddr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9a8e5d637787fe097ec1bfca2aa3eb687396518003df991c6c7216d86682d5ff" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" +"checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" +"checksum parity-crypto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1b9c063d87e1507cb3807493c8d21859ef23b5414b39f81c53f0ba267d64c1" +"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fec5048fba72a2e01baeb0d08089db79aead4b57e2443df172fb1840075a233" -"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" +"checksum pbkdf2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0c09cddfbfc98de7f76931acf44460972edb4023eb14d0c6d4018800e552d8e0" +"checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" +"checksum primitive-types 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99d5a5fe9d93ddb394e2fb3fc49d0e31acb475fd45a30eeb8f3e76b767ecb7e1" +"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "77997c53ae6edd6d187fec07ec41b207063b5ee6f33680e9fa86d405cdd313d4" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "671a9cce836bd3635b40b2b0a72783481755ee988c493891f4e974b45264cc9d" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc7badf647ae2fa27ba51c218e347386c88cc604fcfe71f2aba0ad017f3f2b75" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" -"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" -"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" -"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" -"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" -"checksum rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9d223d52ae411a33cf7e54ec6034ec165df296ccd23533d671a28252b6f66a" -"checksum rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "771b009e3a508cb67e8823dda454aaa5368c7bc1c16829fb77d3e980440dd34a" -"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" -"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" +"checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" +"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" -"checksum rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effa3fcaa47e18db002bdde6060944b6d2f9cfd8db471c30e873448ad9187be3" -"checksum rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "df7a791f788cb4c516f0e091301a29c2b71ef680db5e644a7d68835c8ae6dbfa" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +"checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" -"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" +"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2069749032ea3ec200ca51e4a31df41759190a88edca0d2d86ee8bedf7073341" -"checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" +"checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" +"checksum ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a" "checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" -"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" -"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" +"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" -"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "108ad7c3d65ba866ec50a224b7b3b0cb6c682c3d805015cea859d491232346a5" -"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" +"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" -"checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" -"checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" +"checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" +"checksum scrypt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8570c5e2fa69cb29d492fd4e9974b6b5facb5a888e1c6da630d4a3cd7ebfef4a" "checksum secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfaccd3a23619349e0878d9a241f34b1982343cdf67367058cd7d078d326b63e" -"checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0" -"checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf" +"checksum security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eee63d0f4a9ec776eeb30e220f0bc1e092c3ad744b2a379e3993070364d3adc2" +"checksum security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9636f8989cbf61385ae4824b98c1aaa54c994d7d8b41f11c601ed799f0549a56" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef" -"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c" -"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" +"checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" +"checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" -"checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" +"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" "checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" -"checksum slog-json 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddd14b8df2df39378b3e933c79784350bf715b11444d99f903df0253bbe524e5" -"checksum slog-scope 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "053344c94c0e2b22da6305efddb698d7c485809427cf40555dc936085f67a9df" -"checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" +"checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" +"checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" +"checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" +"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" +"checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" +"checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" -"checksum stdweb 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "22203527a18dc1c5c83bbd247fb005f5877d040783b6626571d6b7ed7a6f5e75" +"checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" +"checksum stdweb 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c34362bb10ac1a9439674795cc0e1bdcb0c46444c8fd4874ef39a01d9a8a8f24" "checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcbc9155af9606d44c740197d7d6672b49c4ee93a176c7cecde8b49322677604" -"checksum stdweb-internal-runtime 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b74fe9de4c0d07e91987f4d798b95f27f3cb7769fbc222fa951fa386908297b5" -"checksum stream-cipher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "30dc6118470d69ce0fdcf7e6f95e95853f7f4f72f80d835d4519577c323814ab" -"checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" +"checksum stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e68f7d08b76979a43e93fe043b66d2626e35d41d68b0b85519202c6dd8ac59fa" +"checksum stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d52317523542cc0af5b7e31017ad0f7d1e78da50455e38d5657cd17754f617da" +"checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" +"checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "41c4a2479a078509940d82773d90ff824a8c89533ab3b59cd3ce8b0c0e369c02" -"checksum structopt-derive 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "5352090cfae7a2c85e1a31146268b53396106c88ca5d6ccee2e3fae83b6e35c2" +"checksum structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3d0760c312538987d363c36c42339b55f5ee176ea8808bbe4543d484a291c8d1" +"checksum structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "528aeb7351d042e6ffbc2a6fb76a86f9b622fdf7c25932798e7a82cb03bc94c6" +"checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" +"checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7" -"checksum sysinfo 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c747a1fbe091faa7bf76c19f40099f9f12495384c811485d81cf3d60c0eae62" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" +"checksum sysinfo 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d88e417391431019773011a31a6c967538da388782b7711f2f6fafd9e601e55" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" -"checksum tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "55c1195ef8513f3273d55ff59fe5da6940287a0d7a98331254397f464833675b" +"checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" -"checksum tk-listen 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dec7ba6a80b7695fc2abb21af18bed445a362ffd80b64704771ce142d6d2151d" -"checksum tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6e93c78d23cc61aa245a8acd2c4a79c4d7fa7fb5c3ca90d5737029f043a84895" +"checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" +"checksum tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "cec6c34409089be085de9403ba2010b80e36938c9ca992c4f67f407bb13db0b1" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71" -"checksum tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f90fcd90952f0a496d438a976afba8e5c205fb12123f813d8ab3aa1c8436638c" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c117b6cf86bb730aab4834f10df96e4dd586eff2c3c27d3781348da49e255bde" -"checksum tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "60ae25f6b17d25116d2cba342083abe5255d3c2c79cb21ea11aa049c53bf7c75" -"checksum tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "7392fe0a70d5ce0c882c4778116c519bd5dbaa8a7c3ae3d04578b3afafdcda21" -"checksum tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4b26fd37f1125738b2170c80b551f69ff6fecb277e6e5ca885e53eec2b005018" -"checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" -"checksum tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3929aee321c9220ed838ed6c3928be7f9b69986b0e3c22c972a66dbf8a298c68" -"checksum tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3a52f00c97fedb6d535d27f65cccb7181c8dd4c6edc3eda9ea93f6d45d05168e" -"checksum tokio-tls 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e53fdbf3156f588be1676022fe794232b24922d426e8c14f4e46891c1e31c440" -"checksum tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "da941144b816d0dcda4db3a1ba87596e4df5e860a72b70783fe435891f80601c" -"checksum tokio-uds 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df195376b43508f01570bacc73e13a1de0854dc59e79d1ec09913e8db6dd2a70" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" +"checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" +"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" +"checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" +"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" +"checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" +"checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" +"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" -"checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" +"checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" +"checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum twofish 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eef327f05b0d0ec1b9d7d119d8f4d9f602ceee37e0540aff8071e8e66c2e22e" -"checksum twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f85be565a110ed72ed7048cf56570db04ce0a592c98aa59b7dacde3e5718750" +"checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" +"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" -"checksum ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f8bfa9ff0cadcd210129ad9d2c5f145c13e9ced3d3e5d948a6213487d52444" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +"checksum uint 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91bb295c2c53c54742a6b8acb705114f6dfdf3c42becdb146a662cb77fcc0d02" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" +"checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" +"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum unsigned-varint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb8abc4b7d8158bdfbbaaccc35331ed3c30c2673e99000d7ae665a2eb6576f4" +"checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" -"checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6" +"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" -"checksum websocket 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c9faed2bff8af2ea6b9f8b917d3d00b467583f6781fe3def174a9e33c879703" -"checksum which 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e84a603e7e0b1ce1aa1ee2b109c7be00155ce52df5081590d1ffb93f4f515cb2" +"checksum wasm-bindgen 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "546e4ab1bf7f9a3532d21472efd72d01a23f55abd885c60b165f393394dbad95" +"checksum wasm-bindgen-backend 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "7b84bedebfd6ae3522cce59dec6b52ee6c53ceeaae8541668c15b9f42df8ecab" +"checksum wasm-bindgen-futures 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)" = "c6fc76797785881eac82f72e9b676032a737dea717103878100dbf6106d8d2cb" +"checksum wasm-bindgen-macro 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "f2a033fc6bfd5e486a488b0e19d7d1bb29e667ebb91db85f698381a8aa831786" +"checksum wasm-bindgen-macro-support 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "fba68375ef8f095c4a169c093c95ed2e1b5e44f7872f3bcbcafe2c51b4a80480" +"checksum wasm-bindgen-shared 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "321949f4d7f7bf7a49dccd464bdc46581b180f761d9505e4943926d50b2a4a64" +"checksum wasm-bindgen-webidl 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c2c2b45b827f96657beea954a5430d37da4cf477d2874595f5f0a6ad027980" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)" = "47ad2ecfe3793a87a0aa49562ad6f01cb3af3c870213283bc60032ec8dd7e62a" +"checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" +"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" -"checksum yamux 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e25561b512df3c287cf52404cab0b07ea43d095cb96230e9e2cb635db72d75f0" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" +"checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" diff --git a/test-utils/chain-spec-builder/Cargo.toml b/test-utils/chain-spec-builder/Cargo.toml index 79290463da09965c67ace75f75cb72b8f5cbe027..a54094d8c7920b9a0be8b2a3176464d25f76099f 100644 --- a/test-utils/chain-spec-builder/Cargo.toml +++ b/test-utils/chain-spec-builder/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "chain-spec-builder" -version = "0.1.0" -authors = ["haydn dufrene "] +version = "2.0.0" +authors = ["Parity Technologies "] edition = "2018" [dependencies] diff --git a/test-utils/chain-spec-builder/src/main.rs b/test-utils/chain-spec-builder/src/main.rs index c7b4dd99d8ab28c760f37c543be55b0bc245ce52..211e8321e3fd1c409c64f8ee8f5d7cd16d9125e0 100644 --- a/test-utils/chain-spec-builder/src/main.rs +++ b/test-utils/chain-spec-builder/src/main.rs @@ -8,20 +8,24 @@ fn genesis_constructor() -> chain_spec::GenesisConfig { let matches = App::from_yaml(yaml).get_matches(); let authorities = matches.values_of("initial_authority_seed") .unwrap() - .map(chain_spec::get_authority_id_from_seed) + .map(chain_spec::get_authority_keys_from_seed) .collect(); let endowed_accounts = matches.values_of("endowed_account_seed") .unwrap() - .map(chain_spec::get_authority_id_from_seed) + .map(chain_spec::get_account_id_from_seed) .collect(); let sudo_key_seed = matches.value_of("sudo_key_seed").unwrap(); - let sudo_key = chain_spec::get_authority_id_from_seed(sudo_key_seed); + let sudo_key = chain_spec::get_account_id_from_seed(sudo_key_seed); + + let enable_println = true; + chain_spec::testnet_genesis( authorities, sudo_key.into(), Some(endowed_accounts), + enable_println, ) } @@ -34,6 +38,7 @@ fn generate_chain_spec() -> String { None, None, None, + None, ); build_spec(chain_spec, false).unwrap() }